class CCrashHandler { PTOP_LEVEL_EXCEPTION_FILTER m_pPrevious; public: CCrashHandler(PTOP_LEVEL_EXCEPTION_FILTER pHandler = GenerateDump) { m_pPrevious = ::SetUnhandledExceptionFilter(pHandler); } ~CCrashHandler(void) { ::SetUnhandledExceptionFilter(m_pPrevious); } private: static LONG WINAPI GenerateDump(EXCEPTION_POINTERS* pExceptionPointers) { BOOL bMiniDumpSuccessful; TCHAR szFileName[MAX_PATH] = {0}; HANDLE hDumpFile; SYSTEMTIME stLocalTime; MINIDUMP_EXCEPTION_INFORMATION ExpParam; GetLocalTime( &stLocalTime ); StringCchPrintf( szFileName, MAX_PATH, _T("%04d%02d%02d-%02d%02d%02d-%ld-%ld-b%d.dmp"), stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond, GetCurrentProcessId(), GetCurrentThreadId(), BUILD_NO); hDumpFile = CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0); ExpParam.ThreadId = GetCurrentThreadId(); ExpParam.ExceptionPointers = pExceptionPointers; ExpParam.ClientPointers = TRUE; bMiniDumpSuccessful = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithIndirectlyReferencedMemory, &ExpParam, NULL, NULL); FlushFileBuffers(hDumpFile); CloseHandle(hDumpFile); return EXCEPTION_EXECUTE_HANDLER; } }; CCrashHandler oCrashHandler;