diff options
Diffstat (limited to 'private/mvdm/bde/bdemisc.c')
-rw-r--r-- | private/mvdm/bde/bdemisc.c | 372 |
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; +} |