src/win32.cpp
branchNewGRF_ports
changeset 6868 7eb395287b3d
parent 6800 6c09e1e86fcb
child 6870 ca3fd1fbe311
--- a/src/win32.cpp	Mon Aug 27 16:28:33 2007 +0000
+++ b/src/win32.cpp	Sun Sep 02 11:58:58 2007 +0000
@@ -29,6 +29,9 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <shlobj.h>
+#if defined(_MSC_VER) && !defined(WINCE)
+	#include <dbghelp.h>
+#endif
 
 static bool _has_console;
 
@@ -592,6 +595,41 @@
 		}
 	}
 
+#if !defined(_DEBUG)
+	HMODULE dbghelp = LoadLibrary(_T("dbghelp.dll"));
+	if (dbghelp != NULL) {
+		typedef BOOL (WINAPI *MiniDumpWriteDump_t)(HANDLE, DWORD, HANDLE,
+				MINIDUMP_TYPE,
+				CONST PMINIDUMP_EXCEPTION_INFORMATION,
+				CONST PMINIDUMP_USER_STREAM_INFORMATION,
+				CONST PMINIDUMP_CALLBACK_INFORMATION);
+		MiniDumpWriteDump_t funcMiniDumpWriteDump = (MiniDumpWriteDump_t)GetProcAddress(dbghelp, "MiniDumpWriteDump");
+		if (funcMiniDumpWriteDump != NULL) {
+			HANDLE file  = CreateFile(_T("crash.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
+			HANDLE proc  = GetCurrentProcess();
+			DWORD procid = GetCurrentProcessId();
+			MINIDUMP_EXCEPTION_INFORMATION mdei;
+			MINIDUMP_USER_STREAM userstream;
+			MINIDUMP_USER_STREAM_INFORMATION musi;
+			char msg[] = "****** Built on " __DATE__ " " __TIME__ ". ******";
+
+			userstream.Type        = LastReservedStream + 1;
+			userstream.Buffer      = msg;
+			userstream.BufferSize  = sizeof(msg);
+
+			musi.UserStreamCount   = 1;
+			musi.UserStreamArray   = &userstream;
+
+			mdei.ThreadId = GetCurrentThreadId();
+			mdei.ExceptionPointers  = ep;
+			mdei.ClientPointers     = false;
+
+			funcMiniDumpWriteDump(proc, procid, file, MiniDumpWithDataSegs, &mdei, &musi, NULL);
+		}
+		FreeLibrary(dbghelp);
+	}
+#endif
+
 	/* Close any possible log files */
 	CloseConsoleLogIfActive();