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:
PumpkinSeed
2023-02-08 14:13:08 +00:00
committed by Gopher Robot
parent c79a742fd1
commit 4fee21c923
4 changed files with 164 additions and 0 deletions
+49
View File
@@ -1078,3 +1078,52 @@ func TestProcThreadAttributeHandleList(t *testing.T) {
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)
}
}
}