[英]Pass structure with pointers to go memory in C code
我是 Go 的新手,正在研究如何使用本机 API 进行操作。 这是一个特定的示例,需要验证二进制文件是否已签名。 为此,我想使用 WinVerifyTrust Windows API。
问题:WinVerifyTrust 提供 WINTRUST_DATA 结构,其中包含一个指向 WINTRUST_FILE_INFO 的指针,该指针按顺序包含一个指向字符串的指针 =)
正如我们所知,在 C 或系统调用中禁止将指针传递给包含指向其他 go 内存的指针的内存。
但我只需要这样做。 需要做什么?
这是一个包装函数的包https://github.com/itchio/ox/blob/master/winox/verifytrust_windows.go他们以禁止的方式这样做
winTrustData.FileOrCatalogOrBlobOrSgnrOrCert = uintptr(unsafe.Pointer(fileData))
trustErr := syscallex.WinVerifyTrust(syscall.Handle(0), &policyGUID, winTrustData)
在传递给系统调用之前,不允许将 uintptr to go object 存储在中间变量中
接下来我想做什么:
winTrustFileInfoMemory := C.malloc(unsafe.Sizeof(windows.WinTrustFileInfo{}))
if winTrustFileInfoMemory == nil {
return errors.New("out of memory")
}
defer C.free(winTrustFileInfoMemory)
winTrustFileInfo := (*windows.WinTrustFileInfo)(unsafe.Pointer(winTrustFileInfoMemory))
winTrustFileInfo.Size = uint32(unsafe.Sizeof(windows.WinTrustFileInfo{}))
....
winTrustData.FileOrCatalogOrBlobOrSgnrOrCert = unsafe.Pointer(winTrustFileInfoMemory)
但它看起来真的很难看,我们是否有能力以某种方式固定内存或类似的东西?
根据系统调用文档:
已弃用:此包已被锁定。 调用者应改用 golang.org/x/sys 存储库中的相应包。
在您的情况下,相应的功能是
func WinVerifyTrustEx(hwnd HWND, actionId *GUID, data *WinTrustData) (ret error)
请注意函数名称中的尾随“Ex”。 在内部,这调用:
r0, _, _ := syscall.Syscall(procWinVerifyTrustEx.Addr(), 3, uintptr(hwnd), uintptr(unsafe.Pointer(actionId)), uintptr(unsafe.Pointer(data)))
所以说真的,指针规则现在被sys/windows
而不是你打破了。 抱歉,没有更好的主意。看这里了解更多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.