| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #include <Windows.h>
- #include <dbghelp.h>
- #include <stdio.h>
- #include <tchar.h>
- static void dump_file(const TCHAR *path, EXCEPTION_POINTERS *exception)
- {
- HANDLE file = CreateFile(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- MINIDUMP_EXCEPTION_INFORMATION dump;
- dump.ExceptionPointers = exception;
- dump.ThreadId = GetCurrentThreadId();
- dump.ClientPointers = TRUE;
- MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), file, MiniDumpWithFullMemory, &dump, NULL, NULL);
- CloseHandle(file);
- }
- #if _MSC_VER >= 1300 // for VC 7.0
- // from ATL 7.0 sources
- #ifndef _delayimp_h
- extern "C" IMAGE_DOS_HEADER __ImageBase;
- #endif
- #endif
- static HMODULE get_current_module()
- {
- #if _MSC_VER < 1300 // earlier than .NET compiler (VC 6.0)
- // Here's a trick that will get you the handle of the module
- // you're running in without any a-priori knowledge:
- // http://www.dotnet247.com/247reference/msgs/13/65259.aspx
- MEMORY_BASIC_INFORMATION mbi;
- static int dummy;
- VirtualQuery(&dummy, &mbi, sizeof(mbi));
- return reinterpret_cast<HMODULE>(mbi.AllocationBase);
- #else // VC 7.0
- // from ATL 7.0 sources
- return reinterpret_cast<HMODULE>(&__ImageBase);
- #endif
- }
- static long exception_handler(EXCEPTION_POINTERS *ep)
- {
- char dmp_path[MAX_PATH] = { 0 };
- char temp_path[MAX_PATH] = { 0 };
- //c://users//appdata//local//temp//recorder.dmp
- if (GetTempPath(MAX_PATH, temp_path)) {
- sprintf_s(dmp_path, MAX_PATH, "%srecorder.dmp", temp_path);
- printf("%s\r\n", dmp_path);
- }
-
- dump_file(dmp_path, ep);
- return EXCEPTION_EXECUTE_HANDLER;
- }
- bool APIENTRY DllMain(HMODULE hModule,
- DWORD ul_reason_for_call,
- LPVOID lpReserved
- )
- {
- switch (ul_reason_for_call)
- {
- case DLL_PROCESS_ATTACH:
- SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)exception_handler);
- break;
- case DLL_THREAD_ATTACH:
- break;
- case DLL_THREAD_DETACH:
- case DLL_PROCESS_DETACH:
- break;
- }
- return TRUE;
- }
|