|
@@ -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
|
|
|
}
|