Skip to content

Commit 4fee21c

Browse files
PumpkinSeedgopherbot
authored andcommitted
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>
1 parent c79a742 commit 4fee21c

File tree

4 files changed

+164
-0
lines changed

4 files changed

+164
-0
lines changed

windows/syscall_windows.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,9 @@ const socket_error = uintptr(^uint32(0))
824824
//sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup
825825
//sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup
826826
//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
827+
//sys WSALookupServiceBegin(querySet *WSAQUERYSET, flags uint32, handle *Handle) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceBeginW
828+
//sys WSALookupServiceNext(handle Handle, flags uint32, size *int32, querySet *WSAQUERYSET) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceNextW
829+
//sys WSALookupServiceEnd(handle Handle) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceEnd
827830
//sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket
828831
//sys sendto(s Handle, buf []byte, flags int32, to unsafe.Pointer, tolen int32) (err error) [failretval==socket_error] = ws2_32.sendto
829832
//sys recvfrom(s Handle, buf []byte, flags int32, from *RawSockaddrAny, fromlen *int32) (n int32, err error) [failretval==-1] = ws2_32.recvfrom

windows/syscall_windows_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,3 +1078,52 @@ func TestProcThreadAttributeHandleList(t *testing.T) {
10781078
t.Fatalf("got %q; want %q", out, sentinel)
10791079
}
10801080
}
1081+
1082+
func TestWSALookupService(t *testing.T) {
1083+
var flags uint32 = windows.LUP_CONTAINERS
1084+
flags |= windows.LUP_RETURN_NAME
1085+
flags |= windows.LUP_RETURN_ADDR
1086+
1087+
var querySet windows.WSAQUERYSET
1088+
querySet.NameSpace = windows.NS_BTH
1089+
querySet.Size = uint32(unsafe.Sizeof(windows.WSAQUERYSET{}))
1090+
1091+
var handle windows.Handle
1092+
err := windows.WSALookupServiceBegin(&querySet, flags, &handle)
1093+
if err != nil {
1094+
if errors.Is(err, windows.WSASERVICE_NOT_FOUND) {
1095+
t.Skip("WSA Service not found, so skip this test")
1096+
}
1097+
t.Fatal(err)
1098+
}
1099+
1100+
defer windows.WSALookupServiceEnd(handle)
1101+
1102+
n := int32(unsafe.Sizeof(windows.WSAQUERYSET{}))
1103+
buf := make([]byte, n)
1104+
items_loop:
1105+
for {
1106+
q := (*windows.WSAQUERYSET)(unsafe.Pointer(&buf[0]))
1107+
err := windows.WSALookupServiceNext(handle, flags, &n, q)
1108+
switch err {
1109+
case windows.WSA_E_NO_MORE, windows.WSAENOMORE:
1110+
// no more data available - break the loop
1111+
break items_loop
1112+
case windows.WSAEFAULT:
1113+
// buffer is too small - reallocate and try again
1114+
buf = make([]byte, n)
1115+
case nil:
1116+
// found a record - display the item and fetch next item
1117+
var addr string
1118+
for _, e := range q.SaBuffer.RemoteAddr.Sockaddr.Addr.Data {
1119+
if e != 0 {
1120+
addr += fmt.Sprintf("%x", e)
1121+
}
1122+
}
1123+
t.Logf("%s -> %s\n", windows.UTF16PtrToString(q.ServiceInstanceName), addr)
1124+
1125+
default:
1126+
t.Fatal(err)
1127+
}
1128+
}
1129+
}

windows/types_windows.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,6 +1243,51 @@ const (
12431243
DnsSectionAdditional = 0x0003
12441244
)
12451245

1246+
const (
1247+
// flags of WSALookupService
1248+
LUP_DEEP = 0x0001
1249+
LUP_CONTAINERS = 0x0002
1250+
LUP_NOCONTAINERS = 0x0004
1251+
LUP_NEAREST = 0x0008
1252+
LUP_RETURN_NAME = 0x0010
1253+
LUP_RETURN_TYPE = 0x0020
1254+
LUP_RETURN_VERSION = 0x0040
1255+
LUP_RETURN_COMMENT = 0x0080
1256+
LUP_RETURN_ADDR = 0x0100
1257+
LUP_RETURN_BLOB = 0x0200
1258+
LUP_RETURN_ALIASES = 0x0400
1259+
LUP_RETURN_QUERY_STRING = 0x0800
1260+
LUP_RETURN_ALL = 0x0FF0
1261+
LUP_RES_SERVICE = 0x8000
1262+
1263+
LUP_FLUSHCACHE = 0x1000
1264+
LUP_FLUSHPREVIOUS = 0x2000
1265+
1266+
LUP_NON_AUTHORITATIVE = 0x4000
1267+
LUP_SECURE = 0x8000
1268+
LUP_RETURN_PREFERRED_NAMES = 0x10000
1269+
LUP_DNS_ONLY = 0x20000
1270+
1271+
LUP_ADDRCONFIG = 0x100000
1272+
LUP_DUAL_ADDR = 0x200000
1273+
LUP_FILESERVER = 0x400000
1274+
LUP_DISABLE_IDN_ENCODING = 0x00800000
1275+
LUP_API_ANSI = 0x01000000
1276+
1277+
LUP_RESOLUTION_HANDLE = 0x80000000
1278+
)
1279+
1280+
const (
1281+
// values of WSAQUERYSET's namespace
1282+
NS_ALL = 0
1283+
NS_DNS = 12
1284+
NS_NLA = 15
1285+
NS_BTH = 16
1286+
NS_EMAIL = 37
1287+
NS_PNRPNAME = 38
1288+
NS_PNRPCLOUD = 39
1289+
)
1290+
12461291
type DNSSRVData struct {
12471292
Target *uint16
12481293
Priority uint16
@@ -3258,3 +3303,43 @@ const (
32583303
DWMWA_TEXT_COLOR = 36
32593304
DWMWA_VISIBLE_FRAME_BORDER_THICKNESS = 37
32603305
)
3306+
3307+
type WSAQUERYSET struct {
3308+
Size uint32
3309+
ServiceInstanceName *uint16
3310+
ServiceClassId *GUID
3311+
Version *WSAVersion
3312+
Comment *uint16
3313+
NameSpace uint32
3314+
NSProviderId *GUID
3315+
Context *uint16
3316+
NumberOfProtocols uint32
3317+
AfpProtocols *AFProtocols
3318+
QueryString *uint16
3319+
NumberOfCsAddrs uint32
3320+
SaBuffer *CSAddrInfo
3321+
OutputFlags uint32
3322+
Blob *BLOB
3323+
}
3324+
3325+
type WSAVersion struct {
3326+
Version uint32
3327+
EnumerationOfComparison int32
3328+
}
3329+
3330+
type AFProtocols struct {
3331+
AddressFamily int32
3332+
Protocol int32
3333+
}
3334+
3335+
type CSAddrInfo struct {
3336+
LocalAddr SocketAddress
3337+
RemoteAddr SocketAddress
3338+
SocketType int32
3339+
Protocol int32
3340+
}
3341+
3342+
type BLOB struct {
3343+
Size uint32
3344+
BlobData *byte
3345+
}

windows/zsyscall_windows.go

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)