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

342 lines
8.8 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995
//
// File: dipid.cxx
//
// Contents: Ole NTSD extension routines to display CIPID table
//
// Functions: ipidHelp
// displayIpid
//
//
// 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 GetRegistryInterfaceName(REFIID iid, char *szValue, DWORD *pcbValue);
ULONG ScanAddr(char *lpsz);
//+-------------------------------------------------------------------------
//
// Function: ipidHelp
//
// Synopsis: Display a menu for the command 'id'
//
// Arguments: -
//
// Returns: -
//
// History: 21-Aug-95 BruceMa Created
//
//--------------------------------------------------------------------------
void ipidHelp(PNTSD_EXTENSION_APIS lpExtensionApis)
{
Printf("\nip - Display entire IPID table:\n");
Printf("index IPID oxidAddr nextIPIDsameObj\n");
Printf("...\n\n");
Printf("ip ipid - Display specific IPID entry:\n");
Printf("PID TID seq IID ChnlBfr* prxy/stub realPv oxidAddr flags strongRefs weakRefs nextIPIDsameObj\n");
}
//+-------------------------------------------------------------------------
//
// Function: displayIpid
//
// Synopsis: Display the entire IPID table
//
// Arguments: [hProcess] - Handle of this process
// [lpExtensionApis] - Table of extension functions
//
// Returns: -
//
// History: 21-Aug-95 BruceMa Created
//
//--------------------------------------------------------------------------
void displayIpid(HANDLE hProcess,
PNTSD_EXTENSION_APIS lpExtensionApis)
{
ULONG pAdr;
ULONG pStart;
ULONG pEnd;
UINT cPages;
SIPIDEntry **pIndexTable;
SIPIDEntry sIPIDentry[IPIDsPerPage];
SOXIDEntry sOXIDentry;
char szGuid[CLSIDSTR_MAX];
// Read the IPID page index table
pAdr = GetExpression("ole32!CIPIDTable___pTbl");
ReadMem(&pStart, pAdr, sizeof(SIPIDEntry **));
pAdr = GetExpression("ole32!CIPIDTable___pTblEnd");
ReadMem(&pEnd, pAdr, sizeof(SIPIDEntry **));
cPages = (pEnd - pStart) / sizeof(SIPIDEntry **);
pIndexTable = (SIPIDEntry **) OleAlloc(cPages * sizeof(SIPIDEntry *));
ReadMem(pIndexTable, pStart, cPages * sizeof(SIPIDEntry *));
// Do over IPID entry pages
for (UINT k = 0; k < cPages; k++)
{
// Read the next page of IPID entries
ReadMem(sIPIDentry, pIndexTable[k], IPIDTBL_PAGESIZE);
// Do over entries within this page
for (UINT j = 0; j < IPIDsPerPage; j++)
{
// Only look at non-vacant entries
if (!(sIPIDentry[j].dwFlags & IPIDF_VACANT))
{
// Print the page/offset for this entry
Printf("%d.%d ", k, j);
// Print the IPID
if (sIPIDentry[j].ipid.page > 1000 ||
sIPIDentry[j].ipid.page < 0)
{
FormatCLSID((GUID &) sIPIDentry[j].ipid, szGuid);
Printf("%s ", szGuid);
}
else
{
Printf("[%d.%d %3x %3x %d] ",
sIPIDentry[j].ipid.page,
sIPIDentry[j].ipid.offset,
sIPIDentry[j].ipid.pid,
sIPIDentry[j].ipid.tid,
sIPIDentry[j].ipid.seq);
}
// Print the associated OXID addr
Printf("%x ", sIPIDentry[j].pOXIDEntry);
// Next IPID for this object
if (sIPIDentry[j].iNextOID != -1)
{
Printf("%d.%d\n",
sIPIDentry[j].iNextOID >> 16,
sIPIDentry[j].iNextOID & 0xffff);
}
else
{
Printf("NULL\n");
}
}
}
}
// Release resources
OleFree(pIndexTable);
}
//+-------------------------------------------------------------------------
//
// Function: displayIpidEntry
//
// Synopsis: Display an entry in the IPID table
//
// Arguments: [hProcess] - Handle of this process
// [lpExtensionApis] - Table of extension functions
// [arg] - IPID of entry to display
//
// Returns: -
//
// History: 21-Aug-95 BruceMa Created
//
//--------------------------------------------------------------------------
void displayIpidEntry(HANDLE hProcess,
PNTSD_EXTENSION_APIS lpExtensionApis,
char *arg)
{
char *s;
IPID ipid;
ULONG ppIPIDentry;;
SIPIDEntry *pIPIDentry;
SIPIDEntry sIPIDentry;
char szGuid[CLSIDSTR_MAX];
SOXIDEntry sOXID;
// Check for help
if (arg[0] == '?')
{
Printf("PID TID seq IID ChnlBfr* prxy/stub realPv oxidAddr flags strongRefs weakRefs nextIPIDsameObj\n");
return;
}
// arg may be either page.offset or a hex address
BOOL fAdr = TRUE;
for (s = arg; *s; s++)
{
if (*s == '.')
{
fAdr = FALSE;
}
}
// The argument is a hex address
if (fAdr)
{
pIPIDentry = (SIPIDEntry *) ScanAddr(arg);
}
// The argment has the form page.offset
else
{
// Make sure the argument looks like an IPID
BOOL fOk = TRUE;
UINT cPoint = 0;
if (!IsDecimal(arg[0]))
{
fOk = FALSE;
}
for (s = arg; *s; s++)
{
if (*s != '.' && !IsDecimal(*s))
{
fOk = FALSE;
}
if (*s == '.')
{
cPoint++;
}
}
if (!IsDecimal(*(s - 1)))
{
fOk = FALSE;
}
if (!(fOk && cPoint == 1))
{
Printf("...%s is not an IPID\n", arg);
return;
}
// Convert the argument to an IPID
for (ipid.page = 0; *arg && *arg != '.'; arg++)
{
ipid.page = 10 * ipid.page + *arg - '0';
}
for (arg++, ipid.offset = 0; *arg; arg++)
{
ipid.offset = 10 * ipid.offset + *arg - '0';
}
// Read the address of the page containing the entry we want
ppIPIDentry = GetExpression("ole32!CIPIDTable___pTbl");
ReadMem(&ppIPIDentry, ppIPIDentry, sizeof(SIPIDEntry **));
ppIPIDentry += ipid.page * sizeof(SIPIDEntry **);
ReadMem(&pIPIDentry, ppIPIDentry, sizeof(SIPIDEntry *));
// Compute the address of the entry we're seeking
pIPIDentry += ipid.offset;
}
// Now read the entry
ReadMem(&sIPIDentry, pIPIDentry, sizeof(SIPIDEntry));
// Check whether the entry is vacant
if (sIPIDentry.dwFlags & IPIDF_VACANT)
{
Printf("VACANT\n");
return;
}
// The ipid may just be a GUID; e.g. client side scm interfaces
if (sIPIDentry.ipid.page >> 1000 || sIPIDentry.ipid.page < 0)
{
FormatCLSID((GUID &) sIPIDentry.ipid, szGuid);
Printf("%s ", szGuid);
}
else
{
// Server PID
Printf("%3x ", sIPIDentry.ipid.pid);
// Server TID
Printf("%3x ", sIPIDentry.ipid.tid);
// Sequence number
Printf("%d ", sIPIDentry.ipid.seq);
}
// IID
DWORD cbValue;
if (!GetRegistryInterfaceName(sIPIDentry.iid, szGuid, &cbValue))
{
FormatCLSID(sIPIDentry.iid, szGuid);
}
Printf("%s ", szGuid);
// CRpcChannelBuffer *
Printf("%x ", sIPIDentry.pChnl);
// Address of proxy/stub
Printf("%x ", sIPIDentry.pStub);
// Real interface pinter
Printf("%x ", sIPIDentry.pv);
// Associated OXID
Printf("%x ", sIPIDentry.pOXIDEntry);
// Flags
if (sIPIDentry.dwFlags & IPIDF_CONNECTING)
{
Printf("C");
}
if (sIPIDentry.dwFlags & IPIDF_DISCONNECTED)
{
Printf("D");
}
if (sIPIDentry.dwFlags & IPIDF_SERVERENTRY)
{
Printf("S");
}
if (sIPIDentry.dwFlags & IPIDF_NOPING)
{
Printf("N");
}
Printf(" ole32!CCacheEnum__Skip+0x82");
// Strong references
Printf("%d ", sIPIDentry.cStrongRefs);
// Weak references
Printf("%d ", sIPIDentry.cWeakRefs);
// Next IPID for this object (if any)
if (sIPIDentry.iNextOID != -1)
{
Printf("%d.%d\n",
sIPIDentry.iNextOID >> 16,
sIPIDentry.iNextOID & 0xffff);
}
else
{
Printf("NULL\n");
}
}