|
|
|
|
@ -200,45 +200,85 @@ void __fastcall fault_call_stack(void *instr, STACK_FRAME *stackFrame)
|
|
|
|
|
log_printf("\r\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define CASE_EXCEPTION(v, errName) \ |
|
|
|
|
case EXCEPTION_##errName: \
|
|
|
|
|
v = #errName; \
|
|
|
|
|
break; |
|
|
|
|
char *__fastcall fault_get_error_type(DWORD dwMessageId, LPSTR lpString1, DWORD nSize) |
|
|
|
|
{ |
|
|
|
|
const char *v4; // eax
|
|
|
|
|
HMODULE ntdll; |
|
|
|
|
const char *s; |
|
|
|
|
|
|
|
|
|
switch (dwMessageId) { |
|
|
|
|
CASE_EXCEPTION(v4, STACK_OVERFLOW); |
|
|
|
|
CASE_EXCEPTION(v4, FLT_DIVIDE_BY_ZERO); |
|
|
|
|
CASE_EXCEPTION(v4, FLT_INEXACT_RESULT); |
|
|
|
|
CASE_EXCEPTION(v4, FLT_INVALID_OPERATION); |
|
|
|
|
CASE_EXCEPTION(v4, FLT_OVERFLOW); |
|
|
|
|
CASE_EXCEPTION(v4, FLT_STACK_CHECK); |
|
|
|
|
CASE_EXCEPTION(v4, FLT_UNDERFLOW); |
|
|
|
|
CASE_EXCEPTION(v4, INT_DIVIDE_BY_ZERO); |
|
|
|
|
CASE_EXCEPTION(v4, INT_OVERFLOW); |
|
|
|
|
CASE_EXCEPTION(v4, PRIV_INSTRUCTION); |
|
|
|
|
CASE_EXCEPTION(v4, FLT_DENORMAL_OPERAND); |
|
|
|
|
CASE_EXCEPTION(v4, INVALID_HANDLE); |
|
|
|
|
CASE_EXCEPTION(v4, ILLEGAL_INSTRUCTION); |
|
|
|
|
CASE_EXCEPTION(v4, NONCONTINUABLE_EXCEPTION); |
|
|
|
|
CASE_EXCEPTION(v4, INVALID_DISPOSITION); |
|
|
|
|
CASE_EXCEPTION(v4, ARRAY_BOUNDS_EXCEEDED); |
|
|
|
|
CASE_EXCEPTION(v4, IN_PAGE_ERROR); |
|
|
|
|
CASE_EXCEPTION(v4, GUARD_PAGE); |
|
|
|
|
CASE_EXCEPTION(v4, DATATYPE_MISALIGNMENT); |
|
|
|
|
CASE_EXCEPTION(v4, BREAKPOINT); |
|
|
|
|
CASE_EXCEPTION(v4, SINGLE_STEP); |
|
|
|
|
CASE_EXCEPTION(v4, ACCESS_VIOLATION); |
|
|
|
|
case EXCEPTION_STACK_OVERFLOW: |
|
|
|
|
s = "STACK_OVERFLOW"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_FLT_DIVIDE_BY_ZERO: |
|
|
|
|
s = "FLT_DIVIDE_BY_ZERO"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_FLT_INEXACT_RESULT: |
|
|
|
|
s = "FLT_INEXACT_RESULT"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_FLT_INVALID_OPERATION: |
|
|
|
|
s = "FLT_INVALID_OPERATION"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_FLT_OVERFLOW: |
|
|
|
|
s = "FLT_OVERFLOW"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_FLT_STACK_CHECK: |
|
|
|
|
s = "FLT_STACK_CHECK"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_FLT_UNDERFLOW: |
|
|
|
|
s = "FLT_UNDERFLOW"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_INT_DIVIDE_BY_ZERO: |
|
|
|
|
s = "INT_DIVIDE_BY_ZERO"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_INT_OVERFLOW: |
|
|
|
|
s = "INT_OVERFLOW"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_PRIV_INSTRUCTION: |
|
|
|
|
s = "PRIV_INSTRUCTION"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_FLT_DENORMAL_OPERAND: |
|
|
|
|
s = "FLT_DENORMAL_OPERAND"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_INVALID_HANDLE: |
|
|
|
|
s = "INVALID_HANDLE"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_ILLEGAL_INSTRUCTION: |
|
|
|
|
s = "ILLEGAL_INSTRUCTION"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_NONCONTINUABLE_EXCEPTION: |
|
|
|
|
s = "NONCONTINUABLE_EXCEPTION"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_INVALID_DISPOSITION: |
|
|
|
|
s = "INVALID_DISPOSITION"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: |
|
|
|
|
s = "ARRAY_BOUNDS_EXCEEDED"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_IN_PAGE_ERROR: |
|
|
|
|
s = "IN_PAGE_ERROR"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_GUARD_PAGE: |
|
|
|
|
s = "GUARD_PAGE"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_DATATYPE_MISALIGNMENT: |
|
|
|
|
s = "DATATYPE_MISALIGNMENT"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_BREAKPOINT: |
|
|
|
|
s = "BREAKPOINT"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_SINGLE_STEP: |
|
|
|
|
s = "SINGLE_STEP"; |
|
|
|
|
break; |
|
|
|
|
case EXCEPTION_ACCESS_VIOLATION: |
|
|
|
|
s = "ACCESS_VIOLATION"; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
ntdll = GetModuleHandle("NTDLL.DLL"); |
|
|
|
|
if (!FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, (LPCVOID)ntdll, dwMessageId, 0, lpString1, nSize, NULL)) { |
|
|
|
|
v4 = "*unknown*"; |
|
|
|
|
if (FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, (LPCVOID)GetModuleHandle("NTDLL.DLL"), dwMessageId, 0, lpString1, nSize, NULL)) { |
|
|
|
|
return lpString1; |
|
|
|
|
} |
|
|
|
|
s = "*unknown*"; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
lstrcpyn(lpString1, v4, nSize); |
|
|
|
|
lstrcpyn(lpString1, s, nSize); |
|
|
|
|
return lpString1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|