Signed-off-by: Darren Stahl <darst@microsoft.com>
| ... | ... |
@@ -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 |
) |