summaryrefslogtreecommitdiffstats
path: root/private/ole32/dbgexts/oleexts.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'private/ole32/dbgexts/oleexts.cxx')
-rw-r--r--private/ole32/dbgexts/oleexts.cxx1145
1 files changed, 1145 insertions, 0 deletions
diff --git a/private/ole32/dbgexts/oleexts.cxx b/private/ole32/dbgexts/oleexts.cxx
new file mode 100644
index 000000000..36fa30072
--- /dev/null
+++ b/private/ole32/dbgexts/oleexts.cxx
@@ -0,0 +1,1145 @@
+//+-------------------------------------------------------------------------
+//
+// Microsoft Windows
+// Copyright (C) Microsoft Corporation, 1995
+//
+// File: ole.cxx
+//
+// Contents: Implements ntsd extensions to dump ole tables
+//
+// Functions:
+//
+//
+// History: 06-01-95 BruceMa Created
+//
+//
+//--------------------------------------------------------------------------
+
+
+#include <ole2int.h>
+#include <windows.h>
+#include <ole2.h>
+#include "ole.h"
+#include "ddllcach.h"
+#include "dshrdmem.h"
+
+
+#define OLE_VERSION "1.0"
+
+
+void getArgument(LPSTR *lpArgumentString, LPSTR a);
+void checkForScm(PNTSD_EXTENSION_APIS lpExtensionApis);
+void NotInScm(PNTSD_EXTENSION_APIS lpExtensionApis);
+void NotInOle(PNTSD_EXTENSION_APIS lpExtensionApis);
+ULONG ScanAddr(char *lpsz);
+
+void channelHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayChannel(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ ULONG pChannel,
+ char *arg);
+
+void classCacheHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayClassCache(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayClassCacheCk(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis);
+
+void classInfoHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+BOOL displayClassInfo(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ CLSID *clsid);
+
+void dllCacheHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayDllCache(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ SDllCache *p);
+
+
+void displayHr(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ char *arg);
+
+void fileExtHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayFileExtTbl(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ SDllShrdTbl *pShrdTbl,
+ CLSID *pClsid,
+ WCHAR *wszExt);
+
+void filePatHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayFilePatTbl(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ SDllShrdTbl *pShrdTbl,
+ CLSID *pClsid);
+
+void stdidHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayStdidEntry(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ ULONG p,
+ char *arg);
+void displayStdid(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ ULONG p);
+
+void infoLevelHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayInfoLevel(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ LPSTR lpArgumentString);
+
+void monikerHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+BOOL displayMoniker(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ ULONG pMoniker);
+
+void psClsidHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayPsClsidTbl(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ SDllShrdTbl *pShrdTbl,
+ CLSID *clisd);
+
+void ipidHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayIpid(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayIpidEntry(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ char *arg);
+
+void oxidHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayOxid(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayOxidEntry(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ char *arg);
+
+void displayCliRot(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayScmRot(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis);
+void cliRotHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+void scmRotHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+
+void vtblHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayVtbl(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ void *lpObj);
+
+void treatAsCacheHelp(PNTSD_EXTENSION_APIS lpExtensionApis);
+void displayTreatAsCache(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ CLSID *clsid);
+
+
+
+void determineIfScm(void);
+BOOL ScanCLSID(LPSTR lpsz, LPGUID pguid);
+void FormatCLSID(REFGUID rguid, LPSTR lpsz);
+
+
+BOOL fScmNeedsInit = TRUE;
+BOOL fInScm = FALSE;
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.help
+//
+// Synopsis: Display a help menu of all the supported extensions
+// in this dll
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(help)
+{
+ Arg arg;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ // Help menu for an OLE client or server
+ if (!fInScm)
+ {
+ // Check for any argument
+ GetArg(arg);
+
+ // CRpcChannelBuffer help
+ if (lstrcmpA(arg, "ch") == 0)
+ {
+ channelHelp(lpExtensionApis);
+ }
+
+ // Class information help
+ else if (lstrcmpA(arg, "ci") == 0)
+ {
+ classInfoHelp(lpExtensionApis);
+ }
+
+ // DllCache help
+ else if (lstrcmpA(arg, "ds") == 0 || lstrcmpA(arg, "dh") == 0)
+ {
+ dllCacheHelp(lpExtensionApis);
+ }
+
+ // File extension cache help
+ else if (lstrcmpA(arg, "fe") == 0)
+ {
+ fileExtHelp(lpExtensionApis);
+ }
+
+ // File type patterns cache help
+ else if (lstrcmpA(arg, "ft") == 0)
+ {
+ filePatHelp(lpExtensionApis);
+ }
+
+ // Standard identity table
+ else if (lstrcmpA(arg, "id") == 0)
+ {
+ stdidHelp(lpExtensionApis);
+ }
+
+ // Debug info levels
+ else if (lstrcmpA(arg, "in") == 0)
+ {
+ infoLevelHelp(lpExtensionApis);
+ }
+
+ // IPID table
+ else if (lstrcmpA(arg, "ip") == 0)
+ {
+ ipidHelp(lpExtensionApis);
+ }
+
+ // A moniker
+ else if (lstrcmpA(arg, "mk") == 0)
+ {
+ monikerHelp(lpExtensionApis);
+ }
+
+ // OXID table
+ else if (lstrcmpA(arg, "ox") == 0)
+ {
+ oxidHelp(lpExtensionApis);
+ }
+
+ // IID to class mapping
+ else if (lstrcmpA(arg, "ps") == 0)
+ {
+ psClsidHelp(lpExtensionApis);
+ }
+
+ // ROT help
+ else if (lstrcmpA(arg, "rt") == 0)
+ {
+ cliRotHelp(lpExtensionApis);
+ }
+
+ // TreatAs help
+ else if (lstrcmpA(arg, "ta") == 0)
+ {
+ treatAsCacheHelp(lpExtensionApis);
+ }
+
+ // Vtbl help
+ else if (lstrcmpA(arg, "vt") == 0)
+ {
+ vtblHelp(lpExtensionApis);
+ }
+
+ // Print the full help menu
+ else
+ {
+ Printf("Ole32 NTSD extensions - Version %s\n\n", OLE_VERSION);
+
+ Printf("ch addr - Decode addr as an RPC channel\n");
+ Printf("ci [clsid] - Display registry class information\n");
+ Printf("ck - Is this a checked or retail version of ole32?\n");
+ Printf("dh - Display Inproc Handler dll/class cache\n");
+ Printf("ds - Display Inproc Server dll/class cache\n");
+ Printf("ep - Display current RPC endpoints\n");
+ Printf("er err - Display the message for error number err \n");
+ Printf("fe [e|c] - Display file extensions cache\n");
+ Printf("ft [clsid] - Display file type pattern(s)\n");
+ Printf("help [cmd] - Display this menu or specific help\n");
+ Printf("id - Display CStdIdentity table\n");
+ Printf("in - Set/reset debug info level\n");
+ Printf("ip - Display IPID table information\n");
+ Printf("mk addr - Decode addr as a moniker\n");
+ Printf("ox - Display OXID table information\n");
+ Printf("pg addr - Display addr as a guid\n");
+ Printf("pl - Display platform information\n");
+ Printf("ps - Display proxy/stub clsid cache\n");
+ Printf("rh addr - Decode addr as a remote handler\n");
+ Printf("rt - Display Running Object Table\n");
+ Printf("ta [clsid] - Display TreatAs cache\n");
+ Printf("vt obj - Interpret vtbl for object obj\n");
+ }
+ }
+
+
+ // Help menu for the scm
+ else
+ {
+ // Check for any argument
+ GetArg(arg);
+
+ if (lstrcmp(arg, "rt") == 0)
+ {
+ scmRotHelp(lpExtensionApis);
+ }
+
+ if (lstrcmp(arg, "cc") == 0)
+ {
+ classCacheHelp(lpExtensionApis);
+ }
+
+ // Print the full help menu
+ else
+ {
+ Printf("Ole32 NTSD extensions - Version %s\n\n", OLE_VERSION);
+
+ Printf("cc - Display class cache info\n");
+ Printf("ck - Is this a checked or retail version of scm?\n");
+ Printf("ep - Display current RPC endpoints\n");
+ Printf("er err - Display the message for error number err \n");
+ Printf("help [cmd] - Display this menu or specific help\n");
+ Printf("in - Set/reset debug info level\n");
+ Printf("mk addr - Decode addr as a moniker\n");
+ Printf("pg addr - Display addr as a guid\n");
+ Printf("rh - Display active remote handlers\n");
+ Printf("rt - Display Running Object Table\n");
+ Printf("ts - Display thread information\n");
+ Printf("vt obj - Interpret vtbl for object obj\n");
+ }
+ }
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.cc
+//
+// Synopsis: Display the scm class cache
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(cc)
+{
+ ULONG padr;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ NOTINOLE
+
+ // Determine if thisis checked or retail scm
+ padr = GetExpression("scm!_CairoleInfoLevel");
+
+ // Display the scm's class cache
+ if (padr == NULL)
+ {
+ displayClassCache(hProcess, lpExtensionApis);
+ }
+ else
+ {
+ displayClassCacheCk(hProcess, lpExtensionApis);
+ }
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.ch
+//
+// Synopsis: Display a channel controller
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(ch)
+{
+ Arg arg;
+ ULONG addr;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ NOTINSCM
+
+ // Fetch the argument
+ GetArg(arg);
+ if (!arg[0])
+ {
+ Printf("...use !ole.ch <address CRpcChannelBuffer>\n");
+ return;
+ }
+
+ // Parse it as a hexadecimal address
+ if (arg[0] != '?')
+ {
+ addr = ScanAddr(arg);
+ if (addr == NULL)
+ {
+ Printf("...%s is not a valid address\n", arg);
+ return;
+ }
+ }
+
+ // BUGBUG: Check that this is indeed an CRpcChannelBuffer
+ // Display the parsed address as a CRpcChannelBuffer
+ displayChannel(hProcess, lpExtensionApis, addr, arg);
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.ci
+//
+// Synopsis: Display registry class information
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(ci)
+{
+ Arg arg;
+ CLSID clsid;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ // Fetch the argument
+ GetArg(arg);
+
+ // Parse it as a clsid
+ if (arg[0])
+ {
+ if (!ScanCLSID(arg, &clsid))
+ {
+ Printf("...%s is not a valid clsid\n", arg);
+ return;
+ }
+ }
+
+ // Display all or particular registry class information
+ if (arg[0])
+ {
+ displayClassInfo(hProcess, lpExtensionApis, &clsid);
+ }
+ else
+ {
+ displayClassInfo(hProcess, lpExtensionApis, NULL);
+ }
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.ck
+//
+// Synopsis: Is this the checked or retail version of OLE?
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(ck)
+{
+ ULONG padr;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ if (fInScm)
+ {
+ padr = GetExpression("scm!_CairoleInfoLevel");
+ }
+ else
+ {
+ padr = GetExpression("ole32!_CairoleInfoLevel");
+ }
+ if (padr == NULL)
+ {
+ Printf("Retail\n");
+ }
+ else
+ {
+ Printf("Checked\n");
+ }
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.dh
+//
+// Synopsis: Display the dll/class cache for inproc handlers
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(dh)
+{
+ SDllCache dllCache;
+ ULONG padr;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ NOTINSCM
+
+ // Fetch the dll/class cache object
+ padr = GetExpression("ole32!gdllcacheHandler");
+ ReadMem((void *) &dllCache, padr, sizeof(SDllCache));
+ Printf("Dll/class cache for in-process handlers\n\n");
+ displayDllCache(hProcess, lpExtensionApis, &dllCache);
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.ds
+//
+// Synopsis: Display the dll/class cache for inproc servers
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(ds)
+{
+ SDllCache dllCache;
+ ULONG padr;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ padr = GetExpression("ole32!gdllcacheInprocSrv");
+ ReadMem(&dllCache, padr, sizeof(SDllCache));
+ Printf("Dll/class cache for in-process servers\n\n");
+ displayDllCache(hProcess, lpExtensionApis, &dllCache);
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.er
+//
+// Synopsis: Display a Win32 or OLE error message
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(er)
+{
+ Arg arg;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ GetArg(arg);
+ displayHr(hProcess, lpExtensionApis, arg);
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.fe
+//
+// Synopsis: Display file extension information
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(fe)
+{
+ Arg arg;
+ ULONG pAdr;
+ SDllShrdTbl *pShrdTbl;
+ CLSID clsid;
+ WCHAR wszExt[16];
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ NOTINSCM
+
+ // Check for any argument
+ GetArg(arg);
+ if (arg[0])
+ {
+ if (arg[0] == '{')
+ {
+ if(!ScanCLSID(arg, &clsid))
+ {
+ Printf("...%s is not a valid CLSID\n", arg);
+ return;
+ }
+ }
+ else if (arg[0] == '.')
+ {
+ if (!MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, arg, -1, wszExt,
+ 16 * sizeof(WCHAR)))
+ {
+ Printf("..%ws\n", wszExt);
+ Printf("...invalid extension %s\n", arg);
+ return;
+ }
+ }
+ else
+ {
+ Printf("...can't understand argument\n");
+ }
+ }
+
+ // Fetch the address of the shared memory table
+ pAdr = GetExpression("ole32!g_pShrdTbl");
+ ReadMem(&pShrdTbl, pAdr, sizeof(ULONG));
+ if (arg[0])
+ {
+ if (arg[0] == '{')
+ {
+ displayFileExtTbl(hProcess, lpExtensionApis, pShrdTbl, &clsid,
+ NULL);
+ }
+ else
+ {
+ displayFileExtTbl(hProcess, lpExtensionApis, pShrdTbl, NULL,
+ wszExt);
+ }
+ }
+ else
+ {
+ displayFileExtTbl(hProcess, lpExtensionApis, pShrdTbl, NULL, NULL);
+ }
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.ft
+//
+// Synopsis: Display file type patterns
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(ft)
+{
+ Arg arg;
+ ULONG pAdr;
+ SDllShrdTbl *pShrdTbl;
+ CLSID clsid;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ NOTINSCM
+
+ // Check for an argument
+ GetArg(arg);
+ if (arg[0])
+ {
+ if (arg[0] == '{')
+ {
+ if(!ScanCLSID(arg, &clsid))
+ {
+ Printf("...%s is not a valid CLSID\n", arg);
+ return;
+ }
+ }
+ else
+ {
+ Printf("...%s is not a valid CLSID\n", arg);
+ return;
+ }
+ }
+
+ // Fetch the address of the shared memory table
+ pAdr = GetExpression("ole32!g_pShrdTbl");
+ ReadMem(&pShrdTbl, pAdr, sizeof(ULONG));
+ if (arg[0] == '{')
+ {
+ displayFilePatTbl(hProcess, lpExtensionApis, pShrdTbl, &clsid);
+ }
+ else
+ {
+ displayFilePatTbl(hProcess, lpExtensionApis, pShrdTbl, NULL);
+ }
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.id
+//
+// Synopsis: Display the CStdIdentity taable
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(id)
+{
+ ULONG pAdr;
+ Arg arg;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ NOTINSCM
+
+ // Fetch the address of the standard identity table
+ pAdr = GetExpression("ole32!sg_idtable");
+
+ // Check for any argument
+ GetArg(arg);
+
+ // Display all or one entry
+ if (arg[0])
+ {
+ displayStdidEntry(hProcess, lpExtensionApis, pAdr, arg);
+ }
+ else
+ {
+ displayStdid(hProcess, lpExtensionApis, pAdr);
+ }
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.in
+//
+// Synopsis: Display/change debug info levels
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(in)
+{
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ // Set/display an info level
+ displayInfoLevel(hProcess, lpExtensionApis, lpArgumentString);
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.ip
+//
+// Synopsis: Display IPID table
+//
+// History: 11-Aug-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(ip)
+{
+ Arg arg;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ NOTINSCM
+
+ // Check for an argument
+ GetArg(arg);
+
+ // The whole table or a single entry
+ if (arg[0])
+ {
+ displayIpidEntry(hProcess, lpExtensionApis, arg);
+ }
+ else
+ {
+ displayIpid(hProcess, lpExtensionApis);
+ }
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.mk
+//
+// Synopsis: Interpret a moniker object
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(mk)
+{
+ Arg arg;
+ ULONG pAdr;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ // Scan the argument
+ GetArg(arg);
+ if (!arg[0])
+ {
+ Printf("...use !ole.mk <moniker address>\n");
+ return;
+ }
+ pAdr = ScanAddr(arg);
+
+ // Interpret this address as a moniker
+ if (!displayMoniker(hProcess, lpExtensionApis, pAdr))
+ {
+ Printf("...%08x isn't a system moniker\n", pAdr);
+ }
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.ox
+//
+// Synopsis: Display OXID table
+//
+// History: 11-Aug-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(ox)
+{
+ Arg arg;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ NOTINSCM
+
+ // Check for an argument
+ GetArg(arg);
+
+ // The whole table or a single entry
+ if (arg[0])
+ {
+ displayOxidEntry(hProcess, lpExtensionApis, arg);
+ }
+ else
+ {
+ displayOxid(hProcess, lpExtensionApis);
+ }
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.pg
+//
+// Synopsis: Pretty print a guid
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(pg)
+{
+ Arg arg;
+ ULONG addr;
+ GUID guid;
+ char szGuid[CLSIDSTR_MAX];
+
+ // Fetch the argument
+ GetArg(arg);
+ if (!arg[0])
+ {
+ Printf("...requires an addr argument\n");
+ return;
+ }
+ addr = ScanAddr(arg);
+
+ // Fetch the guid
+ ReadMem(&guid, addr, sizeof(GUID));
+
+ // Format and print the guid
+ FormatCLSID((GUID &) guid, szGuid);
+ Printf("%s\n", szGuid);
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.pl
+//
+// Synopsis: Display platform information
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(pl)
+{
+ OSVERSIONINFO osInfo;
+
+ osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ if (GetVersionEx(&osInfo))
+ {
+ Printf("Cairo %d.%d Build %d\n",
+ osInfo.dwMajorVersion,
+ osInfo.dwMinorVersion,
+ osInfo.dwBuildNumber);
+ }
+ else
+ {
+ Printf("...Unable to get version/platform info\n");
+ }
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.ps
+//
+// Synopsis: Display CLSID of proxy/stub handler dll for given IID
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(ps)
+{
+ Arg arg;
+ ULONG pAdr;
+ SDllShrdTbl *pShrdTbl;
+ IID iid;
+ WCHAR wszExt[16];
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ NOTINSCM
+
+ // Check for any argument
+ GetArg(arg);
+ if (arg[0])
+ {
+ if(!ScanCLSID(arg, &iid))
+ {
+ Printf("...%s is not a valid CLSID\n", arg);
+ return;
+ }
+ }
+
+ // Fetch the address of the shared memory table
+ pAdr = GetExpression("ole32!g_pShrdTbl");
+ ReadMem(&pShrdTbl, pAdr, sizeof(ULONG));
+ if (arg[0])
+ {
+ displayPsClsidTbl(hProcess, lpExtensionApis, pShrdTbl, &iid);
+ }
+ else
+ {
+ displayPsClsidTbl(hProcess, lpExtensionApis, pShrdTbl, NULL);
+ }
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.rt
+//
+// Synopsis: Display the ROT
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(rt)
+{
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ if (fInScm)
+ {
+ displayScmRot(hProcess, lpExtensionApis);
+ }
+ else
+ {
+ displayCliRot(hProcess, lpExtensionApis);
+ }
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.ta
+//
+// Synopsis: Display TreatAs cache
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(ta)
+{
+ Arg arg;
+ CLSID clsid;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ // Check whether a clsid was supplied
+ GetArg(arg);
+ if (arg[0])
+ {
+ if (!ScanCLSID(arg, &clsid))
+ {
+ Printf("..%s is not a valid CLSID\n", arg);
+ return;
+ }
+ displayTreatAsCache(hProcess, lpExtensionApis, &clsid);
+ }
+
+ // Display the entire TreatAs class cache
+ else
+ {
+ displayTreatAsCache(hProcess, lpExtensionApis, NULL);
+ }
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.ts
+//
+// Synopsis: Display thread information
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(ts)
+{
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ Printf("...NOT IMPLEMENTED YET\n");
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Extension: !ole.vt
+//
+// Synopsis: Display a vtbl
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+DEFINE_EXT(vt)
+{
+ Arg arg;
+ DWORD dwObj = NULL;
+ char *s;
+
+ // Check whether debuggee is the scm
+ CheckForScm();
+
+ // Get the object
+ GetArg(arg);
+ for (s = arg; *s; s++)
+ {
+ dwObj = 16 * dwObj + *s - '0';
+ if ('A' <= *s && *s <= 'F')
+ {
+ dwObj -= 7;
+ }
+ if ('a' <= *s && *s <= 'f')
+ {
+ dwObj -= 39;
+ }
+ }
+
+ // Display the vtbl
+ if (dwObj != NULL)
+ {
+ displayVtbl(hProcess, lpExtensionApis, (LPVOID) dwObj);
+ }
+ else
+ {
+ Printf("...vtbl address of NULL is not meaningful\n");
+ }
+}