From 77f4571f71888b7b813ebd59e3803bf9e73a077b Mon Sep 17 00:00:00 2001 From: Daniel Theophanes Date: Fri, 27 Mar 2015 23:03:22 -0700 Subject: [PATCH] runtime: do not use AddVectoredContinueHandler on Windows XP/2003. When Windows Error Reporting dialog is disabled on amd64 Windows XP or 2003, the continue handler does not fire. Newer versions work correctly regardless of WER. Fixes #10162 Change-Id: I84ea36ee188b34d1421a8db6231223cf61b4111b Reviewed-on: https://go-review.googlesource.com/8165 Reviewed-by: Alex Brainman --- src/runtime/os1_windows.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/runtime/os1_windows.go b/src/runtime/os1_windows.go index 609e430711..0907ca2319 100644 --- a/src/runtime/os1_windows.go +++ b/src/runtime/os1_windows.go @@ -26,6 +26,7 @@ import ( //go:cgo_import_dynamic runtime._GetStdHandle GetStdHandle%1 "kernel32.dll" //go:cgo_import_dynamic runtime._GetSystemInfo GetSystemInfo%1 "kernel32.dll" //go:cgo_import_dynamic runtime._GetThreadContext GetThreadContext%2 "kernel32.dll" +//go:cgo_import_dynamic runtime._GetVersion GetVersion%0 "kernel32.dll" //go:cgo_import_dynamic runtime._LoadLibraryW LoadLibraryW%1 "kernel32.dll" //go:cgo_import_dynamic runtime._LoadLibraryA LoadLibraryA%1 "kernel32.dll" //go:cgo_import_dynamic runtime._NtWaitForSingleObject NtWaitForSingleObject%3 "ntdll.dll" @@ -67,6 +68,7 @@ var ( _GetStdHandle, _GetSystemInfo, _GetThreadContext, + _GetVersion, _LoadLibraryW, _LoadLibraryA, _NtWaitForSingleObject, @@ -148,6 +150,12 @@ func disableWER() { stdcall1(_SetErrorMode, uintptr(errormode)|SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX|SEM_NOOPENFILEERRORBOX) } +func getVersion() (major, minor byte) { + v := uint32(stdcall0(_GetVersion)) + low := uint16(v) + return byte(low), byte(low >> 8) +} + func osinit() { setBadSignalMsg() @@ -157,10 +165,15 @@ func osinit() { externalthreadhandlerp = funcPC(externalthreadhandler) + major, _ := getVersion() + stdcall2(_AddVectoredExceptionHandler, 1, funcPC(exceptiontramp)) - if _AddVectoredContinueHandler == nil || unsafe.Sizeof(&_AddVectoredContinueHandler) == 4 { + if _AddVectoredContinueHandler == nil || unsafe.Sizeof(&_AddVectoredContinueHandler) == 4 || major < 6 { // use SetUnhandledExceptionFilter for windows-386 or - // if VectoredContinueHandler is unavailable. + // if VectoredContinueHandler is unavailable or + // if running windows-amd64 v5. V5 appears to fail to + // call the continue handlers if windows error reporting dialog + // is disabled. // note: SetUnhandledExceptionFilter handler won't be called, if debugging. stdcall1(_SetUnhandledExceptionFilter, funcPC(lastcontinuetramp)) } else {