summaryrefslogblamecommitdiffstats
path: root/private/ole32/dbgexts/doxid.cxx
blob: 44ef0f63741c84be3ae7c1766db9ad5be65191c1 (plain) (tree)




































































































































































































































































                                                                                                     
//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1995
//
//  File:       doxid.cxx
//
//  Contents:   Ole NTSD extension routines to display COXID table
//
//  Functions:  oxidHelp
//              displayOxid
//
//
//  History:    21-Aug-95 BruceMa    Created
//
//
//--------------------------------------------------------------------------


#include <ole2int.h>
#include <windows.h>
#include "ole.h"
#include "dipid.h"


void FormatCLSID(REFGUID rguid, LPSTR lpsz);
BOOL ScanCLSID(LPSTR lpsz, CLSID *pClsid);
ULONG ScanAddr(char *lpsz);



static char *aszProtSeq[] = {/* 0x00 */ 0,
                             /* 0x01 */ "mswmsg",
                             /* 0x02 */ 0,
                             /* 0x03 */ 0,
                             /* 0x04 */ "ncacn_dnet_dsp",
                             /* 0x05 */ 0,
                             /* 0x06 */ 0,
                             /* 0x07 */ "ncacn_ip_tcp",
                             /* 0x08 */ "ncadg_ip_udp",
                             /* 0x09 */ "ncacn_nb_tcp",
                             /* 0x0a */ 0,
                             /* 0x0b */ 0,
                             /* 0x0c */ "ncacn_spx",
                             /* 0x0d */ "ncacn_nb_ipx",
                             /* 0x0e */ "ncadg_ipx",
                             /* 0x0f */ "ncacn_np",
                             /* 0x10 */ "ncalrpc",
                             /* 0x11 */ 0,
                             /* 0x12 */ 0,
                             /* 0x13 */ "ncacn_nb_nb"};





//+-------------------------------------------------------------------------
//
//  Function:   oxidHelp
//
//  Synopsis:   Display a menu for the command 'id'
//
//  Arguments:  -
//
//  Returns:    -
//
//  History:    21-Aug-95   BruceMa    Created
//
//--------------------------------------------------------------------------
void oxidHelp(PNTSD_EXTENSION_APIS lpExtensionApis)
{
    Printf("\nox       - Display entire OXID table:\n");
    Printf("addr oxid\n");
    Printf("...\n\n");
    Printf("ox addr    - Display specific OXID entry:\n");
    Printf("oxid serverPid serverTid flags hRpc IRemUnknown* runDownIPID refs stringBindings\n");
}






//+-------------------------------------------------------------------------
//
//  Function:   displayOxid
//
//  Synopsis:   Display the entire OXID table
//
//  Arguments:  [hProcess]        -       Handle of this process
//              [lpExtensionApis] -       Table of extension functions
//
//  Returns:    -
//
//  History:    21-Aug-95   BruceMa    Created
//
//--------------------------------------------------------------------------
void displayOxid(HANDLE hProcess,
                  PNTSD_EXTENSION_APIS lpExtensionApis)
{
    ULONG        pAdr;
    SOXIDEntry  *pOXIDentry;
    SOXIDEntry  *pFirstOXIDentry;
    SOXIDEntry   sOXIDentry;
    char         szGuid[CLSIDSTR_MAX];
    STRINGARRAY *pBindings;
    ULONG        ulSize;


    // Read the address of the first in use OXID entry
    pAdr = GetExpression("ole32!COXIDTable___InUseHead");
    pFirstOXIDentry = (SOXIDEntry *) pAdr;
    ReadMem(&pOXIDentry, pAdr + sizeof(ULONG), sizeof(SOXIDEntry *));

    // Do over in use OXID entries
    do
    {
        // Read the next OXID entry
        ReadMem(&sOXIDentry, pOXIDentry, sizeof(SOXIDEntry));

        // Print the address
        Printf("%x ", pOXIDentry);

        // Print the OXID
        FormatCLSID((GUID &) sOXIDentry.oxid, szGuid);
        Printf("%s\n", szGuid);
        
        // Go to the next in use OXID entry
        pOXIDentry = sOXIDentry.pNext;

        // Just in case
        if (CheckControlC())
        {
            return;
        }
    } until_(pOXIDentry == pFirstOXIDentry);
}






//+-------------------------------------------------------------------------
//
//  Function:   displayOxidEntry
//
//  Synopsis:   Display an entry in the OXID table
//
//  Arguments:  [hProcess]        -       Handle of this process
//              [lpExtensionApis] -       Table of extension functions
//              [arg]             -       OXID of entry to display
//
//  Returns:    -
//
//  History:    21-Aug-95   BruceMa    Created
//
//--------------------------------------------------------------------------
void displayOxidEntry(HANDLE hProcess,
                      PNTSD_EXTENSION_APIS lpExtensionApis,
                      char *arg)
{
    OXID         oxid;
    ULONG        pAdr;
    SOXIDEntry  *pOXIDentry;
    SOXIDEntry  *pFirstOXIDentry;
    SOXIDEntry   sOXIDentry;
    char         szGuid[CLSIDSTR_MAX];
    STRINGARRAY *pBindings;
    ULONG        ulSize;


    // Check for help
    if (arg[0] == '?')
    {
        Printf("oxid serverPid serverTid flags hRpc IRemUnknown* runDownIPID refs stringBindings\n");
        return;
    }

    // Convert the argument to an OXID
    pAdr = ScanAddr(arg);
    
    // Read the OXID entry
    ReadMem(&sOXIDentry, pAdr, sizeof(SOXIDEntry));

    // OXID
    FormatCLSID((GUID &) sOXIDentry.oxid, szGuid);
    Printf("%s ", szGuid);
        
    // Server PID
    Printf("%3x ", sOXIDentry.dwPid);
            
    // Server TID
    Printf("%3x ", sOXIDentry.dwTid);
    
    // Flags
    if (sOXIDentry.dwFlags & OXIDF_REGISTERED)
    {
        Printf("R");
    }
    if (sOXIDentry.dwFlags & OXIDF_MACHINE_LOCAL)
    {
        Printf("L");
    }
    if (sOXIDentry.dwFlags & OXIDF_STOPPED)
    {
        Printf("S");
    }
    if (sOXIDentry.dwFlags & OXIDF_PENDINGRELEASE)
    {
        Printf("P");
    }
    Printf(" ");
    
    // RPC binding handle
    Printf("%x ", sOXIDentry.hServer);

    // Proxy for RemUnknown
    Printf("%x ", sOXIDentry.pRU);

    // IPID of IRunDown and Remote Unknown
    Printf("[%d.%d %3x %3x %d] ",
           sOXIDentry.ipidRundown.page,
           sOXIDentry.ipidRundown.offset,
           sOXIDentry.ipidRundown.pid,
           sOXIDentry.ipidRundown.tid,
           sOXIDentry.ipidRundown.seq);

    // References
    Printf("%d\n ", sOXIDentry.cRefs);
            
    // Print the string bindings
    ReadMem(&ulSize, sOXIDentry.psa, sizeof(ULONG));
    pBindings = (STRINGARRAY *) OleAlloc(ulSize * sizeof(WCHAR));
    ReadMem(pBindings, sOXIDentry.psa, ulSize * sizeof(WCHAR));
    
    // Do over protocol sequence/network address pairs
    for (UINT k = 0; k < ulSize - 2  ||
         pBindings->awszStringArray[k] == 0; )
    {
        char *pszProtSeq;
        
        // The protocol sequence
        pszProtSeq = aszProtSeq[pBindings->awszStringArray[k]];
        if (pszProtSeq == NULL)
        {
            Printf("%d", pBindings->awszStringArray[k]);
        }
        else
        {
            Printf("%s", pszProtSeq);
        }
        k++;
        
        // The network address
        Printf("%ws ", &pBindings->awszStringArray[k]);
        k += lstrlenW(&pBindings->awszStringArray[k]) + 1;
    }
    Printf("\n");
    OleFree(pBindings);
}