Source file src/internal/syscall/windows/syscall_windows.go
1
2
3
4
5 package windows
6
7 import (
8 "sync"
9 "syscall"
10 "unsafe"
11 )
12
13 const (
14 ERROR_SHARING_VIOLATION syscall.Errno = 32
15 ERROR_LOCK_VIOLATION syscall.Errno = 33
16 ERROR_NOT_SUPPORTED syscall.Errno = 50
17 ERROR_CALL_NOT_IMPLEMENTED syscall.Errno = 120
18 ERROR_INVALID_NAME syscall.Errno = 123
19 ERROR_LOCK_FAILED syscall.Errno = 167
20 ERROR_NO_UNICODE_TRANSLATION syscall.Errno = 1113
21 )
22
23 const GAA_FLAG_INCLUDE_PREFIX = 0x00000010
24
25 const (
26 IF_TYPE_OTHER = 1
27 IF_TYPE_ETHERNET_CSMACD = 6
28 IF_TYPE_ISO88025_TOKENRING = 9
29 IF_TYPE_PPP = 23
30 IF_TYPE_SOFTWARE_LOOPBACK = 24
31 IF_TYPE_ATM = 37
32 IF_TYPE_IEEE80211 = 71
33 IF_TYPE_TUNNEL = 131
34 IF_TYPE_IEEE1394 = 144
35 )
36
37 type SocketAddress struct {
38 Sockaddr *syscall.RawSockaddrAny
39 SockaddrLength int32
40 }
41
42 type IpAdapterUnicastAddress struct {
43 Length uint32
44 Flags uint32
45 Next *IpAdapterUnicastAddress
46 Address SocketAddress
47 PrefixOrigin int32
48 SuffixOrigin int32
49 DadState int32
50 ValidLifetime uint32
51 PreferredLifetime uint32
52 LeaseLifetime uint32
53 OnLinkPrefixLength uint8
54 }
55
56 type IpAdapterAnycastAddress struct {
57 Length uint32
58 Flags uint32
59 Next *IpAdapterAnycastAddress
60 Address SocketAddress
61 }
62
63 type IpAdapterMulticastAddress struct {
64 Length uint32
65 Flags uint32
66 Next *IpAdapterMulticastAddress
67 Address SocketAddress
68 }
69
70 type IpAdapterDnsServerAdapter struct {
71 Length uint32
72 Reserved uint32
73 Next *IpAdapterDnsServerAdapter
74 Address SocketAddress
75 }
76
77 type IpAdapterPrefix struct {
78 Length uint32
79 Flags uint32
80 Next *IpAdapterPrefix
81 Address SocketAddress
82 PrefixLength uint32
83 }
84
85 type IpAdapterAddresses struct {
86 Length uint32
87 IfIndex uint32
88 Next *IpAdapterAddresses
89 AdapterName *byte
90 FirstUnicastAddress *IpAdapterUnicastAddress
91 FirstAnycastAddress *IpAdapterAnycastAddress
92 FirstMulticastAddress *IpAdapterMulticastAddress
93 FirstDnsServerAddress *IpAdapterDnsServerAdapter
94 DnsSuffix *uint16
95 Description *uint16
96 FriendlyName *uint16
97 PhysicalAddress [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte
98 PhysicalAddressLength uint32
99 Flags uint32
100 Mtu uint32
101 IfType uint32
102 OperStatus uint32
103 Ipv6IfIndex uint32
104 ZoneIndices [16]uint32
105 FirstPrefix *IpAdapterPrefix
106
107 }
108
109 const (
110 IfOperStatusUp = 1
111 IfOperStatusDown = 2
112 IfOperStatusTesting = 3
113 IfOperStatusUnknown = 4
114 IfOperStatusDormant = 5
115 IfOperStatusNotPresent = 6
116 IfOperStatusLowerLayerDown = 7
117 )
118
119
120
121
122
123
124 const (
125 WSA_FLAG_OVERLAPPED = 0x01
126 WSA_FLAG_NO_HANDLE_INHERIT = 0x80
127
128 WSAEMSGSIZE syscall.Errno = 10040
129
130 MSG_PEEK = 0x2
131 MSG_TRUNC = 0x0100
132 MSG_CTRUNC = 0x0200
133
134 socket_error = uintptr(^uint32(0))
135 )
136
137 var WSAID_WSASENDMSG = syscall.GUID{
138 Data1: 0xa441e712,
139 Data2: 0x754f,
140 Data3: 0x43ca,
141 Data4: [8]byte{0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d},
142 }
143
144 var WSAID_WSARECVMSG = syscall.GUID{
145 Data1: 0xf689d7c8,
146 Data2: 0x6f1f,
147 Data3: 0x436b,
148 Data4: [8]byte{0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22},
149 }
150
151 var sendRecvMsgFunc struct {
152 once sync.Once
153 sendAddr uintptr
154 recvAddr uintptr
155 err error
156 }
157
158 type WSAMsg struct {
159 Name *syscall.RawSockaddrAny
160 Namelen int32
161 Buffers *syscall.WSABuf
162 BufferCount uint32
163 Control syscall.WSABuf
164 Flags uint32
165 }
166
167
168
169 func loadWSASendRecvMsg() error {
170 sendRecvMsgFunc.once.Do(func() {
171 var s syscall.Handle
172 s, sendRecvMsgFunc.err = syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, syscall.IPPROTO_UDP)
173 if sendRecvMsgFunc.err != nil {
174 return
175 }
176 defer syscall.CloseHandle(s)
177 var n uint32
178 sendRecvMsgFunc.err = syscall.WSAIoctl(s,
179 syscall.SIO_GET_EXTENSION_FUNCTION_POINTER,
180 (*byte)(unsafe.Pointer(&WSAID_WSARECVMSG)),
181 uint32(unsafe.Sizeof(WSAID_WSARECVMSG)),
182 (*byte)(unsafe.Pointer(&sendRecvMsgFunc.recvAddr)),
183 uint32(unsafe.Sizeof(sendRecvMsgFunc.recvAddr)),
184 &n, nil, 0)
185 if sendRecvMsgFunc.err != nil {
186 return
187 }
188 sendRecvMsgFunc.err = syscall.WSAIoctl(s,
189 syscall.SIO_GET_EXTENSION_FUNCTION_POINTER,
190 (*byte)(unsafe.Pointer(&WSAID_WSASENDMSG)),
191 uint32(unsafe.Sizeof(WSAID_WSASENDMSG)),
192 (*byte)(unsafe.Pointer(&sendRecvMsgFunc.sendAddr)),
193 uint32(unsafe.Sizeof(sendRecvMsgFunc.sendAddr)),
194 &n, nil, 0)
195 })
196 return sendRecvMsgFunc.err
197 }
198
199 func WSASendMsg(fd syscall.Handle, msg *WSAMsg, flags uint32, bytesSent *uint32, overlapped *syscall.Overlapped, croutine *byte) error {
200 err := loadWSASendRecvMsg()
201 if err != nil {
202 return err
203 }
204 r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.sendAddr, 6, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(flags), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)))
205 if r1 == socket_error {
206 if e1 != 0 {
207 err = errnoErr(e1)
208 } else {
209 err = syscall.EINVAL
210 }
211 }
212 return err
213 }
214
215 func WSARecvMsg(fd syscall.Handle, msg *WSAMsg, bytesReceived *uint32, overlapped *syscall.Overlapped, croutine *byte) error {
216 err := loadWSASendRecvMsg()
217 if err != nil {
218 return err
219 }
220 r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.recvAddr, 5, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(bytesReceived)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0)
221 if r1 == socket_error {
222 if e1 != 0 {
223 err = errnoErr(e1)
224 } else {
225 err = syscall.EINVAL
226 }
227 }
228 return err
229 }
230
231 const (
232 ComputerNameNetBIOS = 0
233 ComputerNameDnsHostname = 1
234 ComputerNameDnsDomain = 2
235 ComputerNameDnsFullyQualified = 3
236 ComputerNamePhysicalNetBIOS = 4
237 ComputerNamePhysicalDnsHostname = 5
238 ComputerNamePhysicalDnsDomain = 6
239 ComputerNamePhysicalDnsFullyQualified = 7
240 ComputerNameMax = 8
241
242 MOVEFILE_REPLACE_EXISTING = 0x1
243 MOVEFILE_COPY_ALLOWED = 0x2
244 MOVEFILE_DELAY_UNTIL_REBOOT = 0x4
245 MOVEFILE_WRITE_THROUGH = 0x8
246 MOVEFILE_CREATE_HARDLINK = 0x10
247 MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20
248 )
249
250 func Rename(oldpath, newpath string) error {
251 from, err := syscall.UTF16PtrFromString(oldpath)
252 if err != nil {
253 return err
254 }
255 to, err := syscall.UTF16PtrFromString(newpath)
256 if err != nil {
257 return err
258 }
259 return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING)
260 }
261
262
263
264
265 const (
266 LOCKFILE_FAIL_IMMEDIATELY = 0x00000001
267 LOCKFILE_EXCLUSIVE_LOCK = 0x00000002
268 )
269
270 const MB_ERR_INVALID_CHARS = 8
271
272
273
274
275
276
277 const STYPE_DISKTREE = 0x00
278
279 type SHARE_INFO_2 struct {
280 Netname *uint16
281 Type uint32
282 Remark *uint16
283 Permissions uint32
284 MaxUses uint32
285 CurrentUses uint32
286 Path *uint16
287 Passwd *uint16
288 }
289
290
291
292
293 const (
294 FILE_NAME_NORMALIZED = 0x0
295 FILE_NAME_OPENED = 0x8
296
297 VOLUME_NAME_DOS = 0x0
298 VOLUME_NAME_GUID = 0x1
299 VOLUME_NAME_NONE = 0x4
300 VOLUME_NAME_NT = 0x2
301 )
302
303
304
305 func LoadGetFinalPathNameByHandle() error {
306 return procGetFinalPathNameByHandleW.Find()
307 }
308
309
310
311
View as plain text