//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1995 // // File: ddllcach.cxx // // Contents: Ole NTSD extension routines to display a dll/class cache // // Functions: displayDllCache // // // History: 06-01-95 BruceMa Created // // //-------------------------------------------------------------------------- #include #include #include "ole.h" #include "ddllcach.h" void FormatCLSID(REFGUID rguid, LPSTR lpsz); //+------------------------------------------------------------------------- // // Function: dllCacheHelp // // Synopsis: Display a menu for the command 'ds' // // Arguments: - // // Returns: - // // History: 07-Mar-95 BruceMa Created // //-------------------------------------------------------------------------- void dllCacheHelp(PNTSD_EXTENSION_APIS lpExtensionApis) { Printf("\nds - Display entire Inproc Server dll/class cache:\n"); Printf("dh - Display entire Inproc Handler dll/class cache:\n\n"); Printf("Dll's\n"); Printf("-----\n"); Printf("path hModule DllGetClassObject() DllCanUnloadNow() apt ... apt \n"); Printf(" CLSID\n"); Printf(" ...\n"); Printf("...\n\n"); Printf("LocalServers\n"); Printf("------------\n"); Printf("CLSID IUnknown* [M|S|MS] reg_key reg_@_scm\n"); Printf("...\n\n"); } //+------------------------------------------------------------------------- // // Function: displayDllCache // // Synopsis: Formats and writes a dll/class cache structure to the // debugger terminal // // Arguments: [hProcess] - Handle of this process // [lpExtensionApis] - Table of extension functions // // Returns: - // // History: 07-Mar-95 BruceMa Created // //-------------------------------------------------------------------------- void displayDllCache(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, SDllCache *pDllCache) { SDllPathEntry *pDllPathEntries; SClassEntry *pClassEntries; DWORD cbSize; // dbt("pDllCache", pDllCache, sizeof(SDllCache)); // Fetch the array of dll path entries cbSize = sizeof(SDllPathEntry) * pDllCache->_cDllPathEntries; pDllPathEntries = (SDllPathEntry *) OleAlloc(cbSize); ReadMem(pDllPathEntries, pDllCache->_pDllPathEntries, cbSize); // dbt("pDllPathEntries", pDllPathEntries, cbSize); // Fetch the array of class entries cbSize = sizeof(SClassEntry) * pDllCache->_cClassEntries; pClassEntries = (SClassEntry *) OleAlloc(cbSize); ReadMem(pClassEntries, pDllCache->_pClassEntries, cbSize); // dbt("pClassEntries", pClassEntries, cbSize); // We do the dll's first Printf("Dll's:\n-----\n"); // Do over the registered dll's for (DWORD dwDll = pDllCache->_nDllPathEntryInUse; dwDll != NONE; dwDll = pDllPathEntries[dwDll]._dwNext) { // Fetch the dll path WCHAR wszPath[MAX_PATH + 1]; CHAR szPath[2 * MAX_PATH + 1]; // We don't know the length of the path, so read one WCHAR // at a time INT k = -1; do { k++; ReadMem(&wszPath[k], &pDllPathEntries[dwDll]._pwszPath[k], sizeof(WCHAR)); } until_(wszPath[k] == L'\0'); Unicode2Ansi(szPath, wszPath, 2 * MAX_PATH + 1); // Fetch the apartment entries for this dll path entry SDllAptEntry *pAptEntries; cbSize = sizeof(SDllAptEntry) * pDllPathEntries[dwDll]._cAptEntries; pAptEntries = (SDllAptEntry *) OleAlloc(cbSize); ReadMem(pAptEntries, pDllPathEntries[dwDll]._pAptEntries, cbSize); // dbt("pAptEntries", pAptEntries, cbSize); // Display path Printf("%s ", szPath); // Display hModule and DllGetClassObject and DllCanUnloadNow entry // points Printf("%08x %08x %08x ", pAptEntries[pDllPathEntries[dwDll]._nAptInUse]._hDll, pDllPathEntries[dwDll]._pfnGetClassObject, pDllPathEntries[dwDll]._pfnDllCanUnload); // Display apartment id's for (DWORD dwApt = pDllPathEntries[dwDll]._nAptInUse; dwApt != NONE; dwApt = pAptEntries[dwApt]._dwNext) { Printf("%x ", pAptEntries[dwApt]._hApt); } Printf("\n"); // Do over CLSID's for this dll for (DWORD dwCls = pDllPathEntries[dwDll]._dw1stClass; dwCls != NONE; dwCls = pClassEntries[dwCls]._dwNextDllCls) { // Display the CLSID CHAR szClsid[CLSIDSTR_MAX]; FormatCLSID(pClassEntries[dwCls]._clsid, szClsid); Printf(" %s \n", szClsid); } // Release the apartment entries for this dll OleFree(pAptEntries); Printf("\n"); } // Release the array of dll path entries OleFree(pDllPathEntries); // Then we do the local servers Printf("Local Servers:\n----------\n"); // Do over the locally registerd local servers for (DWORD dwCls = pDllCache->_nClassEntryInUse; dwCls != NONE; dwCls = pClassEntries[dwCls]._dwNext) { // Skip class entries associated with dll's if (pClassEntries[dwCls]._dwDllEnt == NONE) { // Display the CLSID CHAR szClsid[CLSIDSTR_MAX]; FormatCLSID(pClassEntries[dwCls]._clsid, szClsid); Printf(" %s ", szClsid); // The class factory punk Printf("%08x ", pClassEntries[dwCls]._pUnk); // The flags if (pClassEntries[dwCls]._dwFlags == REGCLS_SINGLEUSE) { Printf("S "); } else if (pClassEntries[dwCls]._dwFlags == REGCLS_MULTIPLEUSE) { Printf("M "); } else if (pClassEntries[dwCls]._dwFlags == REGCLS_MULTI_SEPARATE) { Printf("MS "); } // The registration key given to the user Printf("%08x ", pClassEntries[dwCls]._dwReg); // The registration key at the scm Printf("%08x ", pClassEntries[dwCls]._dwScmReg); // Whether this is an AtBits server if (pClassEntries[dwCls]._fAtBits) { Printf("AtBits\n"); } else { Printf("\n"); } } } Printf("\n"); // Release the array of class entries OleFree(pClassEntries); }