7 #pragma warning( disable : 4189 ) // local variable is initialized but not referenced 8 #pragma warning( disable : 4312 ) // cast trunc 9 #pragma warning( disable : 4311 ) // cast trunc 10 #pragma warning( disable : 4302 ) // cast trunc 70 if ( _tcslen( pszDot ) >= 3 )
71 _tcscpy( pszDot, _T(
"RPT" ) );
88 if ( _tcslen( pszLogFileName ) <= 260 )
100 CreateFile(
m_szLogFileName, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH, 0 );
115 return EXCEPTION_CONTINUE_SEARCH;
125 _tprintf( _T(
"//=====================================================\n" ) );
127 PEXCEPTION_RECORD pExceptionRecord = pExceptionInfo->ExceptionRecord;
130 _tprintf( _T(
"Exception code: %08X %s\n" ), pExceptionRecord->ExceptionCode,
134 TCHAR szFaultingModule[MAX_PATH];
135 DWORD section, offset;
137 sizeof( szFaultingModule ), section, offset );
139 _tprintf( _T(
"Fault address: %08X %02X:%08X %s\n" ), pExceptionRecord->ExceptionAddress,
140 section, offset, szFaultingModule );
142 PCONTEXT pCtx = pExceptionInfo->ContextRecord;
145 #ifdef _M_IX86 // Intel Only! 148 _tprintf( _T(
"EAX:%08X\nEBX:%08X\nECX:%08X\nEDX:%08X\nESI:%08X\nEDI:%08X\n"), pCtx->Eax,
149 pCtx->Ebx, pCtx->Ecx, pCtx->Edx, pCtx->Esi, pCtx->Edi );
151 _tprintf( _T(
"CS:EIP:%04X:%08X\n"), pCtx->SegCs, pCtx->Eip );
152 _tprintf( _T(
"SS:ESP:%04X:%08X EBP:%08X\n"), pCtx->SegSs, pCtx->Esp, pCtx->Ebp );
153 _tprintf( _T(
"DS:%04X ES:%04X FS:%04X GS:%04X\n"), pCtx->SegDs, pCtx->SegEs, pCtx->SegFs,
155 _tprintf( _T(
"Flags:%08X\n"), pCtx->EFlags );
161 OutputDebugString( _T(
"IMAGEHLP.DLL or its exported procs not found" ) );
163 #ifdef _M_IX86 // Intel Only! 187 #define EXCEPTION( x ) \ 188 case EXCEPTION_##x: \ 220 static TCHAR szBuffer[512] = {0};
222 FormatMessage( FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_HMODULE,
223 GetModuleHandle( _T(
"NTDLL.DLL" ) ), dwCode, 0, szBuffer,
sizeof( szBuffer ), 0 );
238 MEMORY_BASIC_INFORMATION mbi;
240 if ( !VirtualQuery( addr, &mbi,
sizeof( mbi ) ) )
245 if ( !GetModuleFileName( (HMODULE)hMod, szModule, len ) )
249 PIMAGE_DOS_HEADER pDosHdr = (PIMAGE_DOS_HEADER)hMod;
252 PIMAGE_NT_HEADERS pNtHdr = ( PIMAGE_NT_HEADERS )( hMod + pDosHdr->e_lfanew );
254 PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION( pNtHdr );
260 for (
unsigned i = 0; i < pNtHdr->FileHeader.NumberOfSections; i++, pSection++ )
262 DWORD sectionStart = pSection->VirtualAddress;
264 sectionStart + std::max( pSection->SizeOfRawData, pSection->Misc.VirtualSize );
267 if ( ( rva >= sectionStart ) && ( rva <= sectionEnd ) )
273 offset = rva - sectionStart;
289 _tprintf( _T(
"Address Frame Logical addr Module\n") );
291 DWORD pc = pContext->Eip;
292 PDWORD pFrame, pPrevFrame;
294 pFrame = (
PDWORD)pContext->Ebp;
298 TCHAR szModule[MAX_PATH] = _T(
"");
299 DWORD section = 0, offset = 0;
303 _tprintf( _T(
"%08X %08X %04X:%08X %s\n"), pc, pFrame, section, offset, szModule );
309 pFrame = (
PDWORD)pFrame[0];
311 if ( (
DWORD)pFrame & 3 )
314 if ( pFrame <= pPrevFrame )
318 if ( IsBadWritePtr( pFrame,
sizeof( PVOID ) * 2 ) )
338 memset( &sf, 0,
sizeof( sf ) );
342 sf.AddrPC.Offset = pContext->Eip;
343 sf.AddrPC.Mode = AddrModeFlat;
344 sf.AddrStack.Offset = pContext->Esp;
345 sf.AddrStack.Mode = AddrModeFlat;
346 sf.AddrFrame.Offset = pContext->Ebp;
347 sf.AddrFrame.Mode = AddrModeFlat;
351 if ( !
_StackWalk( IMAGE_FILE_MACHINE_I386, GetCurrentProcess(), GetCurrentThread(), &sf,
355 if ( 0 == sf.AddrFrame.Offset )
358 _tprintf( _T(
"%08X %08X "), sf.AddrPC.Offset, sf.AddrFrame.Offset );
368 BYTE symbolBuffer[
sizeof( IMAGEHLP_SYMBOL ) + 512];
370 pSymbol->SizeOfStruct =
sizeof( symbolBuffer );
371 pSymbol->MaxNameLength = 512;
373 DWORD symDisplacement = 0;
376 if (
_SymGetSymFromAddr( GetCurrentProcess(), sf.AddrPC.Offset, &symDisplacement, pSymbol ) )
378 _tprintf( _T(
"%hs+%X\n"), pSymbol->Name, symDisplacement );
382 TCHAR szModule[MAX_PATH] = _T(
"");
383 DWORD section = 0, offset = 0;
385 GetLogicalAddress( (PVOID)sf.AddrPC.Offset, szModule,
sizeof( szModule ), section, offset );
387 _tprintf( _T(
"%04X:%08X %s\n"), section, offset, szModule );
404 va_start( argptr, format );
405 retValue = wvsprintf( szBuff, format, argptr );
420 HMODULE hModImagehlp = LoadLibrary( _T(
"IMAGEHLP.DLL" ) );
424 _SymInitialize = (SYMINITIALIZEPROC)GetProcAddress( hModImagehlp,
"SymInitialize" );
427 FreeLibrary( hModImagehlp );
432 _SymCleanup = (SYMCLEANUPPROC)GetProcAddress( hModImagehlp,
"SymCleanup" );
435 FreeLibrary( hModImagehlp );
439 _StackWalk = (STACKWALKPROC)GetProcAddress( hModImagehlp,
"StackWalk" );
442 FreeLibrary( hModImagehlp );
447 (SYMFUNCTIONTABLEACCESSPROC)GetProcAddress( hModImagehlp,
"SymFunctionTableAccess" );
451 FreeLibrary( hModImagehlp );
455 _SymGetModuleBase = (SYMGETMODULEBASEPROC)GetProcAddress( hModImagehlp,
"SymGetModuleBase" );
458 FreeLibrary( hModImagehlp );
462 _SymGetSymFromAddr = (SYMGETSYMFROMADDRPROC)GetProcAddress( hModImagehlp,
"SymGetSymFromAddr" );
465 FreeLibrary( hModImagehlp );
471 FreeLibrary( hModImagehlp );
static TCHAR m_szLogFileName[MAX_PATH]
static LPTOP_LEVEL_EXCEPTION_FILTER m_previousFilter
static int __cdecl _tprintf(const TCHAR *format,...)
static SYMFUNCTIONTABLEACCESSPROC _SymFunctionTableAccess
MSJExceptionHandler g_MSJExceptionHandler
static LONG WINAPI MSJUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
static SYMGETMODULEBASEPROC _SymGetModuleBase
static LPTSTR GetExceptionString(DWORD dwCode)
static STACKWALKPROC _StackWalk
void SetLogFileName(PTSTR pszLogFileName)
static HANDLE m_hReportFile
static void IntelStackWalk(PCONTEXT pContext)
static SYMGETSYMFROMADDRPROC _SymGetSymFromAddr
static SYMINITIALIZEPROC _SymInitialize
static void ImagehlpStackWalk(PCONTEXT pContext)
static void GenerateExceptionReport(PEXCEPTION_POINTERS pExceptionInfo)
static BOOL InitImagehlpFunctions(void)
static BOOL GetLogicalAddress(PVOID addr, PTSTR szModule, DWORD len, DWORD §ion, DWORD &offset)
static SYMCLEANUPPROC _SymCleanup