mirror of
https://github.com/golang/go
synced 2024-11-20 01:44:42 -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:
parent
ca98dd773a
commit
77f4571f71
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user