diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj
index d58bc6c..aea7ddb 100644
--- a/cnc-ddraw.vcxproj
+++ b/cnc-ddraw.vcxproj
@@ -167,7 +167,7 @@
Windows
- 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)
+ 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)
ddraw.def
@@ -214,7 +214,7 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)"
Windows
true
true
- 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)
+ 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)
ddraw.def
diff --git a/inc/debug.h b/inc/debug.h
index de42ee0..37475c5 100644
--- a/inc/debug.h
+++ b/inc/debug.h
@@ -4,7 +4,7 @@
#define WIN32_LEAN_AND_MEAN
#include
-
+int dbg_exception_handler(EXCEPTION_POINTERS* exception);
void dbg_counter_start();
double dbg_counter_stop();
void dbg_debug_string(const char *format, ...);
diff --git a/src/debug.c b/src/debug.c
index bf23214..ff43323 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -1,4 +1,5 @@
#include
+#include >
#include
#include "dd.h"
#include "ddraw.h"
@@ -12,6 +13,37 @@ DWORD g_dbg_frame_count = 0;
static LONGLONG g_dbg_counter_start_time = 0;
static double g_dbg_counter_freq = 0.0;
+#if _DEBUG
+int dbg_exception_handler(EXCEPTION_POINTERS* exception)
+{
+ HANDLE dmp =
+ CreateFile(
+ "cnc-ddraw.dmp",
+ GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_WRITE | FILE_SHARE_READ,
+ 0,
+ CREATE_ALWAYS,
+ 0,
+ 0);
+
+ MINIDUMP_EXCEPTION_INFORMATION info;
+ info.ThreadId = GetCurrentThreadId();
+ info.ExceptionPointers = exception;
+ info.ClientPointers = TRUE;
+
+ MiniDumpWriteDump(
+ GetCurrentProcess(),
+ GetCurrentProcessId(),
+ dmp,
+ 0,
+ &info,
+ NULL,
+ NULL);
+
+ return EXCEPTION_EXECUTE_HANDLER;
+}
+#endif
+
void dbg_init()
{
static int stdout_open = 0;
diff --git a/src/dllmain.c b/src/dllmain.c
index a453249..a03c32f 100644
--- a/src/dllmain.c
+++ b/src/dllmain.c
@@ -32,6 +32,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
#if _DEBUG
dbg_init();
dprintf("cnc-ddraw = %p\n", hDll);
+ SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler);
#endif
g_ddraw_module = hDll;