Я пытаюсь получить доступ к функции EnumerateTraceGuids из Advapi32.dll на ходу.
Я на самой ранней стадии и все еще пытаюсь понять, что я должен делать. У меня есть следующий код, который продолжает выдавать мне сообщение об ошибке: 87, что означает ERROR_INVALID_PARAMETER.
Я использовал этот файл в качестве отправной точки, хотя он только пишет, а не читает:
https://github.com/moby/moby/blob/master/daemon/logger/etwlogs/etwlogs_windows.go
Официальная документация по функции, которую я пытаюсь вызвать, находится здесь:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363713(v=vs.85).aspx
Требуется GuidPropertiesArray [in, out] Массив указателей на структуры TRACE_GUID_PROPERTIES. Эта структура следующая (https://msdn.microsoft.com/en-us/library/windows/desktop/aa364143(v=vs.85).aspx)
typedef struct _TRACE_GUID_PROPERTIES {
GUID Guid;
ULONG GuidType;
ULONG LoggerId;
ULONG EnableLevel;
ULONG EnableFlags;
BOOLEAN IsEnable;
} TRACE_GUID_PROPERTIES, *PTRACE_GUID_PROPERTIES;
У меня есть следующий код, чтобы попытаться сделать это:
package main
import (
"errors"
"fmt"
"syscall"
"unsafe"
"github.com/sirupsen/logrus"
"golang.org/x/sys/windows"
)
const (
win32CallSuccess = 0
MaxProv = 50
nbProviders = 50
)
var (
modAdvapi32 = windows.NewLazySystemDLL("Advapi32.dll")
procEnumerateTraceGuids = modAdvapi32.NewProc("EnumerateTraceGuids")
)
type ulong int32
type TRACE_GUID_PROPERTIES struct {
Guid syscall.GUID
GuidType ulong
LoggerId ulong
EnableLevel ulong
EnableFlags ulong
IsEnable bool
}
func callEnumerateTraceGuids() error {
GuidPropertiesArray:= make([]TRACE_GUID_PROPERTIES, 1)
ptr := &GuidPropertiesArray[0]
ret, _, _ := procEnumerateTraceGuids.Call(uintptr(unsafe.Pointer(&ptr)), MaxProv, nbProviders)
if ret != win32CallSuccess {
errorMessage := fmt.Sprintf("Failed to register ETW provider. Error: %d", ret)
logrus.Error(errorMessage)
return errors.New(errorMessage)
}
return nil
}
func main() {
callEnumerateTraceGuids()
}
На данный момент я не уверен, что я должен делать. Я пробовал много вариантов инициализации массива без успеха.
Надеюсь, кто-то может указать мне в правильном направлении.
Спасибо!
Редактировать: Изменен код, основанный на комментариях, но все еще появляется та же ошибка.
PS: Это моя первая публикация в stackoverflow, и мне уже сказали, что я ленивый менее чем через 12 часов после публикации моего вопроса (ууу!), Поэтому не уверен, что я спрашиваю это правильно ... Я Я не слишком знаком с Go и никогда не вызывал Windows DLL с самого начала, и так как я продолжаю нажимать на этот ERROR_INVALID_PARAMETER, я подумал о том, чтобы попытаться пройти эту первую стену, чтобы иметь возможность понять некоторые концепции одновременно. Надеюсь, что это поможет понять мою просьбу (т.е. я пришел с миром).