summaryrefslogtreecommitdiffstats
path: root/private/mvdm/bde/bdemisc.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/mvdm/bde/bdemisc.c')
-rw-r--r--private/mvdm/bde/bdemisc.c372
1 files changed, 372 insertions, 0 deletions
diff --git a/private/mvdm/bde/bdemisc.c b/private/mvdm/bde/bdemisc.c
new file mode 100644
index 000000000..65f646e63
--- /dev/null
+++ b/private/mvdm/bde/bdemisc.c
@@ -0,0 +1,372 @@
+/*++
+
+Copyright (c) 1990 Microsoft Corporation
+
+Module Name:
+
+ ntsdexts.c
+
+Abstract:
+
+ This function contains the default ntsd debugger extensions
+
+Author:
+
+ Bob Day (bobday) 29-Feb-1992 Grabbed standard header
+
+Revision History:
+
+--*/
+
+#include <precomp.h>
+#pragma hdrstop
+#include <ctype.h>
+
+VOID
+DumpMemory(
+ UINT DumpType
+ )
+{
+ VDMCONTEXT ThreadContext;
+ int mode;
+ int i, j, lines = 8;
+ WORD selector;
+ ULONG offset;
+ ULONG base;
+ char ch;
+
+ if (!DumpType) {
+ return;
+ }
+
+ mode = GetContext( &ThreadContext );
+
+ if (!GetNextToken()) {
+ PRINTF("Please specify an address\n");
+ return;
+ }
+
+ if (!ParseIntelAddress(&mode, &selector, &offset)) {
+ return;
+ }
+
+ if (GetNextToken()) {
+ if ((*lpArgumentString == 'l') || (*lpArgumentString == 'L')) {
+ lpArgumentString++;
+ }
+ lines = (EXPRESSION(lpArgumentString)*DumpType+15)/16;
+ }
+
+ base = GetInfoFromSelector(selector, mode, NULL) + GetIntelBase();
+
+ for (i=0; i<lines; i++) {
+ if (offset & 0xFFFF0000) {
+ PRINTF("%04x:%08lx ", selector, offset);
+ } else {
+ PRINTF("%04x:%04x ", selector, LOWORD(offset));
+ }
+
+ switch(DumpType) {
+
+ case 1:
+ for (j=0; j<16; j++) {
+ if (j==8) {
+ PRINTF("-");
+ } else {
+ PRINTF(" ");
+ }
+ PRINTF("%02x", ReadByteSafe(base+offset+j));
+ }
+ PRINTF(" ");
+
+ for (j=0; j<16; j++) {
+ ch = ReadByteSafe(base+offset+j);
+ if (isprint(ch)) {
+ PRINTF("%c", ch);
+ } else {
+ PRINTF(".");
+ }
+ }
+
+ break;
+ case 2:
+ for (j=0; j<16; j+=2) {
+ PRINTF(" %04x", ReadWordSafe(base+offset+j));
+ }
+ break;
+ case 4:
+ for (j=0; j<16; j+=4) {
+ PRINTF(" %08lx", ReadDwordSafe(base+offset+j));
+ }
+ break;
+ }
+ PRINTF("\n");
+ offset += 16;
+
+ }
+
+}
+
+
+
+VOID
+DumpRegs(
+) {
+ VDMCONTEXT ThreadContext;
+ int mode;
+
+ mode = GetContext( &ThreadContext );
+
+ PRINTF("eax=%08lx ebx=%08lx ecx=%08lx edx=%08lx esi=%08lx edi=%08lx\n",
+ ThreadContext.Eax,
+ ThreadContext.Ebx,
+ ThreadContext.Ecx,
+ ThreadContext.Edx,
+ ThreadContext.Esi,
+ ThreadContext.Edi );
+ PRINTF("eip=%08lx esp=%08lx ebp=%08lx ",
+ ThreadContext.Eip,
+ ThreadContext.Esp,
+ ThreadContext.Ebp );
+ if ( ThreadContext.EFlags & FLAG_OVERFLOW ) {
+ PRINTF("ov ");
+ } else {
+ PRINTF("nv ");
+ }
+ if ( ThreadContext.EFlags & FLAG_DIRECTION ) {
+ PRINTF("dn ");
+ } else {
+ PRINTF("up ");
+ }
+ if ( ThreadContext.EFlags & FLAG_INTERRUPT ) {
+ PRINTF("ei ");
+ } else {
+ PRINTF("di ");
+ }
+ if ( ThreadContext.EFlags & FLAG_SIGN ) {
+ PRINTF("ng ");
+ } else {
+ PRINTF("pl ");
+ }
+ if ( ThreadContext.EFlags & FLAG_ZERO ) {
+ PRINTF("zr ");
+ } else {
+ PRINTF("nz ");
+ }
+ if ( ThreadContext.EFlags & FLAG_AUXILLIARY ) {
+ PRINTF("ac ");
+ } else {
+ PRINTF("na ");
+ }
+ if ( ThreadContext.EFlags & FLAG_PARITY ) {
+ PRINTF("po ");
+ } else {
+ PRINTF("pe ");
+ }
+ if ( ThreadContext.EFlags & FLAG_CARRY ) {
+ PRINTF("cy ");
+ } else {
+ PRINTF("nc ");
+ }
+ PRINTF("\n");
+ PRINTF("cs=%04x ss=%04x ds=%04x es=%04x fs=%04x gs=%04x efl=%08lx\n",
+ ThreadContext.SegCs,
+ ThreadContext.SegSs,
+ ThreadContext.SegDs,
+ ThreadContext.SegEs,
+ ThreadContext.SegFs,
+ ThreadContext.SegGs,
+ ThreadContext.EFlags );
+}
+
+
+VOID
+ListModules(
+) {
+ VDMCONTEXT ThreadContext;
+ int mode;
+ HEAPENTRY he = {0};
+ SELECTORINFO si;
+
+ mode = GetContext( &ThreadContext );
+
+ if (GetNextToken()) {
+ he.Selector = (WORD) EXPRESSION( lpArgumentString );
+ }
+
+ PRINTF("Sel Base Limit Type Seg Module\n");
+ PRINTF("==== ======== ======== ==== ==== ========\n");
+
+
+ while (FindHeapEntry(&he, FALSE)) {
+ if (he.SegmentNumber != -1) {
+ GetInfoFromSelector((WORD)(he.gnode.pga_handle | 1), PROT_MODE, &si);
+ PRINTF("%04X %08lX %08lX",
+ he.gnode.pga_handle | 1,
+ he.gnode.pga_address,
+ he.gnode.pga_size - 1);
+
+ PRINTF(" %s", si.bCode ? "Code" : "Data");
+
+ PRINTF(" %04X %s\n",
+ he.SegmentNumber,
+ he.OwnerName);
+ }
+
+ }
+
+}
+
+VOID
+DumpDescriptor(
+) {
+ VDMCONTEXT ThreadContext;
+ WORD selector;
+ ULONG Base;
+ int mode;
+ SELECTORINFO si;
+ int i, count = 16;
+
+ mode = GetContext( &ThreadContext );
+
+ if (GetNextToken()) {
+ selector = (WORD) EXPRESSION( lpArgumentString );
+ } else {
+ PRINTF("Please enter a selector\n");
+ return;
+ }
+
+ for (i=0; i<count; i++) {
+
+ Base = GetInfoFromSelector( selector, mode, &si );
+
+ PRINTF("%04X => Base: %08lX", selector, Base);
+
+#ifndef i386
+ PRINTF(" (%08X)", Base+GetIntelBase());
+#endif
+
+ PRINTF(" Limit: %08lX %s %s %s %s\n",
+ si.Limit,
+ si.bPresent ? " P" : "NP",
+ si.bSystem ? "System" : si.bCode ? "Code " : "Data ",
+ si.bSystem ? "" : si.bWrite ? "W" : "R",
+ si.bSystem ? "" : si.bAccessed ? "A" : ""
+ );
+
+ selector+=8;
+ }
+
+}
+
+
+//
+// Dump Taskinfo;
+//
+// If no argument, dump all wow tasks.
+// If 0, dump current WOW task
+// Else dump the specifies task {which is thread-id as shown by
+// ~ command under ntsd like 37.6b so thread-id is 6b)
+//
+
+void DumpTaskInfo (ptd,mode)
+PTD ptd;
+int mode;
+{
+
+ ULONG Base;
+ TDB tdb;
+ BOOL b;
+
+ Base = GetInfoFromSelector( ptd->htask16, mode, NULL );
+ b = ReadProcessMem( hCurrentProcess,
+ (LPVOID) (Base+GetIntelBase()),
+ &tdb,
+ sizeof(tdb),
+ NULL );
+
+ if ( !b ) {
+ PRINTF("Failure reading TDB at %X\n", Base );
+ return;
+ }
+
+ PRINTF("\nDump for ThreadId = %x\n",ptd->dwThreadID);
+ PRINTF(" Stack = %x:%x\n",HIWORD(ptd->vpStack),LOWORD(ptd->vpStack));
+ PRINTF(" HTask (TDB) = %x\n", ptd->htask16);
+ PRINTF(" HInst = %x\n", ptd->hInst16);
+ PRINTF(" HMod16 = %x\n", ptd->hMod16);
+ PRINTF(" CompatFlags = %x\n",ptd->dwWOWCompatFlags);
+ PRINTF(" HThread = %x\n",ptd->hThread);
+ PRINTF(" TDBFlags = %x\n",tdb.TDB_flags);
+ PRINTF(" ExpWinVer = %x\n",tdb.TDB_ExpWinVer);
+ PRINTF(" DTA = %x:%x\n",HIWORD(tdb.TDB_DTA),LOWORD(tdb.TDB_DTA));
+ PRINTF(" CurDir = %.64s\n",tdb.TDB_Directory);
+ PRINTF(" ModName = %.8s\n",tdb.TDB_ModName);
+}
+
+void TaskInfo (
+) {
+ VDMCONTEXT ThreadContext;
+ DWORD ThreadId;
+ PTD ptd,ptdHead;
+ TD td;
+ int mode;
+ BOOL b,fFound=FALSE;
+
+
+ mode = GetContext( &ThreadContext );
+
+ ThreadId = (DWORD)-1; // Assume Dump All Tasks
+ if (GetNextToken()) {
+ ThreadId = (DWORD) EXPRESSION( lpArgumentString );
+ }
+
+ ptdHead = (PTD)EXPRESSION("wow32!gptdTaskHead");
+
+ // get the pointer to first TD
+ b = ReadProcessMem( hCurrentProcess,
+ (LPVOID) (ptdHead),
+ &ptd,
+ sizeof(DWORD),
+ NULL );
+
+ if ( !b ) {
+ PRINTF("Failure reading gptdTaskHead at %08lX\n", ptdHead );
+ return;
+ }
+
+ // enumerate td list to find the match(es)
+ while (ptd) {
+ b = ReadProcessMem( hCurrentProcess,
+ (LPVOID) (ptd),
+ &td,
+ sizeof(TD),
+ NULL );
+ if ( !b ) {
+ PRINTF("Failure reading TD At %08lX\n", ptd );
+ return;
+ }
+
+ if (ThreadId == -1) {
+ DumpTaskInfo (&td,mode);
+ fFound = TRUE;
+ }
+ else {
+ if (ThreadId == td.dwThreadID) {
+ DumpTaskInfo (&td,mode);
+ fFound = TRUE;
+ break;
+ }
+ }
+ ptd = td.ptdNext;
+ }
+
+ if (!fFound) {
+ if (ThreadId == -1) {
+ PRINTF("No WOW Task Found.\n");
+ }
+ else
+ PRINTF("WOW Task With Thread Id = %02x Not Found.\n",ThreadId);
+ }
+ return;
+}