Browse Source

fault: fault_get_error_type bin exact

fault.cpp is now bin exact

Fixes #242.
pull/78/head
Robin Eklind 7 years ago
parent
commit
25f45b6bd5
  1. 104
      Source/fault.cpp

104
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;
}

Loading…
Cancel
Save