summaryrefslogtreecommitdiffstats
path: root/private/ole32/dbgexts/dvtbl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'private/ole32/dbgexts/dvtbl.cxx')
-rw-r--r--private/ole32/dbgexts/dvtbl.cxx131
1 files changed, 131 insertions, 0 deletions
diff --git a/private/ole32/dbgexts/dvtbl.cxx b/private/ole32/dbgexts/dvtbl.cxx
new file mode 100644
index 000000000..cf1327489
--- /dev/null
+++ b/private/ole32/dbgexts/dvtbl.cxx
@@ -0,0 +1,131 @@
+//+-------------------------------------------------------------------------
+//
+// Microsoft Windows
+// Copyright (C) Microsoft Corporation, 1995
+//
+// File: dvtbl.cxx
+//
+// Contents: Ole NTSD extension routines to dump a vtbl
+//
+// Functions: displayVtbl
+//
+//
+// History: 06-01-95 BruceMa Created
+//
+//
+//--------------------------------------------------------------------------
+
+
+#include <ole2int.h>
+#include <windows.h>
+#include "ole.h"
+
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Function: vtblHelp
+//
+// Synopsis: Display a menu for the command 'vt'
+//
+// Arguments: -
+//
+// Returns: -
+//
+// History: 07-Mar-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+void vtblHelp(PNTSD_EXTENSION_APIS lpExtensionApis)
+{
+ Printf("vt obj - Interpret vtbl for object obj:\n");
+}
+
+
+
+
+
+
+//+-------------------------------------------------------------------------
+//
+// Function: displayVtbl
+//
+// Synopsis: Given an object interpret its vtbl
+//
+// Arguments: [hProcess] - Handle of this process
+// [lpExtensionApis] - Table of extension functions
+//
+// Returns: -
+//
+// History: 01-Jun-95 BruceMa Created
+//
+//--------------------------------------------------------------------------
+void displayVtbl(HANDLE hProcess,
+ PNTSD_EXTENSION_APIS lpExtensionApis,
+ void *lpObj)
+{
+ DWORD lpVtbl = 0xdeaddead;
+ DWORD dwVtblOffset;
+ char achSymbol[256];
+
+
+ // Get the address of the vtbl
+ ReadMem(&lpVtbl, lpObj, sizeof(LPVOID));
+
+ // Check for some reasonableness
+ if (lpVtbl == 0 || lpVtbl == 0xdededede || lpVtbl == 0xedededed ||
+ lpVtbl == 0xdeaddead)
+ {
+ if (lpVtbl == 0xdeaddead)
+ {
+ Printf("...vtbl pointer could not be read\n");
+ }
+ else
+ {
+ Printf("...vtbl pointer == 0x%x is unreasonable\n", lpVtbl);
+ }
+ return;
+ }
+
+ // vtbl entries should always point at functions. Therefore, we should
+ // always have a displacement of zero. To check for the end of the table
+ // we will reevaluate the vtbl pointer. If the offset isn't what we
+ // expected, then we are done.
+
+ DWORD dwIndex;
+ for (dwIndex = 0 ; dwIndex < 512 ; dwIndex += 4, lpVtbl += 4)
+ {
+ DWORD dwVtblEntry;
+
+ // Just in case the loop gets away from us
+ if (CheckControlC())
+ {
+ return;
+ }
+
+ // Read the next vtbl entry
+ ReadMem(&dwVtblEntry, lpVtbl, sizeof(dwVtblEntry));
+
+ // If the function is at zero, then must be at end of table
+ if (dwVtblEntry == 0)
+ {
+ return;
+ }
+
+ // Now, determine the symbol for the entry in the vtbl
+ GetSymbol((LPVOID) dwVtblEntry, (UCHAR *) achSymbol, &dwVtblOffset);
+
+ // If it doesn't point to the start of a routine, then it
+ // probably isn't part of the vtbl
+ if (dwVtblOffset != 0)
+ {
+ return;
+ }
+
+ // Print the vtbl entry symbolically
+ Printf(" 0x%08x %s\n", dwVtblEntry, achSymbol);
+ }
+}