-
Notifications
You must be signed in to change notification settings - Fork 0
/
lookup.go
135 lines (115 loc) · 3.43 KB
/
lookup.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package discover
import (
"syscall"
"unsafe"
"golang.org/x/sys/windows"
)
const (
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 socket_error = uintptr(^uint32(0))
const errnoERROR_IO_PENDING = 997
var (
errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)
errERROR_EINVAL error = syscall.EINVAL
)
var (
modws2_32 = windows.NewLazySystemDLL("ws2_32.dll")
procWSALookupServiceBegin = modws2_32.NewProc("WSALookupServiceBeginW")
procWSALookupServiceNext = modws2_32.NewProc("WSALookupServiceNextW")
procWSALookupServiceEnd = modws2_32.NewProc("WSALookupServiceEnd")
)
func WSALookupServiceBegin(querySet *WSAQUERYSET, flags uint32, handle *windows.Handle) error {
var qs = unsafe.Pointer(querySet)
r, _, errNo := syscall.SyscallN(procWSALookupServiceBegin.Addr(), uintptr(qs), uintptr(flags), uintptr(unsafe.Pointer(handle)))
if r == socket_error {
return errnoErr(errNo)
}
return nil
}
func WSALookupServiceNext(handle windows.Handle, flags uint32, size *int32) (WSAQUERYSET, error) {
var data = initializeWSAQUERYSET()
r, _, errNo := syscall.SyscallN(procWSALookupServiceNext.Addr(), uintptr(handle), uintptr(flags), uintptr(unsafe.Pointer(size)), uintptr(unsafe.Pointer(data)))
if r == socket_error {
return WSAQUERYSET{}, errnoErr(errNo)
}
var ret WSAQUERYSET
if data != nil {
ret = *data
}
return ret, nil
}
func WSALookupServiceEnd(handle windows.Handle) error {
r, _, errNo := syscall.SyscallN(procWSALookupServiceEnd.Addr(), uintptr(handle))
if r == socket_error {
return errnoErr(errNo)
}
return nil
}
func initializeWSAQUERYSET() *WSAQUERYSET {
var serviceInstanceName = new(uint16)
var serviceClassId = new(windows.GUID)
var version = new(WSAVersion)
var nsProviderId = new(windows.GUID)
var comment = new(uint16)
var context = new(uint16)
var afpProtocols = new(AFProtocols)
var queryString = new(uint16)
var saBuffer = &AddrInfo{
LocalAddr: SocketAddress{
Sockaddr: &Sockaddr{},
},
RemoteAddr: SocketAddress{
Sockaddr: &Sockaddr{},
},
}
var blob = &BLOB{
BlobData: new(byte),
}
return &WSAQUERYSET{
ServiceInstanceName: serviceInstanceName,
ServiceClassId: serviceClassId,
Version: version,
NSProviderId: nsProviderId,
Comment: comment,
Context: context,
AfpProtocols: afpProtocols,
QueryString: queryString,
SaBuffer: saBuffer,
Blob: blob,
}
}
func errnoErr(e syscall.Errno) error {
switch e {
case 0:
return errERROR_EINVAL
case errnoERROR_IO_PENDING:
return errERROR_IO_PENDING
}
return e
}