summaryrefslogblamecommitdiffstats
path: root/private/ole32/dbgexts/dinfolvl.cxx
blob: 5b4644215e38da1289310321593ac27b487b3b0e (plain) (tree)































































































































































































































































































































                                                                                
//+-------------------------------------------------------------------------
//
//  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;
}