我试着用Go中的callback来实现MiniDumpWriteDump.
MiniDumpWriteDump人的呼唤:
callback := syscall.NewCallback(miniDumpCallback)
var newCallbackRoutine MINIDUMP_CALLBACK_INFORMATION
newCallbackRoutine.CallbackParam = 0
newCallbackRoutine.CallbackRoutine = callback
ret, _, err := miniDumpWriteDump.Call(
uintptr(processHandle),
uintptr(processId),
uintptr(dumpFile),
uintptr(options),
0,
0,
uintptr(unsafe.Pointer(&newCallbackRoutine)),
)
Callback功能本身:
func miniDumpCallback(_ uintptr, CallbackInput *MINIDUMP_CALLBACK_INPUT, _ uintptr) uintptr {
fmt.Println(CallbackInput.ProcessId, CallbackInput.CallbackType)
return 1
}
Type个定义:
type MINIDUMP_CALLBACK_INPUT struct {
ProcessId win32.ULONG
ProcessHandle win32.HANDLE
CallbackType win32.ULONG
CallbackInfo uintptr
}
type MINIDUMP_CALLBACK_INFORMATION struct {
CallbackRoutine uintptr
CallbackParam uintptr
}
调用回调后,一些字段会收到正确的数据,但有些字段会得到nonsensical个值.
例如,上面的回调正确地接收CallbackInput的ProcessId字段,但将随机整数接收为CallbackType,而它应该接收MINIDUMP_CALLBACK_TYPE个枚举.
输出:
12544 0
12544 1133445120
12544 12548
12544 13028
12544 1114112
12544 1023344640
12544 999620608
12544 990117888
12544 992542720
12544 1005518848
12544 1994850304
12544 1114112
12544 1994915840