From 00fd466e00f124fee78142c18e5443aa1e110da9 Mon Sep 17 00:00:00 2001 From: Darren Stahl Date: Mon, 21 Nov 2016 14:35:06 -0800 Subject: [PATCH] Swap usage of LazyDLL and LoadDLL to LazySystemDLL. Signed-off-by: Darren Stahl (cherry picked from commit 22c83c567f379dfd475ecd35665e1cc9e5b9c314) Signed-off-by: Victor Vieux --- cmd/dockerd/service_windows.go | 2 +- daemon/graphdriver/windows/windows.go | 5 ++-- daemon/logger/etwlogs/etwlogs_windows.go | 33 +++++++----------------- integration-cli/daemon_windows.go | 7 ++--- pkg/platform/architecture_windows.go | 4 ++- pkg/sysinfo/numcpu_windows.go | 5 ++-- pkg/system/events_windows.go | 4 ++- pkg/system/meminfo_windows.go | 5 ++-- 8 files changed, 30 insertions(+), 35 deletions(-) diff --git a/cmd/dockerd/service_windows.go b/cmd/dockerd/service_windows.go index 7e07af2c64..7ad7e389d8 100644 --- a/cmd/dockerd/service_windows.go +++ b/cmd/dockerd/service_windows.go @@ -27,7 +27,7 @@ var ( flUnregisterService *bool flRunService *bool - setStdHandle = syscall.NewLazyDLL("kernel32.dll").NewProc("SetStdHandle") + setStdHandle = windows.NewLazySystemDLL("kernel32.dll").NewProc("SetStdHandle") oldStderr syscall.Handle panicFile *os.File diff --git a/daemon/graphdriver/windows/windows.go b/daemon/graphdriver/windows/windows.go index f050711c89..beac93ae75 100644 --- a/daemon/graphdriver/windows/windows.go +++ b/daemon/graphdriver/windows/windows.go @@ -31,7 +31,8 @@ import ( "github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/longpath" "github.com/docker/docker/pkg/reexec" - "github.com/docker/go-units" + units "github.com/docker/go-units" + "golang.org/x/sys/windows" ) // filterDriver is an HCSShim driver type for the Windows Filter driver. @@ -115,7 +116,7 @@ func win32FromHresult(hr uintptr) uintptr { // https://msdn.microsoft.com/en-us/library/windows/desktop/aa364993(v=vs.85).aspx func getFileSystemType(drive string) (fsType string, hr error) { var ( - modkernel32 = syscall.NewLazyDLL("kernel32.dll") + modkernel32 = windows.NewLazySystemDLL("kernel32.dll") procGetVolumeInformation = modkernel32.NewProc("GetVolumeInformationW") buf = make([]uint16, 255) size = syscall.MAX_PATH + 1 diff --git a/daemon/logger/etwlogs/etwlogs_windows.go b/daemon/logger/etwlogs/etwlogs_windows.go index ab3ff1f2bd..f296d7f165 100644 --- a/daemon/logger/etwlogs/etwlogs_windows.go +++ b/daemon/logger/etwlogs/etwlogs_windows.go @@ -21,6 +21,7 @@ import ( "github.com/Sirupsen/logrus" "github.com/docker/docker/daemon/logger" + "golang.org/x/sys/windows" ) type etwLogs struct { @@ -35,7 +36,12 @@ const ( win32CallSuccess = 0 ) -var win32Lib *syscall.DLL +var ( + modAdvapi32 = windows.NewLazySystemDLL("Advapi32.dll") + procEventRegister = modAdvapi32.NewProc("EventRegister") + procEventWriteString = modAdvapi32.NewProc("EventWriteString") + procEventUnregister = modAdvapi32.NewProc("EventUnregister") +) var providerHandle syscall.Handle var refCount int var mu sync.Mutex @@ -106,12 +112,7 @@ func registerETWProvider() error { defer mu.Unlock() if refCount == 0 { var err error - if win32Lib, err = syscall.LoadDLL("Advapi32.dll"); err != nil { - return err - } if err = callEventRegister(); err != nil { - win32Lib.Release() - win32Lib = nil return err } } @@ -127,8 +128,6 @@ func unregisterETWProvider() { if callEventUnregister() { refCount-- providerHandle = syscall.InvalidHandle - win32Lib.Release() - win32Lib = nil } // Not returning an error if EventUnregister fails, because etwLogs will continue to work } else { @@ -137,17 +136,13 @@ func unregisterETWProvider() { } func callEventRegister() error { - proc, err := win32Lib.FindProc("EventRegister") - if err != nil { - return err - } // The provider's GUID is {a3693192-9ed6-46d2-a981-f8226c8363bd} guid := syscall.GUID{ 0xa3693192, 0x9ed6, 0x46d2, [8]byte{0xa9, 0x81, 0xf8, 0x22, 0x6c, 0x83, 0x63, 0xbd}, } - ret, _, _ := proc.Call(uintptr(unsafe.Pointer(&guid)), 0, 0, uintptr(unsafe.Pointer(&providerHandle))) + ret, _, _ := procEventRegister.Call(uintptr(unsafe.Pointer(&guid)), 0, 0, uintptr(unsafe.Pointer(&providerHandle))) if ret != win32CallSuccess { errorMessage := fmt.Sprintf("Failed to register ETW provider. Error: %d", ret) logrus.Error(errorMessage) @@ -157,11 +152,7 @@ func callEventRegister() error { } func callEventWriteString(message string) error { - proc, err := win32Lib.FindProc("EventWriteString") - if err != nil { - return err - } - ret, _, _ := proc.Call(uintptr(providerHandle), 0, 0, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(message)))) + ret, _, _ := procEventWriteString.Call(uintptr(providerHandle), 0, 0, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(message)))) if ret != win32CallSuccess { errorMessage := fmt.Sprintf("ETWLogs provider failed to log message. Error: %d", ret) logrus.Error(errorMessage) @@ -171,11 +162,7 @@ func callEventWriteString(message string) error { } func callEventUnregister() bool { - proc, err := win32Lib.FindProc("EventUnregister") - if err != nil { - return false - } - ret, _, _ := proc.Call(uintptr(providerHandle)) + ret, _, _ := procEventUnregister.Call(uintptr(providerHandle)) if ret != win32CallSuccess { return false } diff --git a/integration-cli/daemon_windows.go b/integration-cli/daemon_windows.go index a6e9a09615..885b703b33 100644 --- a/integration-cli/daemon_windows.go +++ b/integration-cli/daemon_windows.go @@ -7,9 +7,10 @@ import ( "unsafe" "github.com/go-check/check" + "golang.org/x/sys/windows" ) -func openEvent(desiredAccess uint32, inheritHandle bool, name string, proc *syscall.LazyProc) (handle syscall.Handle, err error) { +func openEvent(desiredAccess uint32, inheritHandle bool, name string, proc *windows.LazyProc) (handle syscall.Handle, err error) { namep, _ := syscall.UTF16PtrFromString(name) var _p2 uint32 if inheritHandle { @@ -23,7 +24,7 @@ func openEvent(desiredAccess uint32, inheritHandle bool, name string, proc *sysc return } -func pulseEvent(handle syscall.Handle, proc *syscall.LazyProc) (err error) { +func pulseEvent(handle syscall.Handle, proc *windows.LazyProc) (err error) { r0, _, _ := proc.Call(uintptr(handle)) if r0 != 0 { err = syscall.Errno(r0) @@ -32,7 +33,7 @@ func pulseEvent(handle syscall.Handle, proc *syscall.LazyProc) (err error) { } func signalDaemonDump(pid int) { - modkernel32 := syscall.NewLazyDLL("kernel32.dll") + modkernel32 := windows.NewLazySystemDLL("kernel32.dll") procOpenEvent := modkernel32.NewProc("OpenEventW") procPulseEvent := modkernel32.NewProc("PulseEvent") diff --git a/pkg/platform/architecture_windows.go b/pkg/platform/architecture_windows.go index 82c4d54a26..c5f684ddfa 100644 --- a/pkg/platform/architecture_windows.go +++ b/pkg/platform/architecture_windows.go @@ -4,10 +4,12 @@ import ( "fmt" "syscall" "unsafe" + + "golang.org/x/sys/windows" ) var ( - modkernel32 = syscall.NewLazyDLL("kernel32.dll") + modkernel32 = windows.NewLazySystemDLL("kernel32.dll") procGetSystemInfo = modkernel32.NewProc("GetSystemInfo") ) diff --git a/pkg/sysinfo/numcpu_windows.go b/pkg/sysinfo/numcpu_windows.go index 5077af7298..1d89dd5503 100644 --- a/pkg/sysinfo/numcpu_windows.go +++ b/pkg/sysinfo/numcpu_windows.go @@ -4,12 +4,13 @@ package sysinfo import ( "runtime" - "syscall" "unsafe" + + "golang.org/x/sys/windows" ) var ( - kernel32 = syscall.NewLazyDLL("kernel32.dll") + kernel32 = windows.NewLazySystemDLL("kernel32.dll") getCurrentProcess = kernel32.NewProc("GetCurrentProcess") getProcessAffinityMask = kernel32.NewProc("GetProcessAffinityMask") ) diff --git a/pkg/system/events_windows.go b/pkg/system/events_windows.go index 04e2de7871..3ec6d22151 100644 --- a/pkg/system/events_windows.go +++ b/pkg/system/events_windows.go @@ -6,6 +6,8 @@ package system import ( "syscall" "unsafe" + + "golang.org/x/sys/windows" ) var ( @@ -67,7 +69,7 @@ func PulseEvent(handle syscall.Handle) (err error) { return setResetPulse(handle, procPulseEvent) } -func setResetPulse(handle syscall.Handle, proc *syscall.LazyProc) (err error) { +func setResetPulse(handle syscall.Handle, proc *windows.LazyProc) (err error) { r0, _, _ := proc.Call(uintptr(handle)) if r0 != 0 { err = syscall.Errno(r0) diff --git a/pkg/system/meminfo_windows.go b/pkg/system/meminfo_windows.go index d46642598c..883944a4c5 100644 --- a/pkg/system/meminfo_windows.go +++ b/pkg/system/meminfo_windows.go @@ -1,12 +1,13 @@ package system import ( - "syscall" "unsafe" + + "golang.org/x/sys/windows" ) var ( - modkernel32 = syscall.NewLazyDLL("kernel32.dll") + modkernel32 = windows.NewLazySystemDLL("kernel32.dll") procGlobalMemoryStatusEx = modkernel32.NewProc("GlobalMemoryStatusEx") )