Newer
Older
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include "dap_common.h"
DWORD ExceptionFilter( EXCEPTION_POINTERS *ep );
void S_SetExceptionFilter( void )
{
SetErrorMode( SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX );
#ifdef WIN64
AddVectoredExceptionHandler( 1, ExceptionFilter );
#else
SetUnhandledExceptionFilter( (LPTOP_LEVEL_EXCEPTION_FILTER) ExceptionFilter );
#endif
return;
}
#if 0
typedef struct _EXCEPTION_RECORD {
DWORD ExceptionCode;
DWORD ExceptionFlags;
struct _EXCEPTION_RECORD *ExceptionRecord;
PVOID ExceptionAddress;
DWORD NumberParameters;
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD;
#endif
DWORD ExceptionFilter( EXCEPTION_POINTERS *ep )
{
// printf( "\r\nExceptionCode = 0x%0X[%s]\r\n", ep->ExceptionRecord->ExceptionCode, buff );
uint8_t buff[128];
if ( ep->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION)
memcpy( buff, "EXCEPTION_ACCESS_VIOLATION", 27 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_ARRAY_BOUNDS_EXCEEDED)
memcpy( buff, "EXCEPTION_ARRAY_BOUNDS_EXCEEDED", 32 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT)
memcpy( buff, "EXCEPTION_BREAKPOINT", 21 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_DATATYPE_MISALIGNMENT)
memcpy( buff, "EXCEPTION_DATATYPE_MISALIGNMENT", 32 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_FLT_DENORMAL_OPERAND)
memcpy( buff, "EXCEPTION_FLT_DENORMAL_OPERAND", 31 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_FLT_DIVIDE_BY_ZERO)
memcpy( buff, "EXCEPTION_FLT_DIVIDE_BY_ZERO", 29 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_FLT_INEXACT_RESULT)
memcpy( buff, "EXCEPTION_FLT_INEXACT_RESULT", 29 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_FLT_INVALID_OPERATION)
memcpy( buff, "EXCEPTION_FLT_INVALID_OPERATION", 32 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_FLT_OVERFLOW)
memcpy( buff, "EXCEPTION_FLT_OVERFLOW", 23 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_FLT_STACK_CHECK)
memcpy( buff, "EXCEPTION_FLT_STACK_CHECK", 26 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_FLT_UNDERFLOW)
memcpy( buff, "EXCEPTION_FLT_UNDERFLOW", 24 );
else if (ep->ExceptionRecord->ExceptionCode == STATUS_ILLEGAL_INSTRUCTION)
memcpy( buff, "EXCEPTION_ILLEGAL_INSTRUCTION", 30 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_IN_PAGE_ERROR)
memcpy( buff, "EXCEPTION_IN_PAGE_ERROR", 24 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_INT_DIVIDE_BY_ZERO)
memcpy( buff, "EXCEPTION_INT_DIVIDE_BY_ZERO", 29 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_INT_OVERFLOW)
memcpy( buff, "EXCEPTION_INT_OVERFLOW", 23 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_INVALID_DISPOSITION)
memcpy( buff, "EXCEPTION_INVALID_DISPOSITION", 30 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_NONCONTINUABLE_EXCEPTION)
memcpy( buff, "EXCEPTION_NONCONTINUABLE_EXCEPTION", 35 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_PRIV_INSTRUCTION)
memcpy( buff, "EXCEPTION_PRIV_INSTRUCTION", 27 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP)
memcpy( buff, "EXCEPTION_SINGLE_STEP", 22 );
else if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_STACK_OVERFLOW)
memcpy( buff, "EXCEPTION_STACK_OVERFLOW", 25 );
else
memcpy( buff, "EXCEPTION_UNKNOWN", 18 );
HANDLE hConOut = GetStdHandle( STD_OUTPUT_HANDLE );
SetConsoleTextAttribute( hConOut, 12 );
printf( "\r\nExceptionCode = 0x%0X[%s]\r\n", ep->ExceptionRecord->ExceptionCode, buff );
SetConsoleTextAttribute( hConOut, 7 );
dap_common_deinit( ); // close log file
Beep( 1000, 200 );
Sleep( 1000 );
getch( );
ExitProcess( -1 );
return 0;
}