winapi_ui_automation/um/
ws2tcpip.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms
6//! WinSock2 Extension for TCP/IP protocols
7use ctypes::c_int;
8use shared::guiddef::LPGUID;
9use shared::minwindef::{DWORD, INT, LPHANDLE, ULONG};
10use shared::mstcpip::{
11    SOCKET_PEER_TARGET_NAME, SOCKET_SECURITY_QUERY_INFO, SOCKET_SECURITY_QUERY_TEMPLATE,
12    SOCKET_SECURITY_SETTINGS,
13};
14use shared::winerror::{
15    WSAEAFNOSUPPORT, WSAEINVAL, WSAESOCKTNOSUPPORT, WSAHOST_NOT_FOUND, WSANO_RECOVERY,
16    WSATRY_AGAIN, WSATYPE_NOT_FOUND, WSA_IPSEC_NAME_POLICY_ERROR, WSA_SECURE_HOST_NOT_FOUND,
17};
18use shared::ws2def::{
19    ADDRINFOA, ADDRINFOEXA, ADDRINFOEXW, ADDRINFOW, PADDRINFOA, PADDRINFOEXA, PADDRINFOEXW,
20    PADDRINFOW, SOCKADDR, SOCKET_ADDRESS,
21};
22use shared::wtypesbase::LPBLOB;
23use um::minwinbase::LPOVERLAPPED;
24use um::winnt::{PCHAR, PCSTR, PCWSTR, PSTR, PVOID, PWCHAR, PWSTR, VOID};
25use um::winsock2::{
26    LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE, SOCKET, WSA_NOT_ENOUGH_MEMORY, timeval,
27};
28use vc::vcruntime::size_t;
29pub const UDP_NOCHECKSUM: c_int = 1;
30pub const UDP_CHECKSUM_COVERAGE: c_int = 20;
31pub const EAI_AGAIN: DWORD = WSATRY_AGAIN;
32pub const EAI_BADFLAGS: DWORD = WSAEINVAL;
33pub const EAI_FAIL: DWORD = WSANO_RECOVERY;
34pub const EAI_FAMILY: DWORD = WSAEAFNOSUPPORT;
35pub const EAI_MEMORY: DWORD = WSA_NOT_ENOUGH_MEMORY as u32;
36pub const EAI_NOSECURENAME: DWORD = WSA_SECURE_HOST_NOT_FOUND;
37pub const EAI_NONAME: DWORD = WSAHOST_NOT_FOUND;
38pub const EAI_SERVICE: DWORD = WSATYPE_NOT_FOUND;
39pub const EAI_SOCKTYPE: DWORD = WSAESOCKTNOSUPPORT;
40pub const EAI_IPSECPOLICY: DWORD = WSA_IPSEC_NAME_POLICY_ERROR;
41pub const EAI_NODATA: DWORD = EAI_NONAME;
42pub type ADDRINFO = ADDRINFOA;
43pub type LPADDRINFO = *mut ADDRINFOA;
44extern "system" {
45    pub fn getaddrinfo(
46        pNodeName: PCSTR,
47        pServiceName: PCSTR,
48        pHints: *const ADDRINFOA,
49        ppResult: *mut PADDRINFOA,
50    ) -> INT;
51    pub fn GetAddrInfoW(
52        pNodeName: PCWSTR,
53        pServiceName: PCWSTR,
54        pHints: *const ADDRINFOW,
55        ppResult: *mut PADDRINFOW,
56    ) -> INT;
57}
58FN!{stdcall LPFN_GETADDRINFO(
59    pNodeName: PCSTR,
60    pServiceName: PCSTR,
61    pHints: *const ADDRINFOA,
62    ppResult: *mut PADDRINFOA,
63) -> INT}
64FN!{stdcall LPFN_GETADDRINFOW(
65    pNodeName: PCWSTR,
66    pServiceName: PCWSTR,
67    pHints: *const ADDRINFOW,
68    ppResult: *mut PADDRINFOW,
69) -> INT}
70FN!{stdcall LPLOOKUPSERVICE_COMPLETION_ROUTINE(
71    dwError: DWORD,
72    dwBytes: DWORD,
73    lpOverlapped: LPWSAOVERLAPPED,
74) -> ()}
75extern "system" {
76    pub fn GetAddrInfoExA(
77        pName: PCSTR,
78        pServiceName: PCSTR,
79        dwNameSpace: DWORD,
80        lpNspId: LPGUID,
81        hints: *const ADDRINFOEXA,
82        ppResult: *mut PADDRINFOEXA,
83        timeout: *mut timeval,
84        lpOverlapped: LPOVERLAPPED,
85        lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
86        lpNameHandle: LPHANDLE,
87    ) -> INT;
88    pub fn GetAddrInfoExW(
89        pName: PCWSTR,
90        pServiceName: PCWSTR,
91        dwNameSpace: DWORD,
92        lpNspId: LPGUID,
93        hints: *const ADDRINFOEXW,
94        ppResult: *mut PADDRINFOEXW,
95        timeout: *mut timeval,
96        lpOverlapped: LPOVERLAPPED,
97        lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
98        lpNameHandle: LPHANDLE,
99    ) -> INT;
100    pub fn GetAddrInfoExCancel(
101        lpHandle: LPHANDLE,
102    ) -> INT;
103    pub fn GetAddrInfoExOverlappedResult(
104        lpOverlapped: LPOVERLAPPED,
105    ) -> INT;
106}
107FN!{stdcall LPFN_GETADDRINFOEXA(
108    pName: PCSTR,
109    pServiceName: PCSTR,
110    dwNameSpace: DWORD,
111    lpNspId: LPGUID,
112    hints: *const ADDRINFOEXA,
113    ppResult: *mut PADDRINFOEXA,
114    timeout: *mut timeval,
115    lpOverlapped: LPOVERLAPPED,
116    lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
117    lpNameHandle: LPHANDLE,
118) -> INT}
119FN!{stdcall LPFN_GETADDRINFOEXW(
120    pName: PCWSTR,
121    pServiceName: PCWSTR,
122    dwNameSpace: DWORD,
123    lpNspId: LPGUID,
124    hints: *const ADDRINFOEXW,
125    ppResult: *mut PADDRINFOEXW,
126    timeout: *mut timeval,
127    lpOverlapped: LPOVERLAPPED,
128    lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
129    lpNameHandle: LPHANDLE,
130) -> INT}
131FN!{stdcall LPFN_GETADDRINFOEXCANCEL(
132    lpHandle: LPHANDLE,
133) -> INT}
134FN!{stdcall LPFN_GETADDRINFOEXOVERLAPPEDRESULT(
135    lpOverlapped: LPOVERLAPPED,
136) -> INT}
137extern "system" {
138    pub fn SetAddrInfoExA(
139        pName: PCSTR,
140        pServiceName: PCSTR,
141        pAddresses: *mut SOCKET_ADDRESS,
142        dwAddressCount: DWORD,
143        lpBlob: LPBLOB,
144        dwFlags: DWORD,
145        dwNameSpace: DWORD,
146        lpNspId: LPGUID,
147        timeout: *mut timeval,
148        lpOverlapped: LPOVERLAPPED,
149        lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
150        lpNameHandle: LPHANDLE,
151    ) -> INT;
152    pub fn SetAddrInfoExW(
153        pName: PCWSTR,
154        pServiceName: PCWSTR,
155        pAddresses: *mut SOCKET_ADDRESS,
156        dwAddressCount: DWORD,
157        lpBlob: LPBLOB,
158        dwFlags: DWORD,
159        dwNameSpace: DWORD,
160        lpNspId: LPGUID,
161        timeout: *mut timeval,
162        lpOverlapped: LPOVERLAPPED,
163        lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
164        lpNameHandle: LPHANDLE,
165    ) -> INT;
166}
167FN!{stdcall LPFN_SETADDRINFOEXA(
168    pName: PCSTR,
169    pServiceName: PCSTR,
170    pAddresses: *mut SOCKET_ADDRESS,
171    dwAddressCount: DWORD,
172    lpBlob: LPBLOB,
173    dwFlags: DWORD,
174    dwNameSpace: DWORD,
175    lpNspId: LPGUID,
176    timeout: *mut timeval,
177    lpOverlapped: LPOVERLAPPED,
178    lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
179    lpNameHandle: LPHANDLE,
180) -> INT}
181FN!{stdcall LPFN_SETADDRINFOEXW(
182    pName: PCWSTR,
183    pServiceName: PCWSTR,
184    pAddresses: *mut SOCKET_ADDRESS,
185    dwAddressCount: DWORD,
186    lpBlob: LPBLOB,
187    dwFlags: DWORD,
188    dwNameSpace: DWORD,
189    lpNspId: LPGUID,
190    timeout: *mut timeval,
191    lpOverlapped: LPOVERLAPPED,
192    lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
193    lpNameHandle: LPHANDLE,
194) -> INT}
195extern "system" {
196    pub fn freeaddrinfo(
197        pAddrInfo: PADDRINFOA,
198    );
199    pub fn FreeAddrInfoW(
200        pAddrInfo: PADDRINFOW,
201    );
202}
203FN!{stdcall LPFN_FREEADDRINFO(
204    pAddrInfo: PADDRINFOA,
205) -> ()}
206FN!{stdcall LPFN_FREEADDRINFOW(
207    pAddrInfo: PADDRINFOW,
208) -> ()}
209extern "system" {
210    pub fn FreeAddrInfoEx(
211        pAddrInfoEx: PADDRINFOEXA,
212    );
213    pub fn FreeAddrInfoExW(
214        pAddrInfoEx: PADDRINFOEXW,
215    );
216}
217FN!{stdcall LPFN_FREEADDRINFOEXA(
218    pAddrInfoEx: PADDRINFOEXA,
219) -> ()}
220FN!{stdcall LPFN_FREEADDRINFOEXW(
221    pAddrInfoEx: PADDRINFOEXW,
222) -> ()}
223pub type socklen_t = c_int;
224extern "system" {
225    pub fn getnameinfo(
226        pSockaddr: *const SOCKADDR,
227        SockaddrLength: socklen_t,
228        pNodeBuffer: PCHAR,
229        NodeBufferSize: DWORD,
230        pServiceBuffer: PCHAR,
231        ServiceBufferSize: DWORD,
232        Flags: INT,
233    ) -> INT;
234    pub fn GetNameInfoW(
235        pSockaddr: *const SOCKADDR,
236        SockaddrLength: socklen_t,
237        pNodeBuffer: PWCHAR,
238        NodeBufferSize: DWORD,
239        pServiceBuffer: PWCHAR,
240        ServiceBufferSize: DWORD,
241        Flags: INT,
242    ) -> INT;
243}
244FN!{stdcall LPFN_GETNAMEINFO(
245    pSockaddr: *const SOCKADDR,
246    SockaddrLength: socklen_t,
247    pNodeBuffer: PCHAR,
248    NodeBufferSize: DWORD,
249    pServiceBuffer: PCHAR,
250    ServiceBufferSize: DWORD,
251    Flags: INT,
252) -> c_int}
253FN!{stdcall LPFN_GETNAMEINFOW(
254    pSockaddr: *const SOCKADDR,
255    SockaddrLength: socklen_t,
256    pNodeBuffer: PWCHAR,
257    NodeBufferSize: DWORD,
258    pServiceBuffer: PWCHAR,
259    ServiceBufferSize: DWORD,
260    Flags: INT,
261) -> INT}
262extern "system" {
263    pub fn inet_pton(
264        Family: INT,
265        pszAddrString: PCSTR,
266        pAddrBuf: PVOID,
267    ) -> INT;
268    pub fn InetPtonW(
269        Family: INT,
270        pszAddrString: PCWSTR,
271        pAddrBuf: PVOID,
272    ) -> INT;
273    pub fn inet_ntop(
274        Family: INT,
275        pAddr: *const VOID,
276        pStringBuf: PSTR,
277        StringBufSize: size_t,
278    ) -> PCSTR;
279    pub fn InetNtopW(
280        Family: INT,
281        pAddr: *const VOID,
282        pStringBuf: PWSTR,
283        StringBufSize: size_t,
284    ) -> PCWSTR;
285}
286FN!{stdcall LPFN_INET_PTONA(
287    Family: INT,
288    pszAddrString: PCSTR,
289    pAddrBuf: PVOID,
290) -> INT}
291FN!{stdcall LPFN_INET_PTONW(
292    Family: INT,
293    pszAddrString: PCWSTR,
294    pAddrBuf: PVOID,
295) -> INT}
296FN!{stdcall LPFN_INET_NTOPA(
297    Family: INT,
298    pAddr: *const VOID,
299    pStringBuf: PSTR,
300    StringBufSize: size_t,
301) -> PCSTR}
302FN!{stdcall LPFN_INET_NTOPW(
303    Family: INT,
304    pAddr: *const VOID,
305    pStringBuf: PWSTR,
306    StringBufSize: size_t,
307) -> PCWSTR}
308pub const GAI_STRERROR_BUFFER_SIZE: usize = 1024;
309extern "system" {
310    pub fn WSASetSocketSecurity(
311        Socket: SOCKET,
312        SecuritySettings: *const SOCKET_SECURITY_SETTINGS,
313        SecuritySettingsLen: ULONG,
314        Overlapped: LPWSAOVERLAPPED,
315        CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
316    ) -> INT;
317    pub fn WSAQuerySocketSecurity(
318        Socket: SOCKET,
319        SecurityQueryTemplate: *const SOCKET_SECURITY_QUERY_TEMPLATE,
320        SecurityQueryTemplateLen: ULONG,
321        SecurityQueryInfo: *mut SOCKET_SECURITY_QUERY_INFO,
322        SecurityQueryInfoLen: *mut ULONG,
323        Overlapped: LPWSAOVERLAPPED,
324        CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
325    ) -> INT;
326    pub fn WSASetSocketPeerTargetName(
327        Socket: SOCKET,
328        PeerTargetName: *const SOCKET_PEER_TARGET_NAME,
329        PeerTargetNameLen: ULONG,
330        Overlapped: LPWSAOVERLAPPED,
331        CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
332    ) -> INT;
333    pub fn WSADeleteSocketPeerTargetName(
334        Socket: SOCKET,
335        PeerAddr: *const SOCKADDR,
336        PeerAddrLen: ULONG,
337        Overlapped: LPWSAOVERLAPPED,
338        CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
339    ) -> INT;
340    pub fn WSAImpersonateSocketPeer(
341        Socket: SOCKET,
342        PeerAddr: *const SOCKADDR,
343        PeerAddrLen: ULONG,
344    ) -> INT;
345    pub fn WSARevertImpersonation();
346}