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

233 lines
6.6 KiB
C++

//+-------------------------------------------------------------------------
//
// 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 <ole2int.h>
#include <windows.h>
#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);
}