]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: do not use AddVectoredContinueHandler on Windows XP/2003.
authorDaniel Theophanes <kardianos@gmail.com>
Sat, 28 Mar 2015 06:03:22 +0000 (23:03 -0700)
committerAlex Brainman <alex.brainman@gmail.com>
Mon, 30 Mar 2015 03:37:55 +0000 (03:37 +0000)
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 <alex.brainman@gmail.com>
src/runtime/os1_windows.go

index 609e4307113b9068b8e7bbf40928b2118d7b9cd8..0907ca231973aca636d67e1f5002192cddfd4a3f 100644 (file)
@@ -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 {