1
0
mirror of https://github.com/djhackersdev/bemanitools.git synced 2024-11-14 18:27:36 +01:00

util/signal: Expose signal_exception_code_to_str

Can be re-used in inject/debugger to avoid code duplication
This commit is contained in:
icex2 2020-09-02 19:59:55 +02:00
parent 32c3428c59
commit f23d3531a2
2 changed files with 75 additions and 60 deletions

View File

@ -7,7 +7,8 @@
static signal_shutdown_handler_t shutdown_handler;
static const char* control_code_to_str(DWORD ctrl_code) {
static const char* control_code_to_str(DWORD ctrl_code)
{
switch (ctrl_code) {
case CTRL_C_EVENT:
return "CTRL_C_EVENT";
@ -25,8 +26,67 @@ static const char* control_code_to_str(DWORD ctrl_code) {
}
}
static const char* exception_code_to_str(struct _EXCEPTION_RECORD *exception_record) {
switch (exception_record->ExceptionCode) {
static BOOL WINAPI console_ctrl_handler(DWORD dwCtrlType)
{
log_misc("Console ctrl handler called: %s", control_code_to_str(dwCtrlType));
if (dwCtrlType == CTRL_C_EVENT) {
if (shutdown_handler) {
log_misc("Executing shutdown handler");
shutdown_handler();
}
log_info("Exiting process");
ExitProcess(0);
}
return FALSE;
}
static LONG WINAPI unhandled_exception_filter(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
// no exception info provided
if (ExceptionInfo != NULL) {
struct _EXCEPTION_RECORD *ExceptionRecord = ExceptionInfo->ExceptionRecord;
log_warning(
"Exception raised: %s",
signal_exception_code_to_str(ExceptionRecord->ExceptionCode));
struct _EXCEPTION_RECORD *record_cause = ExceptionRecord->ExceptionRecord;
while (record_cause != NULL) {
log_warning("Caused by: %s", signal_exception_code_to_str(record_cause->ExceptionCode));
record_cause = record_cause->ExceptionRecord;
}
// TODO print stacktrace
log_fatal("End exception handler");
}
return EXCEPTION_CONTINUE_SEARCH;
}
void signal_exception_handler_init()
{
SetConsoleCtrlHandler(console_ctrl_handler, TRUE);
SetUnhandledExceptionFilter(unhandled_exception_filter);
log_info("Initialized");
}
void signal_register_shutdown_handler(signal_shutdown_handler_t handler)
{
shutdown_handler = handler;
log_misc("Registered shutdown handler");
}
const char* signal_exception_code_to_str(DWORD code)
{
switch (code) {
case EXCEPTION_ACCESS_VIOLATION:
return "EXCEPTION_ACCESS_VIOLATION";
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
@ -70,62 +130,7 @@ static const char* exception_code_to_str(struct _EXCEPTION_RECORD *exception_rec
case DBG_CONTROL_C:
return "DBG_CONTROL_C";
default:
log_warning("Unknown exception code: %lX", exception_record->ExceptionCode);
log_warning("Unknown exception code: %lX", code);
return "Unknown";
}
}
static BOOL WINAPI console_ctrl_handler(DWORD dwCtrlType) {
log_misc("Console ctrl handler called: %s", control_code_to_str(dwCtrlType));
if (dwCtrlType == CTRL_C_EVENT) {
if (shutdown_handler) {
log_misc("Executing shutdown handler");
shutdown_handler();
}
log_info("Exiting process");
ExitProcess(0);
}
return FALSE;
}
static LONG WINAPI unhandled_exception_filter(struct _EXCEPTION_POINTERS *ExceptionInfo) {
// no exception info provided
if (ExceptionInfo != NULL) {
struct _EXCEPTION_RECORD *ExceptionRecord = ExceptionInfo->ExceptionRecord;
log_warning("Exception raised: %s", exception_code_to_str(ExceptionRecord));
struct _EXCEPTION_RECORD *record_cause = ExceptionRecord->ExceptionRecord;
while (record_cause != NULL) {
log_warning("Caused by: %s", exception_code_to_str(record_cause));
record_cause = record_cause->ExceptionRecord;
}
// TODO print stacktrace
log_fatal("End exception handler");
}
return EXCEPTION_CONTINUE_SEARCH;
}
void signal_exception_handler_init()
{
SetConsoleCtrlHandler(console_ctrl_handler, TRUE);
SetUnhandledExceptionFilter(unhandled_exception_filter);
log_info("Initialized");
}
void signal_register_shutdown_handler(signal_shutdown_handler_t handler)
{
shutdown_handler = handler;
log_misc("Registered shutdown handler");
}

View File

@ -1,5 +1,7 @@
#pragma once
#include <windows.h>
/**
* Function signature of shutdown handler.
*/
@ -17,4 +19,12 @@ void signal_exception_handler_init();
*
* @param handler Handler function to register.
*/
void signal_register_shutdown_handler(signal_shutdown_handler_t handler);
void signal_register_shutdown_handler(signal_shutdown_handler_t handler);
/**
* Convert a (windows) exception code to a human readable representation.
*
* @param code Exception code
* @return Human readable representation of the given exception code
*/
const char* signal_exception_code_to_str(DWORD code);