#include #include #include #include #include #define STACK_DUMP_SIZE 16 void printf_append( char *p, char *fmt,... ) { static char buf[256]; va_list lst; va_start( lst, fmt ); vsprintf( buf, fmt, lst ); strcat( p, buf ); va_end( lst ); } char *GetExceptionInfo( LPEXCEPTION_POINTERS lpEP, char *pszFileName ) { static char s_archExceptionInfo[2000]; static _TCHAR s_archModuleName[MAX_PATH]; PEXCEPTION_RECORD er = lpEP->ExceptionRecord; PCONTEXT ctx = lpEP->ContextRecord; LPDWORD pdwStack = ( LPDWORD ) ctx->Esp; MEMORY_BASIC_INFORMATION mbi; int nStackDWORD, f; sprintf( s_archExceptionInfo, "Exception Code: %08lX, Address: %p\r\n", er->ExceptionCode, er->ExceptionAddress ); if ( VirtualQuery (er->ExceptionAddress, &mbi, sizeof( mbi ) ) ) { GetModuleFileName( (HMODULE) mbi.AllocationBase, s_archModuleName, sizeof( s_archModuleName ) ); printf_append( s_archExceptionInfo, "Module: %s\r\n", s_archModuleName ); } printf_append( s_archExceptionInfo, "Registers:\r\n" ); printf_append( s_archExceptionInfo, "EAX:%08lX, EBX:%08lX, ECX:%08lX, EDX:%08lX, ESI:%08lX, EDI:%08lX\r\n", ctx->Eax, ctx->Ebx, ctx->Ecx, ctx->Edx, ctx->Esi, ctx->Edi ); printf_append( s_archExceptionInfo, " SS:%08lX, ESP:%08lX, EBP:%08lX, CS:%08lX, EIP:%08lX, Flags:%08lX\r\n", ctx->SegSs, ctx->Esp, ctx->Ebp, ctx->SegCs, ctx->Eip, ctx->EFlags ); printf_append( s_archExceptionInfo, " DS:%08lX, ES:%08lX, FS:%08lX, GS:%08lX\r\n", ctx->SegDs, ctx->SegEs, ctx->SegFs, ctx->SegGs ); __try { printf_append( s_archExceptionInfo, "Stack:\r\n" ); for ( nStackDWORD = 0; nStackDWORD < STACK_DUMP_SIZE; nStackDWORD++ ) { if ( ( nStackDWORD + 1 ) % 8 ) printf_append( s_archExceptionInfo, "%08lX ", pdwStack[nStackDWORD] ); else printf_append( s_archExceptionInfo, "%08lX\r\n", pdwStack[nStackDWORD] ); } printf_append( s_archExceptionInfo, "\r\n" ); } __except( EXCEPTION_EXECUTE_HANDLER ) { } if ( pszFileName ) { f = _lopen( pszFileName, OF_WRITE ); if ( f == -1 ) f = _lcreat( pszFileName, 0 ); _lwrite( f, s_archExceptionInfo, strlen( s_archExceptionInfo ) ); _lclose( f ); } return s_archExceptionInfo; }