//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1995 // // File: dpsclsid.cxx // // Contents: Ole NTSD extension routines to dump the proxy/stub // clsid cache // // Functions: psClsidHelp // displayPsClsidTbl // // // History: 06-01-95 BruceMa Created // // //-------------------------------------------------------------------------- #include #include #include "ole.h" #include "dshrdmem.h" BOOL IsEqualCLSID(CLSID *pClsid1, CLSID *pClsid2); void FormatCLSID(REFGUID rguid, LPSTR lpsz); BOOL GetRegistryInterfaceName(REFIID iid, char *szValue, DWORD *pcbValue); BOOL GetRegistryClsidKey(REFCLSID clsid, char *szKey, char *szValue, DWORD *pcbValue); //+------------------------------------------------------------------------- // // Function: psClsidHelp // // Synopsis: Display a menu for the command 'ps' // // Arguments: - // // Returns: - // // History: 07-Mar-95 BruceMa Created // //-------------------------------------------------------------------------- void psClsidHelp(PNTSD_EXTENSION_APIS lpExtensionApis) { Printf("ps - Display infomation for all IID's\n"); Printf("ps IID - Display infomation for IID\n"); } //+------------------------------------------------------------------------- // // Function: displayPsClsidTbl // // Synopsis: Given an interface IID display the CLSID of the // associated proxy/stub handler dll // // Arguments: [hProcess] - Handle of this process // [lpExtensionApis] - Table of extension functions // [lpFileExtTbl] - Address of file extensions table // [pClsid] - Only for this clsid // // Returns: - // // History: 01-Jun-95 BruceMa Created // //-------------------------------------------------------------------------- void displayPsClsidTbl(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, SDllShrdTbl *pShrdTbl, IID *pIid) { SDllShrdTbl sDllTbl; GUIDMAP sGuidMap; GUIDPAIR *pGuidPair; DWORDPAIR *pDwordPair; IID iid = {0, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46}}; char szClsid[CLSIDSTR_MAX]; char szName[129]; DWORD cbValue; // Read the shared table locally ReadMem(&sDllTbl, pShrdTbl, sizeof(SDllShrdTbl)); // Read the guid map locally ReadMem(&sGuidMap, sDllTbl._PSClsidTbl._pGuidMap, sizeof(GUIDMAP)); // Allocate for the guid pair list pGuidPair = (GUIDPAIR *) OleAlloc(sGuidMap.ulCntLong * sizeof(GUIDPAIR)); // Allocate for the dword pair list pDwordPair = (DWORDPAIR *) OleAlloc(sGuidMap.ulCntShort * sizeof(DWORDPAIR)); // Read the guid pair list ReadMem(pGuidPair, sDllTbl._PSClsidTbl._pLongList - (sGuidMap.ulCntLong - 1), sGuidMap.ulCntLong * sizeof(GUIDPAIR)); // Read the dword pair list ReadMem(pDwordPair, sDllTbl._PSClsidTbl._pShortList, sGuidMap.ulCntShort * sizeof(DWORDPAIR)); // Are we looking for a specific IID? if (pIid != NULL) { // Search the short list first for (UINT cCnt = 0; cCnt < sGuidMap.ulCntShort; pDwordPair++, cCnt++) { if (pIid->Data1 == pDwordPair->dw1) { iid.Data1 = pIid->Data1; // Fetch and print the interface name cbValue = 64; if(GetRegistryInterfaceName(iid, szName, &cbValue)) { Printf("%s\t", szName); } else { Printf("-\t"); } // The clsid iid.Data1 = pDwordPair->dw2; FormatCLSID(iid, szClsid); Printf("%s\t", szClsid); // Fetch and print the proxy/stub handler dll cbValue = 128; if (GetRegistryClsidKey(iid, "InprocServer32", szName, &cbValue)) { Printf("%s\n", szName); } else if(GetRegistryClsidKey(iid, "InprocServer", szName, &cbValue)) { Printf("%s(16)\n", szName); } else { Printf("-\n"); } return; } } // Search the long list next for (cCnt = 0; cCnt < sGuidMap.ulCntLong; pGuidPair++, cCnt++) { if (IsEqualCLSID(pIid, &pGuidPair->guid1)) { // Fetch and print the interface name cbValue = 64; if(GetRegistryInterfaceName(pGuidPair->guid1, szName, &cbValue)) { Printf("%s\t", szName); } else { Printf("-\t"); } // The clsid FormatCLSID(pGuidPair->guid2, szClsid); Printf("%s\t", szClsid); // Fetch and print the proxy/stub handler dll cbValue = 128; if (GetRegistryClsidKey(pGuidPair->guid2, "InprocServer32", szName, &cbValue)) { Printf("%s\n", szName); } else if(GetRegistryClsidKey(pGuidPair->guid2, "InprocServer", szName, &cbValue)) { Printf("%s(16)\n", szName); } else { Printf("-\n"); } return; } } } // Else dump everything else { // Print header Printf("where -. = '-0000-0000-C000-000000000046}'\n\n"); Printf(" IID interface clsid p/s dll\n"); Printf("----------- ------------------ ----------- ---------\n"); // Do over the short list for (UINT cCnt = 0 ; cCnt < sGuidMap.ulCntShort; pDwordPair++, cCnt++) { // Print the IID iid.Data1 = pDwordPair->dw1; FormatCLSID(iid, szClsid); if (lstrcmp(&szClsid[9], "-0000-0000-C000-000000000046}") == 0) { szClsid[9] = '\0'; Printf("%s-.", szClsid); } else { Printf("%s\n", szClsid); } // Fetch and print the interface name cbValue = 64; if(GetRegistryInterfaceName(iid, szName, &cbValue)) { Printf(" %s", szName); } else { Printf(" -"); } // Do some pretty printing alignment for (UINT cCh = 24 - lstrlen(szName); cCh > 0; cCh--) { Printf(" "); } Printf(" "); // The clsid iid.Data1 = pDwordPair->dw2; FormatCLSID(iid, szClsid); if (lstrcmp(&szClsid[9], "-0000-0000-C000-000000000046}") == 0) { szClsid[9] = '\0'; Printf("%s-.\t", szClsid); } else { Printf("%s\t", szClsid); } // Fetch and print the proxy/stub handler dll cbValue = 128; if (GetRegistryClsidKey(iid, "InprocServer32", szName, &cbValue)) { Printf("%s\n", szName); } else if(GetRegistryClsidKey(iid, "InprocServer", szName, &cbValue)) { Printf("%s(16)\n", szName); } else { Printf("-\n"); } } // Do over the long list for (cCnt = 0; cCnt < sGuidMap.ulCntLong; pGuidPair++, cCnt++) { // Print the IID FormatCLSID(pGuidPair->guid1, szClsid); Printf("%s ", szClsid); // Fetch and print the interface name cbValue = 64; if(GetRegistryInterfaceName(pGuidPair->guid1, szName, &cbValue)) { Printf(" %s", szName); } else { Printf(" -"); } // Do some pretty printing alignment for (UINT cCh = 24 - lstrlen(szName); cCh > 0; cCh--) { Printf(" "); } Printf(" "); // The clsid FormatCLSID(pGuidPair->guid2, szClsid); if (lstrcmp(&szClsid[9], "-0000-0000-C000-000000000046}") == 0) { szClsid[9] = '\0'; Printf("%s-.\t", szClsid); } else { Printf("%s\t", szClsid); } // Fetch and print the proxy/stub handler dll cbValue = 128; if (GetRegistryClsidKey(pGuidPair->guid2, "InprocServer32", szName, &cbValue)) { Printf("%s\n", szName); } else if(GetRegistryClsidKey(iid, "InprocServer32", szName, &cbValue)) { Printf("%s(16)\n", szName); } else { Printf("-\n"); } } } // Release allocated resources OleFree(pGuidPair); OleFree(pDwordPair); }