Browse code

Swap usage of LazyDLL and LoadDLL to LazySystemDLL.

Signed-off-by: Darren Stahl <darst@microsoft.com>

Darren Stahl authored on 2016/11/22 07:35:06
Showing 8 changed files
... ...
@@ -27,7 +27,7 @@ var (
27 27
 	flUnregisterService *bool
28 28
 	flRunService        *bool
29 29
 
30
-	setStdHandle = syscall.NewLazyDLL("kernel32.dll").NewProc("SetStdHandle")
30
+	setStdHandle = windows.NewLazySystemDLL("kernel32.dll").NewProc("SetStdHandle")
31 31
 	oldStderr    syscall.Handle
32 32
 	panicFile    *os.File
33 33
 
... ...
@@ -31,7 +31,8 @@ import (
31 31
 	"github.com/docker/docker/pkg/ioutils"
32 32
 	"github.com/docker/docker/pkg/longpath"
33 33
 	"github.com/docker/docker/pkg/reexec"
34
-	"github.com/docker/go-units"
34
+	units "github.com/docker/go-units"
35
+	"golang.org/x/sys/windows"
35 36
 )
36 37
 
37 38
 // filterDriver is an HCSShim driver type for the Windows Filter driver.
... ...
@@ -115,7 +116,7 @@ func win32FromHresult(hr uintptr) uintptr {
115 115
 // https://msdn.microsoft.com/en-us/library/windows/desktop/aa364993(v=vs.85).aspx
116 116
 func getFileSystemType(drive string) (fsType string, hr error) {
117 117
 	var (
118
-		modkernel32              = syscall.NewLazyDLL("kernel32.dll")
118
+		modkernel32              = windows.NewLazySystemDLL("kernel32.dll")
119 119
 		procGetVolumeInformation = modkernel32.NewProc("GetVolumeInformationW")
120 120
 		buf                      = make([]uint16, 255)
121 121
 		size                     = syscall.MAX_PATH + 1
... ...
@@ -21,6 +21,7 @@ import (
21 21
 
22 22
 	"github.com/Sirupsen/logrus"
23 23
 	"github.com/docker/docker/daemon/logger"
24
+	"golang.org/x/sys/windows"
24 25
 )
25 26
 
26 27
 type etwLogs struct {
... ...
@@ -35,7 +36,12 @@ const (
35 35
 	win32CallSuccess = 0
36 36
 )
37 37
 
38
-var win32Lib *syscall.DLL
38
+var (
39
+	modAdvapi32          = windows.NewLazySystemDLL("Advapi32.dll")
40
+	procEventRegister    = modAdvapi32.NewProc("EventRegister")
41
+	procEventWriteString = modAdvapi32.NewProc("EventWriteString")
42
+	procEventUnregister  = modAdvapi32.NewProc("EventUnregister")
43
+)
39 44
 var providerHandle syscall.Handle
40 45
 var refCount int
41 46
 var mu sync.Mutex
... ...
@@ -106,12 +112,7 @@ func registerETWProvider() error {
106 106
 	defer mu.Unlock()
107 107
 	if refCount == 0 {
108 108
 		var err error
109
-		if win32Lib, err = syscall.LoadDLL("Advapi32.dll"); err != nil {
110
-			return err
111
-		}
112 109
 		if err = callEventRegister(); err != nil {
113
-			win32Lib.Release()
114
-			win32Lib = nil
115 110
 			return err
116 111
 		}
117 112
 	}
... ...
@@ -127,8 +128,6 @@ func unregisterETWProvider() {
127 127
 		if callEventUnregister() {
128 128
 			refCount--
129 129
 			providerHandle = syscall.InvalidHandle
130
-			win32Lib.Release()
131
-			win32Lib = nil
132 130
 		}
133 131
 		// Not returning an error if EventUnregister fails, because etwLogs will continue to work
134 132
 	} else {
... ...
@@ -137,17 +136,13 @@ func unregisterETWProvider() {
137 137
 }
138 138
 
139 139
 func callEventRegister() error {
140
-	proc, err := win32Lib.FindProc("EventRegister")
141
-	if err != nil {
142
-		return err
143
-	}
144 140
 	// The provider's GUID is {a3693192-9ed6-46d2-a981-f8226c8363bd}
145 141
 	guid := syscall.GUID{
146 142
 		0xa3693192, 0x9ed6, 0x46d2,
147 143
 		[8]byte{0xa9, 0x81, 0xf8, 0x22, 0x6c, 0x83, 0x63, 0xbd},
148 144
 	}
149 145
 
150
-	ret, _, _ := proc.Call(uintptr(unsafe.Pointer(&guid)), 0, 0, uintptr(unsafe.Pointer(&providerHandle)))
146
+	ret, _, _ := procEventRegister.Call(uintptr(unsafe.Pointer(&guid)), 0, 0, uintptr(unsafe.Pointer(&providerHandle)))
151 147
 	if ret != win32CallSuccess {
152 148
 		errorMessage := fmt.Sprintf("Failed to register ETW provider. Error: %d", ret)
153 149
 		logrus.Error(errorMessage)
... ...
@@ -157,11 +152,7 @@ func callEventRegister() error {
157 157
 }
158 158
 
159 159
 func callEventWriteString(message string) error {
160
-	proc, err := win32Lib.FindProc("EventWriteString")
161
-	if err != nil {
162
-		return err
163
-	}
164
-	ret, _, _ := proc.Call(uintptr(providerHandle), 0, 0, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(message))))
160
+	ret, _, _ := procEventWriteString.Call(uintptr(providerHandle), 0, 0, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(message))))
165 161
 	if ret != win32CallSuccess {
166 162
 		errorMessage := fmt.Sprintf("ETWLogs provider failed to log message. Error: %d", ret)
167 163
 		logrus.Error(errorMessage)
... ...
@@ -171,11 +162,7 @@ func callEventWriteString(message string) error {
171 171
 }
172 172
 
173 173
 func callEventUnregister() bool {
174
-	proc, err := win32Lib.FindProc("EventUnregister")
175
-	if err != nil {
176
-		return false
177
-	}
178
-	ret, _, _ := proc.Call(uintptr(providerHandle))
174
+	ret, _, _ := procEventUnregister.Call(uintptr(providerHandle))
179 175
 	if ret != win32CallSuccess {
180 176
 		return false
181 177
 	}
... ...
@@ -7,9 +7,10 @@ import (
7 7
 	"unsafe"
8 8
 
9 9
 	"github.com/go-check/check"
10
+	"golang.org/x/sys/windows"
10 11
 )
11 12
 
12
-func openEvent(desiredAccess uint32, inheritHandle bool, name string, proc *syscall.LazyProc) (handle syscall.Handle, err error) {
13
+func openEvent(desiredAccess uint32, inheritHandle bool, name string, proc *windows.LazyProc) (handle syscall.Handle, err error) {
13 14
 	namep, _ := syscall.UTF16PtrFromString(name)
14 15
 	var _p2 uint32
15 16
 	if inheritHandle {
... ...
@@ -23,7 +24,7 @@ func openEvent(desiredAccess uint32, inheritHandle bool, name string, proc *sysc
23 23
 	return
24 24
 }
25 25
 
26
-func pulseEvent(handle syscall.Handle, proc *syscall.LazyProc) (err error) {
26
+func pulseEvent(handle syscall.Handle, proc *windows.LazyProc) (err error) {
27 27
 	r0, _, _ := proc.Call(uintptr(handle))
28 28
 	if r0 != 0 {
29 29
 		err = syscall.Errno(r0)
... ...
@@ -32,7 +33,7 @@ func pulseEvent(handle syscall.Handle, proc *syscall.LazyProc) (err error) {
32 32
 }
33 33
 
34 34
 func signalDaemonDump(pid int) {
35
-	modkernel32 := syscall.NewLazyDLL("kernel32.dll")
35
+	modkernel32 := windows.NewLazySystemDLL("kernel32.dll")
36 36
 	procOpenEvent := modkernel32.NewProc("OpenEventW")
37 37
 	procPulseEvent := modkernel32.NewProc("PulseEvent")
38 38
 
... ...
@@ -4,10 +4,12 @@ import (
4 4
 	"fmt"
5 5
 	"syscall"
6 6
 	"unsafe"
7
+
8
+	"golang.org/x/sys/windows"
7 9
 )
8 10
 
9 11
 var (
10
-	modkernel32       = syscall.NewLazyDLL("kernel32.dll")
12
+	modkernel32       = windows.NewLazySystemDLL("kernel32.dll")
11 13
 	procGetSystemInfo = modkernel32.NewProc("GetSystemInfo")
12 14
 )
13 15
 
... ...
@@ -4,12 +4,13 @@ package sysinfo
4 4
 
5 5
 import (
6 6
 	"runtime"
7
-	"syscall"
8 7
 	"unsafe"
8
+
9
+	"golang.org/x/sys/windows"
9 10
 )
10 11
 
11 12
 var (
12
-	kernel32               = syscall.NewLazyDLL("kernel32.dll")
13
+	kernel32               = windows.NewLazySystemDLL("kernel32.dll")
13 14
 	getCurrentProcess      = kernel32.NewProc("GetCurrentProcess")
14 15
 	getProcessAffinityMask = kernel32.NewProc("GetProcessAffinityMask")
15 16
 )
... ...
@@ -6,6 +6,8 @@ package system
6 6
 import (
7 7
 	"syscall"
8 8
 	"unsafe"
9
+
10
+	"golang.org/x/sys/windows"
9 11
 )
10 12
 
11 13
 var (
... ...
@@ -67,7 +69,7 @@ func PulseEvent(handle syscall.Handle) (err error) {
67 67
 	return setResetPulse(handle, procPulseEvent)
68 68
 }
69 69
 
70
-func setResetPulse(handle syscall.Handle, proc *syscall.LazyProc) (err error) {
70
+func setResetPulse(handle syscall.Handle, proc *windows.LazyProc) (err error) {
71 71
 	r0, _, _ := proc.Call(uintptr(handle))
72 72
 	if r0 != 0 {
73 73
 		err = syscall.Errno(r0)
... ...
@@ -1,12 +1,13 @@
1 1
 package system
2 2
 
3 3
 import (
4
-	"syscall"
5 4
 	"unsafe"
5
+
6
+	"golang.org/x/sys/windows"
6 7
 )
7 8
 
8 9
 var (
9
-	modkernel32 = syscall.NewLazyDLL("kernel32.dll")
10
+	modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
10 11
 
11 12
 	procGlobalMemoryStatusEx = modkernel32.NewProc("GlobalMemoryStatusEx")
12 13
 )