|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995
//
// File: dinfoLevel.cxx
//
// Contents: Display and/or set vaious debug info levels
//
// Functions: infoLevelHelp
// displayInfoLevel
//
//
// History: 06-01-95 BruceMa Created
//
//
//--------------------------------------------------------------------------
#include <ole2int.h>
#include <windows.h>
#include "ole.h"
#include "dinfolvl.h"
#include "debnot.h"
void getArgument(LPSTR *lpArgumentString, LPSTR a); ULONG ScanAddr(char *lpsz);
static void initInfoLevels(PNTSD_EXTENSION_APIS lpExtensionApis); static BOOL parseVal(char *arg, ULONG *val);
STable1 debFlags[NUMDEBFLAGS] = {{"error", DEB_ERROR}, {"warn", DEB_WARN}, {"trace", DEB_TRACE}, {"dbgout", DEB_DBGOUT}, {"stdout", DEB_STDOUT}, {"ierror", DEB_IERROR}, {"iwarn", DEB_IWARN}, {"itrace", DEB_ITRACE}, {"user1", DEB_USER1}, {"user2", DEB_USER2}, {"user3", DEB_USER3}, {"user4", DEB_USER4}, {"user5", DEB_USER5}, {"user6", DEB_USER6}, {"user7", DEB_USER7}, {"user8", DEB_USER8}, {"user9", DEB_USER9}, {"user10", DEB_USER10}, {"user11", DEB_USER11}, {"user12", DEB_USER12}, {"user13", DEB_USER13}, {"user14", DEB_USER14}, {"user15", DEB_USER15}};
STable2 infoLevel[NUMINFOLEVELS] = {{"com", NULL, "ole32!_CairoleInfoLevel"}, {"dd", NULL, "ole32!_DDInfoLevel"}, {"hep", NULL, "ole32!_heapInfoLevel"}, {"hk", NULL, "ole32!_hkInfoLevel"}, {"int", NULL, "ole32!_intrInfoLevel"}, {"le", NULL, "ole32!_LEInfoLevel"}, {"mem", NULL, "ole32!_memInfoLevel"}, {"mnk", NULL, "ole32!_mnkInfoLevel"}, {"msf", NULL, "ole32!_msfInfoLevel"}, {"ol", NULL, "ole32!_olInfoLevel"}, {"ref", NULL, "ole32!_RefInfoLevel"}, {"sim", NULL, "ole32!_simpInfoLevel"}, {"stk", NULL, "ole32!_StackInfoLevel"}, {"usr", NULL, "ole32!_UserNdrInfoLevel"}}; //+-------------------------------------------------------------------------
//
// Function: infoLevelHelp
//
// Synopsis: Display a menu for the command 'id'
//
// Arguments: -
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
void infoLevelHelp(PNTSD_EXTENSION_APIS lpExtensionApis) { Printf("in - Display current value of all debug info levels\n"); Printf("in x - Display the current value of debug info level x\n"); Printf("in x y z ... - Set the value of debug info level x to\n"); Printf(" y | z | ... \n"); Printf("\nwhere x corresponds to:\n"); Printf(" --- --------------\n"); Printf(" com ole32!_CairoleInfoLevel\n"); Printf(" dd ole32!_DDInfoLevel\n"); Printf(" hep ole32!_heapInfoLevel\n"); Printf(" hk ole32!_hkInfoLevel\n"); Printf(" int ole32!_intrInfoLevel\n"); Printf(" le ole32!_LEInfoLevel\n"); Printf(" mem ole32!_memInfoLevel\n"); Printf(" mnk ole32!_mnkInfoLevel\n"); Printf(" msf ole32!_msfInfoLevel\n"); Printf(" ol ole32!_olInfoLevel\n"); Printf(" ref ole32!_RefInfoLevel\n"); Printf(" sim ole32!_simpInfoLevel\n"); Printf(" stk ole32!_StackInfoLevel\n"); Printf(" ndr ole32!_UserNdrInfoLevel\n"); Printf("\nand y... corresponds to:\n"); Printf(" ---- --------------\n"); Printf(" error DEB_ERROR\n"); Printf(" warn DEB_WARN\n"); Printf(" trace DEB_TRACE\n"); Printf(" dbgout DEB_DBGOUT\n"); Printf(" stdout DEB_STDOUT\n"); Printf(" ierror DEB_IERROR\n"); Printf(" iwarn DEB_IWARN\n"); Printf(" itrace DEB_ITRACE\n"); Printf(" user1 DEB_USER1\n"); Printf(" user2 DEB_USER2\n"); Printf(" user3 DEB_USER3\n"); Printf(" user4 DEB_USER4\n"); Printf(" user5 DEB_USER5\n"); Printf(" user6 DEB_USER6\n"); Printf(" user7 DEB_USER7\n"); Printf(" user8 DEB_USER8\n"); Printf(" user9 DEB_USER9\n"); Printf(" user10 DEB_USER10\n"); Printf(" user11 DEB_USER11\n"); Printf(" user12 DEB_USER12\n"); Printf(" user13 DEB_USER13\n"); Printf(" user14 DEB_USER14\n"); Printf(" user15 DEB_USER15\n"); Printf(" <hex>\n"); }
//+-------------------------------------------------------------------------
//
// Function: displayInfoLevel
//
// Synopsis: Display/set debug info levels
//
// Arguments: [hProcess] - Handle of this process
// [lpExtensionApis] - Table of extension functions
// [char *] - Command line argument(s)
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
void displayInfoLevel(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, LPSTR lpArgumentString) { Arg arg; UINT k; ULONG val; ULONG argVal; BOOL fSet = FALSE;
// Fetch the addresses for the various debug info levels
initInfoLevels(lpExtensionApis);
// Fetch the first argument
GetArg(arg); Printf("%s %s\n", arg, lpArgumentString); // If no argument simply display all info levels
if (!arg[0]) { for (k = 0; k < NUMINFOLEVELS; k++) { ReadMem(&val, infoLevel[k].adr, sizeof(ULONG)); Printf("%s\t%08x\n", infoLevel[k].name, val); }
return; }
// Check the info level name
for (k = 0; k < NUMINFOLEVELS; k++) { if (lstrcmp(arg, infoLevel[k].name) == 0) { break; } } if (k == NUMINFOLEVELS) { Printf("...unknown debug info level name\n"); return; }
// Scan any values to set
val = 0; for (GetArg(arg); *arg; GetArg(arg)) { if (!parseVal(arg, &argVal)) { Printf("...invalid flag expresson\n"); return; } val |= argVal; fSet = TRUE; }
// If only an info level name, then display its value
if (!fSet) { ReadMem(&val, infoLevel[k].adr, sizeof(ULONG)); Printf("%s\t%08x\n", infoLevel[k].name, val); return; }
// Otherwise we're setting an info level
WriteMem(infoLevel[k].adr, &val, sizeof(ULONG)); Printf("%s\t%08x\n", infoLevel[k].name, val); }
//+-------------------------------------------------------------------------
//
// Function: initInfoLevels
//
// Synopsis: Find the addresses of the various infolevels
//
// Arguments: -
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
static void initInfoLevels(PNTSD_EXTENSION_APIS lpExtensionApis) { // Check whether already initialized
if (infoLevel[0].adr != NULL) { return; }
// Do over the info levels
for (UINT k = 0; k < NUMINFOLEVELS; k++) { infoLevel[k].adr = GetExpression(infoLevel[k].symbol); } }
//+-------------------------------------------------------------------------
//
// Function: parseVal
//
// Synopsis: Parse the next flag expression on the command line
//
// Arguments: [char *] - Command line
// [ULONG *] - Where to return the parsed value
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
static BOOL parseVal(char *arg, ULONG *val) { UINT k;
// Check whether it's a flag name
for (k = 0; k < NUMDEBFLAGS; k++) { if (lstrcmp(arg, debFlags[k].name) == 0) { *val = debFlags[k].flag; return TRUE; } }
// It's not so it better be hex
k = 0; if (arg[0] == '0' && arg[1] == 'x') { k += 2; } while (arg[k]) { if (!(('0' <= arg[k] && arg[k] <= '9') || ('a' <= arg[k] && arg[k] <= 'f'))) { return FALSE; } k++; } *val = ScanAddr(arg); return TRUE; }
|