/*++ Copyright (c) 1990 Microsoft Corporation Module Name: ntsdexts.c Abstract: This function contains miscellaneous VDMEXTS functions Author: Bob Day (bobday) 29-Feb-1992 Grabbed standard header Revision History: Neil Sandlin (NeilSa) 15-Jan-1996 Merged with vdmexts --*/ #include #pragma hdrstop #include VOID PrintOneFaultVector( int vector, ULONG pHandler ) { VDM_FAULTHANDLER handler; char sym_text[255]; ULONG dist; PRINTF("%02X: ", vector); if (!READMEM((LPVOID)pHandler, &handler, sizeof(VDM_FAULTHANDLER))) { PRINTF("\n"); return; } PRINTF("%04LX:%08lX ", handler.CsSelector, handler.Eip); if (FindSymbol(handler.CsSelector, handler.Eip, sym_text, &dist, BEFORE, PROT_MODE )) { if ( dist == 0 ) { PRINTF("%s", sym_text ); } else { PRINTF("%s+0x%lx", sym_text, dist ); } } PRINTF("\n"); } VOID df( CMD_ARGLIST ) { int vector = -1; LPVOID pHandlers; CMD_INIT(); if (GetNextToken()) { vector = EvaluateToken(); if ((vector < 0) || (vector > 0x1f)) { PRINTF("Invalid fault vector\n"); return; } } pHandlers = (LPVOID) EXPRESSION("ntvdm!dpmifaulthandlers"); if (!pHandlers) { PRINTF("Could get symbol ntvdm!dpmifaulthandlers\n"); return; } if (vector >= 0) { PrintOneFaultVector(vector, (ULONG)pHandlers + vector*sizeof(VDM_FAULTHANDLER)); } else for (vector = 0; vector < 0x20; vector++) { PrintOneFaultVector(vector, (ULONG)pHandlers + vector*sizeof(VDM_FAULTHANDLER)); } } VOID PrintOneInterruptVector( int vector, ULONG pHandler ) { VDM_INTERRUPTHANDLER handler; char sym_text[255]; ULONG dist; PRINTF("%02X: ", vector); if (!READMEM((LPVOID)pHandler, &handler, sizeof(VDM_INTERRUPTHANDLER))) { PRINTF("\n"); return; } PRINTF("%04LX:%08lX ", handler.CsSelector, handler.Eip); if (FindSymbol(handler.CsSelector, handler.Eip, sym_text, &dist, BEFORE, PROT_MODE )) { if ( dist == 0 ) { PRINTF("%s", sym_text ); } else { PRINTF("%s+0x%lx", sym_text, dist ); } } PRINTF("\n"); } VOID di( CMD_ARGLIST ) { int vector = -1; LPVOID pHandlers; CMD_INIT(); if (GetNextToken()) { vector = EvaluateToken(); if ((vector < 0) || (vector > 0xff)) { PRINTF("Invalid interrupt vector\n"); return; } } pHandlers = (LPVOID) EXPRESSION("ntvdm!dpmiinterrupthandlers"); if (!pHandlers) { PRINTF("Could get symbol ntvdm!dpmiinterrupthandlers\n"); return; } if (vector >= 0) { PrintOneInterruptVector(vector, (ULONG)pHandlers + vector*sizeof(VDM_INTERRUPTHANDLER)); } else for (vector = 0; vector < 0x100; vector++) { PrintOneInterruptVector(vector, (ULONG)pHandlers + vector*sizeof(VDM_INTERRUPTHANDLER)); } } VOID rmcb( CMD_ARGLIST ) { RMCB_INFO Rmcb[MAX_RMCBS]; USHORT RMCallBackBopSeg; USHORT RMCallBackBopOffset; int i; int count = 0; CMD_INIT(); if (!ReadMemExpression("ntvdm!DpmiRmcb", &Rmcb, MAX_RMCBS*sizeof(RMCB_INFO))) { return; } if (!ReadMemExpression("ntvdm!RMCallBackBopSeg", &RMCallBackBopSeg, 2)) { return; } if (!ReadMemExpression("ntvdm!RMCallBackBopOffset", &RMCallBackBopOffset, 2)) { return; } for (i=0; i\n"); return; } pMem = (ULONG) MemBlock.Next; if (pMem == Head) { PRINTF("The list is empty.\n"); } else { PRINTF("Address Length Owner Sel Cnt Next Prev\n"); while (pMem != Head) { if (!READMEM((LPVOID)(pMem), &MemBlock, sizeof(MEM_DPMI))) { PRINTF("\n", pMem); return; } PRINTF("%.08X %.08X %.04X %.04X %.04X %.08X %.08X\n", MemBlock.Address, MemBlock.Length, MemBlock.Owner, MemBlock.Sel, MemBlock.SelCount, MemBlock.Next, MemBlock.Prev); pMem = (ULONG) MemBlock.Next; Count++; if (Count>100) { PRINTF("Possible Corruption\n"); return; } } } } VOID dpx( CMD_ARGLIST ) { CMD_INIT(); PRINTF("\n*** Dpmi XMEM Allocation chain ***\n\n"); DumpDpmiMemChain(EXPRESSION("ntvdm!XmemHead")); } VOID dpd( CMD_ARGLIST ) { CMD_INIT(); PRINTF("\n*** Dpmi DOSMEM Allocation chain ***\n\n"); DumpDpmiMemChain(EXPRESSION("ntvdm!DosMemHead")); }