1
0
mirror of https://github.com/golang/go synced 2024-11-20 01:14:40 -07:00

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 <alex.brainman@gmail.com>
This commit is contained in:
Daniel Theophanes 2015-03-27 23:03:22 -07:00 committed by Alex Brainman
parent ca98dd773a
commit 77f4571f71

View 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 {