[英]Calling EnumServicesStatusEx in Go, memory allocation?
我正在编写一个与Windows服务中的Windows API交互的应用程序。
之后从@chowey帮助负载在这里 ,我有点得到的东西的窍门,并开始,我已经把在GitHub上一个基本库在这里 。
现在,我转到“服务”,要求列出计算机上的所有Windows服务,然后启动,停止和重新启动它们。 一旦可以使用服务句柄,启动/停止/重新启动就非常简单了,但是我在努力获取已安装服务的列表。
我需要调用Advapi32.dll中的EnumServicesStatusEx ,但它需要一个指向ENUM_SERVICE_STATUS_PROCESS结构数组的预分配内存的指针。
您可以使用空指针调用该函数,它将返回所需的内存分配大小,但是我不相信有一种方法可以直接在Go中分配内存。
起初我以为我可以得到内存分配要求,使用不安全的包将其除以SizeOf结构,创建一个包含该数量元素的切片,然后将指向第一个元素的指针传递给函数,但它表示内存需要包含用于字符串数据的空间,而不会。
请问有人知道如何实现吗? :)。
根据@alex的建议,我得到了以下示例代码。
看起来我们创建了正确大小的字节片,然后使用unsafe类将其转换为结构类型。
_, _, _ = svcEnumServicesStatusEx.Call(
uintptr(handle),
uintptr(uint32(SVC_SC_ENUM_PROCESS_INFO)),
uintptr(uint32(SVC_SERVICE_WIN32)),
uintptr(uint32(SVC_SERVICE_STATE_ALL)),
uintptr(0),
0,
uintptr(unsafe.Pointer(&bytesReq)),
uintptr(unsafe.Pointer(&numReturned)),
uintptr(unsafe.Pointer(&resumeHandle)),
uintptr(0),
)
if bytesReq > 0 {
var buf []byte = make([]byte, bytesReq)
ret, _, _ := svcEnumServicesStatusEx.Call(
uintptr(handle),
uintptr(uint32(SVC_SC_ENUM_PROCESS_INFO)),
uintptr(uint32(SVC_SERVICE_WIN32)),
uintptr(uint32(SVC_SERVICE_STATE_ALL)),
uintptr(unsafe.Pointer(&buf[0])),
uintptr(bytesReq),
uintptr(unsafe.Pointer(&bytesReq)),
uintptr(unsafe.Pointer(&numReturned)),
uintptr(unsafe.Pointer(&resumeHandle)),
uintptr(0),
)
if ret > 0 {
var sizeTest ENUM_SERVICE_STATUS_PROCESS
iter := uintptr(unsafe.Pointer(&buf[0]))
for i := uint32(0); i < numReturned; i++ {
var data *ENUM_SERVICE_STATUS_PROCESS = (*ENUM_SERVICE_STATUS_PROCESS)(unsafe.Pointer(iter))
fmt.Printf("Service Name: %s - Display Name: %s - %#v\r\n", syscall.UTF16ToString((*[4096]uint16)(unsafe.Pointer(data.lpServiceName))[:]), syscall.UTF16ToString((*[4096]uint16)(unsafe.Pointer(data.lpDisplayName))[:]), data.ServiceStatusProcess)
iter = uintptr(unsafe.Pointer(iter + unsafe.Sizeof(sizeTest)))
}
} else {
return nil, fmt.Errorf("Failed to get Service List even with allocated memory.")
}
} else {
return nil, fmt.Errorf("Unable to get size of required memory allocation.")
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.