From d7fc37cef1a7121856897a762b2b7d4102d42894 Mon Sep 17 00:00:00 2001 From: Tristan 'Natrist' Cormier Date: Mon, 20 Mar 2023 22:51:46 -0400 Subject: [PATCH] feat(error): add exception-to-string translation for windows --- storm/CMakeLists.txt | 2 + storm/Error.cpp | 3 +- storm/error/win/Error.cpp | 101 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 storm/error/win/Error.cpp diff --git a/storm/CMakeLists.txt b/storm/CMakeLists.txt index c204bee..cf09951 100644 --- a/storm/CMakeLists.txt +++ b/storm/CMakeLists.txt @@ -8,12 +8,14 @@ file(GLOB STORM_SOURCES "queue/*.cpp" "string/*.cpp" "thread/*.cpp" + "error/*.cpp" ) if(WHOA_SYSTEM_WIN) file(GLOB STORM_WIN_SOURCES "win/*.cpp" "thread/win/*.cpp" + "error/win/*.cpp" ) list(APPEND STORM_SOURCES ${STORM_WIN_SOURCES}) endif() diff --git a/storm/Error.cpp b/storm/Error.cpp index bbbd3dc..9c8b239 100644 --- a/storm/Error.cpp +++ b/storm/Error.cpp @@ -77,9 +77,8 @@ void SErrPrepareAppFatal(const char* filename, int32_t linenumber) { void SErrSetLastError(uint32_t errorcode) { s_lasterror = errorcode; - #if defined(WHOA_SYSTEM_WIN) - SetLastError(errorcode); + SetLastError(errorcode); #endif } diff --git a/storm/error/win/Error.cpp b/storm/error/win/Error.cpp new file mode 100644 index 0000000..7dabc28 --- /dev/null +++ b/storm/error/win/Error.cpp @@ -0,0 +1,101 @@ +#include "storm/Error.hpp" +#include "storm/String.hpp" +#include +#include +#include +#include + +void GetExceptionNameWin32(DWORD dwMessageId, char* lpBuffer, DWORD nSize) { + switch (dwMessageId) { + case EXCEPTION_GUARD_PAGE: + SStrCopy(lpBuffer, "GUARD_PAGE", nSize); + break; + + case EXCEPTION_DATATYPE_MISALIGNMENT: + SStrCopy(lpBuffer, "DATATYPE_MISALIGNMENT", nSize); + break; + + case EXCEPTION_BREAKPOINT: + SStrCopy(lpBuffer, "BREAKPOINT", nSize); + break; + + case EXCEPTION_SINGLE_STEP: + SStrCopy(lpBuffer, "SINGLE_STEP", nSize); + break; + + case EXCEPTION_ACCESS_VIOLATION: + SStrCopy(lpBuffer, "ACCESS_VIOLATION", nSize); + break; + + case EXCEPTION_IN_PAGE_ERROR: + SStrCopy(lpBuffer, "IN_PAGE_ERROR", nSize); + break; + + case EXCEPTION_INVALID_HANDLE: + SStrCopy(lpBuffer, "INVALID_HANDLE", nSize); + break; + + case EXCEPTION_ILLEGAL_INSTRUCTION: + SStrCopy(lpBuffer, "ILLEGAL_INSTRUCTION", nSize); + break; + + case EXCEPTION_NONCONTINUABLE_EXCEPTION: + SStrCopy(lpBuffer, "NONCONTINUABLE_EXCEPTION", nSize); + break; + + case EXCEPTION_INVALID_DISPOSITION: + SStrCopy(lpBuffer, "INVALID_DISPOSITION", nSize); + break; + + case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: + SStrCopy(lpBuffer, "ARRAY_BOUNDS_EXCEEDED", nSize); + break; + + case EXCEPTION_FLT_DENORMAL_OPERAND: + SStrCopy(lpBuffer, "FLT_DENORMAL_OPERAND", nSize); + break; + + case EXCEPTION_FLT_DIVIDE_BY_ZERO: + SStrCopy(lpBuffer, "FLT_DIVIDE_BY_ZERO", nSize); + break; + + case EXCEPTION_FLT_INEXACT_RESULT: + SStrCopy(lpBuffer, "FLT_INEXACT_RESULT", nSize); + break; + + case EXCEPTION_FLT_OVERFLOW: + SStrCopy(lpBuffer, "FLT_OVERFLOW", nSize); + break; + + case EXCEPTION_FLT_STACK_CHECK: + SStrCopy(lpBuffer, "FLT_STACK_CHECK", nSize); + break; + + case EXCEPTION_FLT_UNDERFLOW: + SStrCopy(lpBuffer, "FLT_UNDERFLOW", nSize); + break; + + case EXCEPTION_INT_DIVIDE_BY_ZERO: + SStrCopy(lpBuffer, "INT_DIVIDE_BY_ZERO", nSize); + break; + + case EXCEPTION_INT_OVERFLOW: + SStrCopy(lpBuffer, "INT_OVERFLOW", nSize); + break; + + case EXCEPTION_PRIV_INSTRUCTION: + SStrCopy(lpBuffer, "PRIV_INSTRUCTION", nSize); + break; + + case EXCEPTION_STACK_OVERFLOW: + SStrCopy(lpBuffer, "STACK_OVERFLOW", nSize); + break; + + default: + HMODULE lpSource = GetModuleHandle("ntdll.dll"); + if (!lpSource || !FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, lpSource, dwMessageId, 0, lpBuffer, nSize, nullptr)) { + SStrCopy(lpBuffer, "unknown exception", nSize); + } + break; + } +}