【发布时间】:2018-08-16 11:08:14
【问题描述】:
我尝试使用 golang 包中的 syscall 调用 WindowsAPI(尽量不要使用 cgo),但我面对的是 uintptr 我不知道如何访问 uintptr 有其地址的数据
这是我正在做的代码
package soq
import (
"fmt"
"net"
"syscall"
"unsafe"
)
const (
retErrInsufficientBuffer = 122
)
var (
kernel32, _ = syscall.LoadLibrary("kernel32")
heapAlloc, _ = syscall.GetProcAddress(kernel32, "HeapAlloc")
heapFree, _ = syscall.GetProcAddress(kernel32, "HeapFree")
getProcessHeap, _ = syscall.GetProcAddress(kernel32, "GetProcessHeap")
processHeap, _, _ = syscall.Syscall6(getProcessHeap, 0, 0, 0, 0, 0, 0, 0)
libIphlpapi, _ = syscall.LoadLibrary("iphlpapi")
pGetUDPTable, _ = syscall.GetProcAddress(libIphlpapi, "GetUdpTable")
pUDPTable uintptr
)
// UDPTableRow .
type UDPTableRow struct {
LocalAddr net.IP
LocalPort uint32
}
// UDPTable .
type UDPTable struct {
NumEntries uint32
Table []UDPTableRow
}
// HeapAlloc .
func HeapAlloc(size uint32) uintptr {
pMem, _, _ := syscall.Syscall(
heapAlloc, 3,
processHeap,
0,
uintptr(size),
)
return pMem
}
// HeapFree .
func HeapFree(pMem uintptr) {
syscall.Syscall(
heapFree,
3,
processHeap,
0,
pMem,
)
}
// GetUDPTable .
func GetUDPTable() (*UDPTable, error) {
var dwSize uint32
if r1, _, _ := syscall.Syscall(
pGetUDPTable,
3,
pUDPTable,
uintptr(unsafe.Pointer(&dwSize)),
0,
); r1 == retErrInsufficientBuffer {
HeapFree(pUDPTable)
pUDPTable = HeapAlloc(dwSize)
}
if r1, _, _ := syscall.Syscall(
pGetUDPTable,
3,
pUDPTable,
uintptr(unsafe.Pointer(&dwSize)),
0,
); r1 != 0 {
fmt.Println("GetUdpTable() failed with return value", r1)
}
/*
How to retrive data from "pUDPTable"
It's structure is
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366930(v=vs.85).aspx
typedef struct _MIB_UDPTABLE {
DWORD dwNumEntries;
MIB_UDPROW table[ANY_SIZE];
} MIB_UDPTABLE, *PMIB_UDPTABLE;
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366926(v=vs.85).aspx
typedef struct _MIB_UDPROW {
DWORD dwLocalAddr;
DWORD dwLocalPort;
} MIB_UDPROW, *PMIB_UDPROW;
*/
fmt.Printf("%#v", pUDPTable)
return nil, nil
}
【问题讨论】:
-
请注意,Go 根本不支持类型转换,只支持类型转换。但更重要的是:请将您的代码示例编辑为仅相关部分。对于类型转换的问题,最多可能是 1-2 行。没有人愿意阅读您的整个程序来了解您在类型转换方面遇到的问题。
-
我试图展示如何
uintptr变量来自感谢您的建议。
标签: windows go system-calls cgo