From 25f45b6bd5a6dfced8d658ec19de66518b9a946e Mon Sep 17 00:00:00 2001 From: Robin Eklind Date: Thu, 4 Apr 2019 00:55:07 +0900 Subject: [PATCH] fault: fault_get_error_type bin exact fault.cpp is now bin exact Fixes #242. --- Source/fault.cpp | 104 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 72 insertions(+), 32 deletions(-) diff --git a/Source/fault.cpp b/Source/fault.cpp index 73f58968b..4b0dedb86 100644 --- a/Source/fault.cpp +++ b/Source/fault.cpp @@ -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; }