mirror of
https://github.com/rwinkhart/sys.git
synced 2026-09-05 16:47:27 -04:00
windows: Add WSALookupService syscall wrappers
Create WSAQUERYSET struct, add LUP_XX constants, implement wrappers around WSALookupService functions. Fixes golang/go#54232 Change-Id: I26624df1b2b44cd8750350fe4526b806513913fe Reviewed-on: https://go-review.googlesource.com/c/sys/+/461296 Reviewed-by: Alex Brainman <alex.brainman@gmail.com> Auto-Submit: Bryan Mills <bcmills@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Bryan Mills <bcmills@google.com> Run-TryBot: Alex Brainman <alex.brainman@gmail.com> Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
committed by
Gopher Robot
parent
c79a742fd1
commit
4fee21c923
@@ -824,6 +824,9 @@ const socket_error = uintptr(^uint32(0))
|
|||||||
//sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup
|
//sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup
|
||||||
//sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup
|
//sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup
|
||||||
//sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl
|
//sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl
|
||||||
|
//sys WSALookupServiceBegin(querySet *WSAQUERYSET, flags uint32, handle *Handle) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceBeginW
|
||||||
|
//sys WSALookupServiceNext(handle Handle, flags uint32, size *int32, querySet *WSAQUERYSET) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceNextW
|
||||||
|
//sys WSALookupServiceEnd(handle Handle) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceEnd
|
||||||
//sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket
|
//sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket
|
||||||
//sys sendto(s Handle, buf []byte, flags int32, to unsafe.Pointer, tolen int32) (err error) [failretval==socket_error] = ws2_32.sendto
|
//sys sendto(s Handle, buf []byte, flags int32, to unsafe.Pointer, tolen int32) (err error) [failretval==socket_error] = ws2_32.sendto
|
||||||
//sys recvfrom(s Handle, buf []byte, flags int32, from *RawSockaddrAny, fromlen *int32) (n int32, err error) [failretval==-1] = ws2_32.recvfrom
|
//sys recvfrom(s Handle, buf []byte, flags int32, from *RawSockaddrAny, fromlen *int32) (n int32, err error) [failretval==-1] = ws2_32.recvfrom
|
||||||
|
|||||||
@@ -1078,3 +1078,52 @@ func TestProcThreadAttributeHandleList(t *testing.T) {
|
|||||||
t.Fatalf("got %q; want %q", out, sentinel)
|
t.Fatalf("got %q; want %q", out, sentinel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestWSALookupService(t *testing.T) {
|
||||||
|
var flags uint32 = windows.LUP_CONTAINERS
|
||||||
|
flags |= windows.LUP_RETURN_NAME
|
||||||
|
flags |= windows.LUP_RETURN_ADDR
|
||||||
|
|
||||||
|
var querySet windows.WSAQUERYSET
|
||||||
|
querySet.NameSpace = windows.NS_BTH
|
||||||
|
querySet.Size = uint32(unsafe.Sizeof(windows.WSAQUERYSET{}))
|
||||||
|
|
||||||
|
var handle windows.Handle
|
||||||
|
err := windows.WSALookupServiceBegin(&querySet, flags, &handle)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, windows.WSASERVICE_NOT_FOUND) {
|
||||||
|
t.Skip("WSA Service not found, so skip this test")
|
||||||
|
}
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
defer windows.WSALookupServiceEnd(handle)
|
||||||
|
|
||||||
|
n := int32(unsafe.Sizeof(windows.WSAQUERYSET{}))
|
||||||
|
buf := make([]byte, n)
|
||||||
|
items_loop:
|
||||||
|
for {
|
||||||
|
q := (*windows.WSAQUERYSET)(unsafe.Pointer(&buf[0]))
|
||||||
|
err := windows.WSALookupServiceNext(handle, flags, &n, q)
|
||||||
|
switch err {
|
||||||
|
case windows.WSA_E_NO_MORE, windows.WSAENOMORE:
|
||||||
|
// no more data available - break the loop
|
||||||
|
break items_loop
|
||||||
|
case windows.WSAEFAULT:
|
||||||
|
// buffer is too small - reallocate and try again
|
||||||
|
buf = make([]byte, n)
|
||||||
|
case nil:
|
||||||
|
// found a record - display the item and fetch next item
|
||||||
|
var addr string
|
||||||
|
for _, e := range q.SaBuffer.RemoteAddr.Sockaddr.Addr.Data {
|
||||||
|
if e != 0 {
|
||||||
|
addr += fmt.Sprintf("%x", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
t.Logf("%s -> %s\n", windows.UTF16PtrToString(q.ServiceInstanceName), addr)
|
||||||
|
|
||||||
|
default:
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1243,6 +1243,51 @@ const (
|
|||||||
DnsSectionAdditional = 0x0003
|
DnsSectionAdditional = 0x0003
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// flags of WSALookupService
|
||||||
|
LUP_DEEP = 0x0001
|
||||||
|
LUP_CONTAINERS = 0x0002
|
||||||
|
LUP_NOCONTAINERS = 0x0004
|
||||||
|
LUP_NEAREST = 0x0008
|
||||||
|
LUP_RETURN_NAME = 0x0010
|
||||||
|
LUP_RETURN_TYPE = 0x0020
|
||||||
|
LUP_RETURN_VERSION = 0x0040
|
||||||
|
LUP_RETURN_COMMENT = 0x0080
|
||||||
|
LUP_RETURN_ADDR = 0x0100
|
||||||
|
LUP_RETURN_BLOB = 0x0200
|
||||||
|
LUP_RETURN_ALIASES = 0x0400
|
||||||
|
LUP_RETURN_QUERY_STRING = 0x0800
|
||||||
|
LUP_RETURN_ALL = 0x0FF0
|
||||||
|
LUP_RES_SERVICE = 0x8000
|
||||||
|
|
||||||
|
LUP_FLUSHCACHE = 0x1000
|
||||||
|
LUP_FLUSHPREVIOUS = 0x2000
|
||||||
|
|
||||||
|
LUP_NON_AUTHORITATIVE = 0x4000
|
||||||
|
LUP_SECURE = 0x8000
|
||||||
|
LUP_RETURN_PREFERRED_NAMES = 0x10000
|
||||||
|
LUP_DNS_ONLY = 0x20000
|
||||||
|
|
||||||
|
LUP_ADDRCONFIG = 0x100000
|
||||||
|
LUP_DUAL_ADDR = 0x200000
|
||||||
|
LUP_FILESERVER = 0x400000
|
||||||
|
LUP_DISABLE_IDN_ENCODING = 0x00800000
|
||||||
|
LUP_API_ANSI = 0x01000000
|
||||||
|
|
||||||
|
LUP_RESOLUTION_HANDLE = 0x80000000
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// values of WSAQUERYSET's namespace
|
||||||
|
NS_ALL = 0
|
||||||
|
NS_DNS = 12
|
||||||
|
NS_NLA = 15
|
||||||
|
NS_BTH = 16
|
||||||
|
NS_EMAIL = 37
|
||||||
|
NS_PNRPNAME = 38
|
||||||
|
NS_PNRPCLOUD = 39
|
||||||
|
)
|
||||||
|
|
||||||
type DNSSRVData struct {
|
type DNSSRVData struct {
|
||||||
Target *uint16
|
Target *uint16
|
||||||
Priority uint16
|
Priority uint16
|
||||||
@@ -3258,3 +3303,43 @@ const (
|
|||||||
DWMWA_TEXT_COLOR = 36
|
DWMWA_TEXT_COLOR = 36
|
||||||
DWMWA_VISIBLE_FRAME_BORDER_THICKNESS = 37
|
DWMWA_VISIBLE_FRAME_BORDER_THICKNESS = 37
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type WSAQUERYSET struct {
|
||||||
|
Size uint32
|
||||||
|
ServiceInstanceName *uint16
|
||||||
|
ServiceClassId *GUID
|
||||||
|
Version *WSAVersion
|
||||||
|
Comment *uint16
|
||||||
|
NameSpace uint32
|
||||||
|
NSProviderId *GUID
|
||||||
|
Context *uint16
|
||||||
|
NumberOfProtocols uint32
|
||||||
|
AfpProtocols *AFProtocols
|
||||||
|
QueryString *uint16
|
||||||
|
NumberOfCsAddrs uint32
|
||||||
|
SaBuffer *CSAddrInfo
|
||||||
|
OutputFlags uint32
|
||||||
|
Blob *BLOB
|
||||||
|
}
|
||||||
|
|
||||||
|
type WSAVersion struct {
|
||||||
|
Version uint32
|
||||||
|
EnumerationOfComparison int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type AFProtocols struct {
|
||||||
|
AddressFamily int32
|
||||||
|
Protocol int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type CSAddrInfo struct {
|
||||||
|
LocalAddr SocketAddress
|
||||||
|
RemoteAddr SocketAddress
|
||||||
|
SocketType int32
|
||||||
|
Protocol int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type BLOB struct {
|
||||||
|
Size uint32
|
||||||
|
BlobData *byte
|
||||||
|
}
|
||||||
|
|||||||
@@ -474,6 +474,9 @@ var (
|
|||||||
procWSAEnumProtocolsW = modws2_32.NewProc("WSAEnumProtocolsW")
|
procWSAEnumProtocolsW = modws2_32.NewProc("WSAEnumProtocolsW")
|
||||||
procWSAGetOverlappedResult = modws2_32.NewProc("WSAGetOverlappedResult")
|
procWSAGetOverlappedResult = modws2_32.NewProc("WSAGetOverlappedResult")
|
||||||
procWSAIoctl = modws2_32.NewProc("WSAIoctl")
|
procWSAIoctl = modws2_32.NewProc("WSAIoctl")
|
||||||
|
procWSALookupServiceBeginW = modws2_32.NewProc("WSALookupServiceBeginW")
|
||||||
|
procWSALookupServiceEnd = modws2_32.NewProc("WSALookupServiceEnd")
|
||||||
|
procWSALookupServiceNextW = modws2_32.NewProc("WSALookupServiceNextW")
|
||||||
procWSARecv = modws2_32.NewProc("WSARecv")
|
procWSARecv = modws2_32.NewProc("WSARecv")
|
||||||
procWSARecvFrom = modws2_32.NewProc("WSARecvFrom")
|
procWSARecvFrom = modws2_32.NewProc("WSARecvFrom")
|
||||||
procWSASend = modws2_32.NewProc("WSASend")
|
procWSASend = modws2_32.NewProc("WSASend")
|
||||||
@@ -4067,6 +4070,30 @@ func WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbo
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func WSALookupServiceBegin(querySet *WSAQUERYSET, flags uint32, handle *Handle) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procWSALookupServiceBeginW.Addr(), 3, uintptr(unsafe.Pointer(querySet)), uintptr(flags), uintptr(unsafe.Pointer(handle)))
|
||||||
|
if r1 == socket_error {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func WSALookupServiceEnd(handle Handle) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procWSALookupServiceEnd.Addr(), 1, uintptr(handle), 0, 0)
|
||||||
|
if r1 == socket_error {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func WSALookupServiceNext(handle Handle, flags uint32, size *int32, querySet *WSAQUERYSET) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall6(procWSALookupServiceNextW.Addr(), 4, uintptr(handle), uintptr(flags), uintptr(unsafe.Pointer(size)), uintptr(unsafe.Pointer(querySet)), 0, 0)
|
||||||
|
if r1 == socket_error {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) {
|
func WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) {
|
||||||
r1, _, e1 := syscall.Syscall9(procWSARecv.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0)
|
r1, _, e1 := syscall.Syscall9(procWSARecv.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0)
|
||||||
if r1 == socket_error {
|
if r1 == socket_error {
|
||||||
|
|||||||
Reference in New Issue
Block a user