windows-nt/Source/XPSP1/NT/com/ole32/dbgexts/doxid.cxx
2020-09-26 16:20:57 +08:00

262 lines
6.8 KiB
C++

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