342 lines
8.8 KiB
C++
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");
|
||
|
}
|
||
|
}
|