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