233 lines
6.6 KiB
C++
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);
|
|
}
|