forked from kikidong/avbot
/
minidump.cpp
62 lines (54 loc) · 1.58 KB
/
minidump.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <windows.h>
#include <DbgHelp.h>
static BOOL CALLBACK mini_dump_callback(PVOID param, const PMINIDUMP_CALLBACK_INPUT input, PMINIDUMP_CALLBACK_OUTPUT output)
{
if (input == 0 || output == 0)
return FALSE;
switch (input->CallbackType)
{
case ModuleCallback:
case IncludeModuleCallback:
case IncludeThreadCallback:
case ThreadCallback:
case ThreadExCallback:
case MemoryCallback:
return TRUE;
default:
;
}
return FALSE;
}
static void create_mini_dump(PEXCEPTION_POINTERS pep, LPCTSTR filename)
{
HANDLE file = CreateFile(filename, GENERIC_READ | GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (file && file != INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION mei;
mei.ThreadId = GetCurrentThreadId();
mei.ExceptionPointers = pep;
mei.ClientPointers = FALSE;
MINIDUMP_CALLBACK_INFORMATION mci;
mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)mini_dump_callback;
mci.CallbackParam = 0;
MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory |
MiniDumpWithDataSegs |
MiniDumpWithHandleData |
MiniDumpWithFullMemoryInfo |
MiniDumpWithThreadInfo |
MiniDumpWithUnloadedModules);
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
file, mdt, (pep != 0) ? &mei : 0, 0, &mci);
CloseHandle(file);
}
}
static LONG WINAPI exception_filter(PEXCEPTION_POINTERS exception)
{
create_mini_dump(exception, TEXT("Exception.dmp"));
return EXCEPTION_EXECUTE_HANDLER;
}
extern "C" void avbot_setup_seghandler()
{
SetErrorMode(SEM_FAILCRITICALERRORS);
SetUnhandledExceptionFilter(exception_filter);
}