From d680af0a4a36aab511acf35db5b217a7dbf67d4d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Sep 2024 17:09:24 +0200 Subject: [PATCH] dynamically load Dbghelp.dll --- Makefile | 2 +- cnc-ddraw.vcxproj | 6 ++--- src/debug.c | 69 ++++++++++++++++++++++++++++------------------- 3 files changed, 45 insertions(+), 32 deletions(-) diff --git a/Makefile b/Makefile index 6ce2b4c..08d74da 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ TARGET ?= ddraw.dll LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS ?= -Iinc -O2 -Wall -std=c99 -LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 -lMsimg32 +LIBS = -lgdi32 -lwinmm -lole32 -lMsimg32 COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 992cb3e..70bd817 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -222,7 +222,7 @@ Windows - dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def @@ -348,7 +348,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def @@ -390,7 +390,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def diff --git a/src/debug.c b/src/debug.c index 5c0c9f4..a8202f8 100644 --- a/src/debug.c +++ b/src/debug.c @@ -39,51 +39,64 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { g_dbg_crash_count++; -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) - HANDLE dmp = - CreateFile( - g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_WRITE | FILE_SHARE_READ, - 0, - CREATE_ALWAYS, - 0, - 0); + BOOL(WINAPI * MiniDumpWriteDumpProc)( + HANDLE, + DWORD, + HANDLE, + MINIDUMP_TYPE, + PMINIDUMP_EXCEPTION_INFORMATION, + PMINIDUMP_USER_STREAM_INFORMATION, + PMINIDUMP_CALLBACK_INFORMATION + ); - if (dmp != INVALID_HANDLE_VALUE) + MiniDumpWriteDumpProc = (void*)real_GetProcAddress(real_LoadLibraryA("Dbghelp.dll"), "MiniDumpWriteDump"); + if (MiniDumpWriteDumpProc) { - MINIDUMP_EXCEPTION_INFORMATION info; - info.ThreadId = GetCurrentThreadId(); - info.ExceptionPointers = exception; - info.ClientPointers = TRUE; + HANDLE dmp = + CreateFile( + g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_WRITE | FILE_SHARE_READ, + 0, + CREATE_ALWAYS, + 0, + 0); - MiniDumpWriteDump( - GetCurrentProcess(), - GetCurrentProcessId(), - dmp, - 0, - &info, - NULL, - NULL); + if (dmp != INVALID_HANDLE_VALUE) + { + MINIDUMP_EXCEPTION_INFORMATION info; + info.ThreadId = GetCurrentThreadId(); + info.ExceptionPointers = exception; + info.ClientPointers = TRUE; - CloseHandle(dmp); + MiniDumpWriteDump( + GetCurrentProcess(), + GetCurrentProcessId(), + dmp, + 0, + &info, + NULL, + NULL); + + CloseHandle(dmp); + } } -#endif if (exception && exception->ExceptionRecord) { HMODULE mod = NULL; char filename[MAX_PATH] = { 0 }; -#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) - if (GetModuleHandleExA( + BOOL(WINAPI * getModuleHandleExA)(DWORD, LPCSTR, HMODULE*) = + (void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "GetModuleHandleExA"); + + if (getModuleHandleExA && getModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, exception->ExceptionRecord->ExceptionAddress, &mod)) { GetModuleFileNameA(mod, filename, sizeof(filename) - 1); } -#endif TRACE( "Exception at %p (%p+%p), Code=%08X - %s\n",