83 lines
2.2 KiB
C
83 lines
2.2 KiB
C
//
|
|
// Standard __except handler to dump stack and code around eip
|
|
//
|
|
|
|
__except(memcpy(&exinfo, GetExceptionInformation(), sizeof(struct _EXCEPTION_POINTERS)), EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
unsigned __int32 SPPtr = 0;
|
|
unsigned __int32 SPVal = 0;
|
|
unsigned __int32 eip = 0;
|
|
unsigned __int32 rev = 0;
|
|
int i;
|
|
|
|
DWORD Stack[16];
|
|
DWORD CodeDump[16];
|
|
|
|
#ifndef _WIN64
|
|
|
|
eip = exinfo.ContextRecord->Eip;
|
|
SPPtr = exinfo.ContextRecord->Esp;
|
|
|
|
__asm
|
|
{
|
|
mov eax, SPPtr
|
|
mov SPVal,eax
|
|
lea edi,Stack
|
|
mov esi,eax
|
|
mov ecx,64
|
|
rep movsb
|
|
|
|
lea edi,CodeDump
|
|
mov esi,eip
|
|
mov ecx,64
|
|
rep movsb
|
|
}
|
|
|
|
|
|
|
|
Debugprintf("BPQ32 *** Program Error %x at %x in %s",
|
|
exinfo.ExceptionRecord->ExceptionCode, exinfo.ExceptionRecord->ExceptionAddress, EXCEPTMSG);
|
|
|
|
Debugprintf("EAX %x EBX %x ECX %x EDX %x ESI %x EDI %x ESP %x",
|
|
exinfo.ContextRecord->Eax, exinfo.ContextRecord->Ebx, exinfo.ContextRecord->Ecx,
|
|
exinfo.ContextRecord->Edx, exinfo.ContextRecord->Esi, exinfo.ContextRecord->Edi, SPVal);
|
|
|
|
#endif
|
|
|
|
Debugprintf("Stack:");
|
|
|
|
Debugprintf("%08x %08x %08x %08x %08x %08x %08x %08x %08x ",
|
|
SPVal, Stack[0], Stack[1], Stack[2], Stack[3], Stack[4], Stack[5], Stack[6], Stack[7]);
|
|
|
|
Debugprintf("%08x %08x %08x %08x %08x %08x %08x %08x %08x ",
|
|
SPVal+32, Stack[8], Stack[9], Stack[10], Stack[11], Stack[12], Stack[13], Stack[14], Stack[15]);
|
|
|
|
Debugprintf("Code:");
|
|
|
|
for (i = 0; i < 16; i++)
|
|
{
|
|
rev = (CodeDump[i] & 0xff) << 24;
|
|
rev |= (CodeDump[i] & 0xff00) << 8;
|
|
rev |= (CodeDump[i] & 0xff0000) >> 8;
|
|
rev |= (CodeDump[i] & 0xff000000) >> 24;
|
|
|
|
CodeDump[i] = rev;
|
|
}
|
|
|
|
Debugprintf("%08x %08x %08x %08x %08x %08x %08x %08x %08x ",
|
|
eip, CodeDump[0], CodeDump[1], CodeDump[2], CodeDump[3], CodeDump[4], CodeDump[5], CodeDump[6], CodeDump[7]);
|
|
|
|
Debugprintf("%08x %08x %08x %08x %08x %08x %08x %08x %08x ",
|
|
eip+32, CodeDump[8], CodeDump[9], CodeDump[10], CodeDump[11], CodeDump[12], CodeDump[13], CodeDump[14], CodeDump[15]);
|
|
|
|
WriteMiniDump();
|
|
|
|
// Note - no closing } so additional code may be run in the __except block
|
|
|
|
#ifdef MDIKERNEL
|
|
if (CloseOnError == 1)
|
|
CloseAllNeeded = 1;
|
|
#endif
|
|
|
|
#undef EXCEPTMSG
|