diff src/os/windows/crashlog_win.cpp @ 15914:4fab5de4b857 draft

(svn r20598) -Codechange: [Win32] Replace the external x64 asm with a built-in Windows function.
author michi_cc <michi_cc@openttd.org>
date Mon, 23 Aug 2010 18:19:15 +0000 (2010-08-23)
parents ca959eb5d431
children bb38f90b1402
line wrap: on
line diff
--- a/src/os/windows/crashlog_win.cpp
+++ b/src/os/windows/crashlog_win.cpp
@@ -10,6 +10,12 @@
 /** @file crashlog_win.cpp Implementation of a crashlogger for Windows */
 
 #include "../../stdafx.h"
+#if defined(_MSC_VER) && defined(_M_AMD64)
+/* Redefine WinNT version to get RtlCaptureContext prototype. */
+#undef _WIN32_WINNT
+#undef NTDDI_VERSION
+#define _WIN32_WINNT _WIN32_WINNT_WINXP
+#endif /* defined(_MSC_VER) && defined(_M_AMD64) */
 #include "../../crashlog.h"
 #include "win32.h"
 #include "../../core/alloc_func.hpp"
@@ -408,10 +414,6 @@
 	return EXCEPTION_EXECUTE_HANDLER;
 }
 
-#ifdef _M_AMD64
-extern "C" void *_get_safe_esp();
-#endif
-
 static void CDECL CustomAbort(int signal)
 {
 	RaiseException(0xE1212012, 0, 0, NULL);
@@ -421,7 +423,14 @@
 {
 #if defined(_MSC_VER)
 #ifdef _M_AMD64
-	_safe_esp = _get_safe_esp();
+	CONTEXT ctx;
+	RtlCaptureContext(&ctx);
+
+	/* The stack pointer for AMD64 must always be 16-byte aligned inside a
+	 * function. As we are simulating a function call with the safe ESP value,
+	 * we need to subtract 8 for the imaginary return address otherwise stack
+	 * alignment would be wrong in the called function. */
+	_safe_esp = (void *)(ctx.Rsp - 8);
 #else
 	_asm {
 		mov _safe_esp, esp