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
8 use shared
::guiddef
::LPGUID
;
9 use shared
::minwindef
::{DWORD, INT, LPHANDLE, ULONG}
;
10 use shared
::mstcpip
::{
11 SOCKET_PEER_TARGET_NAME
, SOCKET_SECURITY_QUERY_INFO
, SOCKET_SECURITY_QUERY_TEMPLATE
,
12 SOCKET_SECURITY_SETTINGS
,
14 use 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
,
19 ADDRINFOA
, ADDRINFOEXA
, ADDRINFOEXW
, ADDRINFOW
, PADDRINFOA
, PADDRINFOEXA
, PADDRINFOEXW
,
20 PADDRINFOW
, SOCKADDR
, SOCKET_ADDRESS
,
22 use shared
::wtypesbase
::LPBLOB
;
23 use um
::minwinbase
::LPOVERLAPPED
;
24 use um
::winnt
::{PCHAR, PCSTR, PCWSTR, PSTR, PVOID, PWCHAR, PWSTR, VOID}
;
26 LPWSAOVERLAPPED
, LPWSAOVERLAPPED_COMPLETION_ROUTINE
, SOCKET
, WSA_NOT_ENOUGH_MEMORY
, timeval
,
28 use vc
::vcruntime
::size_t
;
29 pub const UDP_NOCHECKSUM
: c_int
= 1;
30 pub const UDP_CHECKSUM_COVERAGE
: c_int
= 20;
31 pub const EAI_AGAIN
: DWORD
= WSATRY_AGAIN
;
32 pub const EAI_BADFLAGS
: DWORD
= WSAEINVAL
;
33 pub const EAI_FAIL
: DWORD
= WSANO_RECOVERY
;
34 pub const EAI_FAMILY
: DWORD
= WSAEAFNOSUPPORT
;
35 pub const EAI_MEMORY
: DWORD
= WSA_NOT_ENOUGH_MEMORY
as u32;
36 pub const EAI_NOSECURENAME
: DWORD
= WSA_SECURE_HOST_NOT_FOUND
;
37 pub const EAI_NONAME
: DWORD
= WSAHOST_NOT_FOUND
;
38 pub const EAI_SERVICE
: DWORD
= WSATYPE_NOT_FOUND
;
39 pub const EAI_SOCKTYPE
: DWORD
= WSAESOCKTNOSUPPORT
;
40 pub const EAI_IPSECPOLICY
: DWORD
= WSA_IPSEC_NAME_POLICY_ERROR
;
41 pub const EAI_NODATA
: DWORD
= EAI_NONAME
;
42 pub type ADDRINFO
= ADDRINFOA
;
43 pub type LPADDRINFO
= *mut ADDRINFOA
;
48 pHints
: *const ADDRINFOA
,
49 ppResult
: *mut PADDRINFOA
,
54 pHints
: *const ADDRINFOW
,
55 ppResult
: *mut PADDRINFOW
,
58 FN
!{stdcall
LPFN_GETADDRINFO(
61 pHints
: *const ADDRINFOA
,
62 ppResult
: *mut PADDRINFOA
,
64 FN
!{stdcall
LPFN_GETADDRINFOW(
67 pHints
: *const ADDRINFOW
,
68 ppResult
: *mut PADDRINFOW
,
70 FN
!{stdcall
LPLOOKUPSERVICE_COMPLETION_ROUTINE(
73 lpOverlapped
: LPWSAOVERLAPPED
,
76 pub fn GetAddrInfoExA(
81 hints
: *const ADDRINFOEXA
,
82 ppResult
: *mut PADDRINFOEXA
,
83 timeout
: *mut timeval
,
84 lpOverlapped
: LPOVERLAPPED
,
85 lpCompletionRoutine
: LPLOOKUPSERVICE_COMPLETION_ROUTINE
,
86 lpNameHandle
: LPHANDLE
,
88 pub fn GetAddrInfoExW(
93 hints
: *const ADDRINFOEXW
,
94 ppResult
: *mut PADDRINFOEXW
,
95 timeout
: *mut timeval
,
96 lpOverlapped
: LPOVERLAPPED
,
97 lpCompletionRoutine
: LPLOOKUPSERVICE_COMPLETION_ROUTINE
,
98 lpNameHandle
: LPHANDLE
,
100 pub fn GetAddrInfoExCancel(
103 pub fn GetAddrInfoExOverlappedResult(
104 lpOverlapped
: LPOVERLAPPED
,
107 FN
!{stdcall
LPFN_GETADDRINFOEXA(
112 hints
: *const ADDRINFOEXA
,
113 ppResult
: *mut PADDRINFOEXA
,
114 timeout
: *mut timeval
,
115 lpOverlapped
: LPOVERLAPPED
,
116 lpCompletionRoutine
: LPLOOKUPSERVICE_COMPLETION_ROUTINE
,
117 lpNameHandle
: LPHANDLE
,
119 FN
!{stdcall
LPFN_GETADDRINFOEXW(
121 pServiceName
: PCWSTR
,
124 hints
: *const ADDRINFOEXW
,
125 ppResult
: *mut PADDRINFOEXW
,
126 timeout
: *mut timeval
,
127 lpOverlapped
: LPOVERLAPPED
,
128 lpCompletionRoutine
: LPLOOKUPSERVICE_COMPLETION_ROUTINE
,
129 lpNameHandle
: LPHANDLE
,
131 FN
!{stdcall
LPFN_GETADDRINFOEXCANCEL(
134 FN
!{stdcall
LPFN_GETADDRINFOEXOVERLAPPEDRESULT(
135 lpOverlapped
: LPOVERLAPPED
,
138 pub fn SetAddrInfoExA(
141 pAddresses
: *mut SOCKET_ADDRESS
,
142 dwAddressCount
: DWORD
,
147 timeout
: *mut timeval
,
148 lpOverlapped
: LPOVERLAPPED
,
149 lpCompletionRoutine
: LPLOOKUPSERVICE_COMPLETION_ROUTINE
,
150 lpNameHandle
: LPHANDLE
,
152 pub fn SetAddrInfoExW(
154 pServiceName
: PCWSTR
,
155 pAddresses
: *mut SOCKET_ADDRESS
,
156 dwAddressCount
: DWORD
,
161 timeout
: *mut timeval
,
162 lpOverlapped
: LPOVERLAPPED
,
163 lpCompletionRoutine
: LPLOOKUPSERVICE_COMPLETION_ROUTINE
,
164 lpNameHandle
: LPHANDLE
,
167 FN
!{stdcall
LPFN_SETADDRINFOEXA(
170 pAddresses
: *mut SOCKET_ADDRESS
,
171 dwAddressCount
: DWORD
,
176 timeout
: *mut timeval
,
177 lpOverlapped
: LPOVERLAPPED
,
178 lpCompletionRoutine
: LPLOOKUPSERVICE_COMPLETION_ROUTINE
,
179 lpNameHandle
: LPHANDLE
,
181 FN
!{stdcall
LPFN_SETADDRINFOEXW(
183 pServiceName
: PCWSTR
,
184 pAddresses
: *mut SOCKET_ADDRESS
,
185 dwAddressCount
: DWORD
,
190 timeout
: *mut timeval
,
191 lpOverlapped
: LPOVERLAPPED
,
192 lpCompletionRoutine
: LPLOOKUPSERVICE_COMPLETION_ROUTINE
,
193 lpNameHandle
: LPHANDLE
,
197 pAddrInfo
: PADDRINFOA
,
199 pub fn FreeAddrInfoW(
200 pAddrInfo
: PADDRINFOW
,
203 FN
!{stdcall
LPFN_FREEADDRINFO(
204 pAddrInfo
: PADDRINFOA
,
206 FN
!{stdcall
LPFN_FREEADDRINFOW(
207 pAddrInfo
: PADDRINFOW
,
210 pub fn FreeAddrInfoEx(
211 pAddrInfoEx
: PADDRINFOEXA
,
213 pub fn FreeAddrInfoExW(
214 pAddrInfoEx
: PADDRINFOEXW
,
217 FN
!{stdcall
LPFN_FREEADDRINFOEXA(
218 pAddrInfoEx
: PADDRINFOEXA
,
220 FN
!{stdcall
LPFN_FREEADDRINFOEXW(
221 pAddrInfoEx
: PADDRINFOEXW
,
223 pub type socklen_t
= c_int
;
226 pSockaddr
: *const SOCKADDR
,
227 SockaddrLength
: socklen_t
,
229 NodeBufferSize
: DWORD
,
230 pServiceBuffer
: PCHAR
,
231 ServiceBufferSize
: DWORD
,
235 pSockaddr
: *const SOCKADDR
,
236 SockaddrLength
: socklen_t
,
238 NodeBufferSize
: DWORD
,
239 pServiceBuffer
: PWCHAR
,
240 ServiceBufferSize
: DWORD
,
244 FN
!{stdcall
LPFN_GETNAMEINFO(
245 pSockaddr
: *const SOCKADDR
,
246 SockaddrLength
: socklen_t
,
248 NodeBufferSize
: DWORD
,
249 pServiceBuffer
: PCHAR
,
250 ServiceBufferSize
: DWORD
,
253 FN
!{stdcall
LPFN_GETNAMEINFOW(
254 pSockaddr
: *const SOCKADDR
,
255 SockaddrLength
: socklen_t
,
257 NodeBufferSize
: DWORD
,
258 pServiceBuffer
: PWCHAR
,
259 ServiceBufferSize
: DWORD
,
265 pszAddrString
: PCSTR
,
270 pszAddrString
: PCWSTR
,
277 StringBufSize
: size_t
,
283 StringBufSize
: size_t
,
286 FN
!{stdcall
LPFN_INET_PTONA(
288 pszAddrString
: PCSTR
,
291 FN
!{stdcall
LPFN_INET_PTONW(
293 pszAddrString
: PCWSTR
,
296 FN
!{stdcall
LPFN_INET_NTOPA(
300 StringBufSize
: size_t
,
302 FN
!{stdcall
LPFN_INET_NTOPW(
306 StringBufSize
: size_t
,
308 pub const GAI_STRERROR_BUFFER_SIZE
: usize = 1024;
310 pub fn WSASetSocketSecurity(
312 SecuritySettings
: *const SOCKET_SECURITY_SETTINGS
,
313 SecuritySettingsLen
: ULONG
,
314 Overlapped
: LPWSAOVERLAPPED
,
315 CompletionRoutine
: LPWSAOVERLAPPED_COMPLETION_ROUTINE
,
317 pub fn WSAQuerySocketSecurity(
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
,
326 pub fn WSASetSocketPeerTargetName(
328 PeerTargetName
: *const SOCKET_PEER_TARGET_NAME
,
329 PeerTargetNameLen
: ULONG
,
330 Overlapped
: LPWSAOVERLAPPED
,
331 CompletionRoutine
: LPWSAOVERLAPPED_COMPLETION_ROUTINE
,
333 pub fn WSADeleteSocketPeerTargetName(
335 PeerAddr
: *const SOCKADDR
,
337 Overlapped
: LPWSAOVERLAPPED
,
338 CompletionRoutine
: LPWSAOVERLAPPED_COMPLETION_ROUTINE
,
340 pub fn WSAImpersonateSocketPeer(
342 PeerAddr
: *const SOCKADDR
,
345 pub fn WSARevertImpersonation();