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 //! This module contains Microsoft-specific extensions to the core Winsock definitions.
7 use ctypes::wchar_t;
8 use shared::basetsd::{UINT32, UINT64, ULONG64};
9 use shared::guiddef::GUID;
10 use shared::in6addr::IN6_ADDR;
11 use shared::inaddr::IN_ADDR;
12 use shared::minwindef::{DWORD, PULONG, PUSHORT, UCHAR, ULONG, USHORT};
13 use shared::ws2def::{
14     INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, IOC_VENDOR, SOCKADDR_IN,
15     SOCKADDR_STORAGE,
16 };
17 use um::winnt::{BOOLEAN, LONG, LPCWSTR, PCSTR, PCWSTR, PSTR, PWSTR};
18 DEFINE_GUID!{SOCKET_DEFAULT2_QM_POLICY,
19     0xaec2ef9c, 0x3a4d, 0x4d3e, 0x88, 0x42, 0x23, 0x99, 0x42, 0xe3, 0x9a, 0x47}
20 DEFINE_GUID!{REAL_TIME_NOTIFICATION_CAPABILITY,
21     0x6b59819a, 0x5cae, 0x492d, 0xa9, 0x01, 0x2a, 0x3c, 0x2c, 0x50, 0x16, 0x4f}
22 DEFINE_GUID!{REAL_TIME_NOTIFICATION_CAPABILITY_EX,
23     0x6843da03, 0x154a, 0x4616, 0xa5, 0x08, 0x44, 0x37, 0x12, 0x95, 0xf9, 0x6b}
24 DEFINE_GUID!{ASSOCIATE_NAMERES_CONTEXT,
25     0x59a38b67, 0xd4fe, 0x46e1, 0xba, 0x3c, 0x87, 0xea, 0x74, 0xca, 0x30, 0x49}
26 ENUM!{enum TCPSTATE {
27     TCPSTATE_CLOSED,
28     TCPSTATE_LISTEN,
29     TCPSTATE_SYN_SENT,
30     TCPSTATE_SYN_RCVD,
31     TCPSTATE_ESTABLISHED,
32     TCPSTATE_FIN_WAIT_1,
33     TCPSTATE_FIN_WAIT_2,
34     TCPSTATE_CLOSE_WAIT,
35     TCPSTATE_CLOSING,
36     TCPSTATE_LAST_ACK,
37     TCPSTATE_TIME_WAIT,
38     TCPSTATE_MAX,
39 }}
40 STRUCT!{struct TRANSPORT_SETTING_ID {
41     Guid: GUID,
42 }}
43 pub type PTRANSPORT_SETTING_ID = *mut TRANSPORT_SETTING_ID;
44 STRUCT!{struct tcp_keepalive {
45     onoff: ULONG,
46     keepalivetime: ULONG,
47     keepaliveinterval: ULONG,
48 }}
49 ENUM!{enum CONTROL_CHANNEL_TRIGGER_STATUS {
50     CONTROL_CHANNEL_TRIGGER_STATUS_INVALID = 0,
51     CONTROL_CHANNEL_TRIGGER_STATUS_SOFTWARE_SLOT_ALLOCATED = 1,
52     CONTROL_CHANNEL_TRIGGER_STATUS_HARDWARE_SLOT_ALLOCATED = 2,
53     CONTROL_CHANNEL_TRIGGER_STATUS_POLICY_ERROR = 3,
54     CONTROL_CHANNEL_TRIGGER_STATUS_SYSTEM_ERROR = 4,
55     CONTROL_CHANNEL_TRIGGER_STATUS_TRANSPORT_DISCONNECTED = 5,
56     CONTROL_CHANNEL_TRIGGER_STATUS_SERVICE_UNAVAILABLE = 6,
57 }}
58 pub type PCONTROL_CHANNEL_TRIGGER_STATUS = *mut CONTROL_CHANNEL_TRIGGER_STATUS;
59 pub const CONTROL_CHANNEL_TRIGGER_STATUS_MAX: u32 = CONTROL_CHANNEL_TRIGGER_STATUS_SYSTEM_ERROR;
60 STRUCT!{struct REAL_TIME_NOTIFICATION_SETTING_INPUT {
61     TransportSettingId: TRANSPORT_SETTING_ID,
62     BrokerEventGuid: GUID,
63 }}
64 pub type PREAL_TIME_NOTIFICATION_SETTING_INPUT = *mut REAL_TIME_NOTIFICATION_SETTING_INPUT;
65 STRUCT!{struct REAL_TIME_NOTIFICATION_SETTING_INPUT_EX {
66     TransportSettingId: TRANSPORT_SETTING_ID,
67     BrokerEventGuid: GUID,
68     Unmark: BOOLEAN,
69 }}
70 pub type PREAL_TIME_NOTIFICATION_SETTING_INPUT_EX = *mut REAL_TIME_NOTIFICATION_SETTING_INPUT_EX;
71 STRUCT!{struct REAL_TIME_NOTIFICATION_SETTING_OUTPUT {
72     ChannelStatus: CONTROL_CHANNEL_TRIGGER_STATUS,
73 }}
74 pub type PREAL_TIME_NOTIFICATION_SETTING_OUTPUT = *mut REAL_TIME_NOTIFICATION_SETTING_OUTPUT;
75 STRUCT!{struct ASSOCIATE_NAMERES_CONTEXT_INPUT {
76     TransportSettingId: TRANSPORT_SETTING_ID,
77     Handle: UINT64,
78 }}
79 pub type PASSOCIATE_NAMERES_CONTEXT_INPUT = *mut ASSOCIATE_NAMERES_CONTEXT_INPUT;
80 pub const SIO_RCVALL: DWORD = _WSAIOW!(IOC_VENDOR,1);
81 pub const SIO_RCVALL_MCAST: DWORD = _WSAIOW!(IOC_VENDOR,2);
82 pub const SIO_RCVALL_IGMPMCAST: DWORD = _WSAIOW!(IOC_VENDOR,3);
83 pub const SIO_KEEPALIVE_VALS: DWORD = _WSAIOW!(IOC_VENDOR,4);
84 pub const SIO_ABSORB_RTRALERT: DWORD = _WSAIOW!(IOC_VENDOR,5);
85 pub const SIO_UCAST_IF: DWORD = _WSAIOW!(IOC_VENDOR,6);
86 pub const SIO_LIMIT_BROADCASTS: DWORD = _WSAIOW!(IOC_VENDOR,7);
87 pub const SIO_INDEX_BIND: DWORD = _WSAIOW!(IOC_VENDOR,8);
88 pub const SIO_INDEX_MCASTIF: DWORD = _WSAIOW!(IOC_VENDOR,9);
89 pub const SIO_INDEX_ADD_MCAST: DWORD = _WSAIOW!(IOC_VENDOR,10);
90 pub const SIO_INDEX_DEL_MCAST: DWORD = _WSAIOW!(IOC_VENDOR,11);
91 pub const SIO_RCVALL_MCAST_IF: DWORD = _WSAIOW!(IOC_VENDOR,13);
92 pub const SIO_RCVALL_IF: DWORD = _WSAIOW!(IOC_VENDOR,14);
93 pub const SIO_LOOPBACK_FAST_PATH: DWORD = _WSAIOW!(IOC_VENDOR,16);
94 pub const SIO_TCP_INITIAL_RTO: DWORD = _WSAIOW!(IOC_VENDOR,17);
95 pub const SIO_APPLY_TRANSPORT_SETTING: DWORD = _WSAIOW!(IOC_VENDOR,19);
96 pub const SIO_QUERY_TRANSPORT_SETTING: DWORD = _WSAIOW!(IOC_VENDOR,20);
97 pub const SIO_TCP_SET_ICW: DWORD = _WSAIOW!(IOC_VENDOR,22);
98 pub const SIO_TCP_SET_ACK_FREQUENCY: DWORD = _WSAIOW!(IOC_VENDOR,23);
99 pub const SIO_TCP_INFO: DWORD = _WSAIORW!(IOC_VENDOR,39);
100 ENUM!{enum RCVALL_VALUE {
101     RCVALL_OFF = 0,
102     RCVALL_ON = 1,
103     RCVALL_SOCKETLEVELONLY = 2,
104     RCVALL_IPLEVEL = 3,
105 }}
106 pub type PRCVALL_VALUE = *mut RCVALL_VALUE;
107 STRUCT!{struct RCVALL_IF {
108     Mode: RCVALL_VALUE,
109     Interface: ULONG,
110 }}
111 pub type PRCVALL_IF = *mut RCVALL_IF;
112 pub const TCP_INITIAL_RTO_UNSPECIFIED_RTT: USHORT = -1i16 as u16;
113 pub const TCP_INITIAL_RTO_UNSPECIFIED_MAX_SYN_RETRANSMISSIONS: UCHAR = -1i8 as u8;
114 pub const TCP_INITIAL_RTO_DEFAULT_RTT: USHORT = 0;
115 pub const TCP_INITIAL_RTO_DEFAULT_MAX_SYN_RETRANSMISSIONS: UCHAR = 0;
116 STRUCT!{struct TCP_INITIAL_RTO_PARAMETERS {
117     Rtt: USHORT,
118     MaxSynRetransmissions: UCHAR,
119 }}
120 pub type PTCP_INITIAL_RTO_PARAMETERS = *mut TCP_INITIAL_RTO_PARAMETERS;
121 ENUM!{enum TCP_ICW_LEVEL {
122     TCP_ICW_LEVEL_DEFAULT = 0,
123     TCP_ICW_LEVEL_HIGH = 1,
124     TCP_ICW_LEVEL_VERY_HIGH = 2,
125     TCP_ICW_LEVEL_AGGRESSIVE = 3,
126     TCP_ICW_LEVEL_EXPERIMENTAL = 4,
127     TCP_ICW_LEVEL_COMPAT = 254,
128     TCP_ICW_LEVEL_MAX = 255,
129 }}
130 pub type PTCP_ICW_LEVEL = *mut TCP_ICW_LEVEL;
131 STRUCT!{struct TCP_ICW_PARAMETERS {
132     Level: TCP_ICW_LEVEL,
133 }}
134 pub type PTCP_ICW_PARAMETERS = *mut TCP_ICW_PARAMETERS;
135 STRUCT!{struct TCP_ACK_FREQUENCY_PARAMETERS {
136     TcpDelayedAckFrequency: UCHAR,
137 }}
138 pub type PTCP_ACK_FREQUENCY_PARAMETERS = *mut TCP_ACK_FREQUENCY_PARAMETERS;
139 STRUCT!{struct TCP_INFO_v0 {
140     State: TCPSTATE,
141     Mss: ULONG,
142     ConnectionTimeMs: ULONG64,
143     TimestampsEnabled: BOOLEAN,
144     RttUs: ULONG,
145     MinRttUs: ULONG,
146     BytesInFlight: ULONG,
147     Cwnd: ULONG,
148     SndWnd: ULONG,
149     RcvWnd: ULONG,
150     RcvBuf: ULONG,
151     BytesOut: ULONG64,
152     BytesIn: ULONG64,
153     BytesReordered: ULONG,
154     BytesRetrans: ULONG,
155     FastRetrans: ULONG,
156     DupAcksIn: ULONG,
157     TimeoutEpisodes: ULONG,
158     SynRetrans: UCHAR,
159 }}
160 pub type PTCP_INFO_v0 = *mut TCP_INFO_v0;
161 pub const SIO_ACQUIRE_PORT_RESERVATION: DWORD = _WSAIOW!(IOC_VENDOR, 100);
162 pub const SIO_RELEASE_PORT_RESERVATION: DWORD = _WSAIOW!(IOC_VENDOR, 101);
163 pub const SIO_ASSOCIATE_PORT_RESERVATION: DWORD = _WSAIOW!(IOC_VENDOR, 102);
164 STRUCT!{struct INET_PORT_RANGE {
165     StartPort: USHORT,
166     NumberOfPorts: USHORT,
167 }}
168 pub type PINET_PORT_RANGE = *mut INET_PORT_RANGE;
169 pub type INET_PORT_RESERVATION = INET_PORT_RANGE;
170 pub type PINET_PORT_RESERVATION = *mut INET_PORT_RANGE;
171 STRUCT!{struct INET_PORT_RESERVATION_TOKEN {
172     Token: ULONG64,
173 }}
174 pub type PINET_PORT_RESERVATION_TOKEN = *mut INET_PORT_RESERVATION_TOKEN;
175 STRUCT!{struct INET_PORT_RESERVATION_INSTANCE {
176     Reservation: INET_PORT_RESERVATION,
177     Token: INET_PORT_RESERVATION_TOKEN,
178 }}
179 pub type PINET_PORT_RESERVATION_INSTANCE = *mut INET_PORT_RESERVATION_INSTANCE;
180 STRUCT!{struct INET_PORT_RESERVATION_INFORMATION {
181     OwningPid: ULONG,
182 }}
183 pub type PINET_PORT_RESERVATION_INFORMATION = *mut INET_PORT_RESERVATION_INFORMATION;
184 pub const SIO_SET_SECURITY: DWORD = _WSAIOW!(IOC_VENDOR, 200);
185 pub const SIO_QUERY_SECURITY: DWORD = _WSAIORW!(IOC_VENDOR, 201);
186 pub const SIO_SET_PEER_TARGET_NAME: DWORD = _WSAIOW!(IOC_VENDOR, 202);
187 pub const SIO_DELETE_PEER_TARGET_NAME: DWORD = _WSAIOW!(IOC_VENDOR, 203);
188 pub const SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS: DWORD = _WSAIOW!(IOC_VENDOR, 220);
189 pub const SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT: DWORD = _WSAIOW!(IOC_VENDOR, 221);
190 pub const SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS: DWORD = _WSAIOW!(IOC_VENDOR, 222);
191 pub const SIO_SOCKET_USAGE_NOTIFICATION: DWORD = _WSAIOW!(IOC_VENDOR, 204);
192 ENUM!{enum SOCKET_USAGE_TYPE {
193     SYSTEM_CRITICAL_SOCKET = 1,
194 }}
195 ENUM!{enum SOCKET_SECURITY_PROTOCOL {
196     SOCKET_SECURITY_PROTOCOL_DEFAULT,
197     SOCKET_SECURITY_PROTOCOL_IPSEC,
198     SOCKET_SECURITY_PROTOCOL_IPSEC2,
199     SOCKET_SECURITY_PROTOCOL_INVALID,
200 }}
201 STRUCT!{struct SOCKET_SECURITY_SETTINGS {
202     SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
203     SecurityFlags: ULONG,
204 }}
205 pub const SOCKET_SETTINGS_IPSEC_SKIP_FILTER_INSTANTIATION: ULONG = 0x1;
206 pub const SOCKET_SETTINGS_IPSEC_OPTIONAL_PEER_NAME_VERIFICATION: ULONG = 0x2;
207 pub const SOCKET_SETTINGS_IPSEC_ALLOW_FIRST_INBOUND_PKT_UNENCRYPTED: ULONG = 0x4;
208 pub const SOCKET_SETTINGS_IPSEC_PEER_NAME_IS_RAW_FORMAT: ULONG = 0x8;
209 STRUCT!{struct SOCKET_SECURITY_SETTINGS_IPSEC {
210     SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
211     SecurityFlags: ULONG,
212     IpsecFlags: ULONG,
213     AuthipMMPolicyKey: GUID,
214     AuthipQMPolicyKey: GUID,
215     Reserved: GUID,
216     Reserved2: UINT64,
217     UserNameStringLen: ULONG,
218     DomainNameStringLen: ULONG,
219     PasswordStringLen: ULONG,
220     AllStrings: [wchar_t; 0],
221 }}
222 STRUCT!{struct SOCKET_PEER_TARGET_NAME {
223     SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
224     PeerAddress: SOCKADDR_STORAGE,
225     PeerTargetNameStringLen: ULONG,
226     AllStrings: [wchar_t; 0],
227 }}
228 STRUCT!{struct SOCKET_SECURITY_QUERY_TEMPLATE {
229     SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
230     PeerAddress: SOCKADDR_STORAGE,
231     PeerTokenAccessMask: ULONG,
232 }}
233 pub const SOCKET_QUERY_IPSEC2_ABORT_CONNECTION_ON_FIELD_CHANGE: ULONG = 0x1;
234 pub const SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID: ULONG = 0x1;
235 pub const SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID: ULONG = 0x2;
236 STRUCT!{struct SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2 {
237     SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
238     PeerAddress: SOCKADDR_STORAGE,
239     PeerTokenAccessMask: ULONG,
240     Flags: ULONG,
241     FieldMask: ULONG,
242 }}
243 pub const SOCKET_INFO_CONNECTION_SECURED: ULONG = 0x1;
244 pub const SOCKET_INFO_CONNECTION_ENCRYPTED: ULONG = 0x2;
245 pub const SOCKET_INFO_CONNECTION_IMPERSONATED: ULONG = 0x4;
246 STRUCT!{struct SOCKET_SECURITY_QUERY_INFO {
247     SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
248     Flags: ULONG,
249     PeerApplicationAccessTokenHandle: UINT64,
250     PeerMachineAccessTokenHandle: UINT64,
251 }}
252 STRUCT!{struct SOCKET_SECURITY_QUERY_INFO_IPSEC2 {
253     SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
254     Flags: ULONG,
255     PeerApplicationAccessTokenHandle: UINT64,
256     PeerMachineAccessTokenHandle: UINT64,
257     MmSaId: UINT64,
258     QmSaId: UINT64,
259     NegotiationWinerr: UINT32,
260     SaLookupContext: GUID,
261 }}
262 pub const SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE: DWORD = _WSAIOR!(IOC_VENDOR, 205);
263 pub const SIO_QUERY_RSS_SCALABILITY_INFO: DWORD = _WSAIOR!(IOC_VENDOR, 210);
264 STRUCT!{struct RSS_SCALABILITY_INFO {
265     RssEnabled: BOOLEAN,
266 }}
267 pub type PRSS_SCALABILITY_INFO = *mut RSS_SCALABILITY_INFO;
268 #[inline]
IN4_CLASSA(i: LONG) -> bool269 pub fn IN4_CLASSA(i: LONG) -> bool {
270     (i & 0x80) == 0
271 }
272 #[inline]
IN4_CLASSB(i: LONG) -> bool273 pub fn IN4_CLASSB(i: LONG) -> bool {
274     (i & 0xc0) == 0x80
275 }
276 #[inline]
IN4_CLASSC(i: LONG) -> bool277 pub fn IN4_CLASSC(i: LONG) -> bool {
278     (i & 0xe0) == 0xc0
279 }
280 #[inline]
IN4_CLASSD(i: LONG) -> bool281 pub fn IN4_CLASSD(i: LONG) -> bool {
282     (i & 0xf0) == 0xe0
283 }
284 #[inline]
IN4_MULTICAST(i: LONG) -> bool285 pub fn IN4_MULTICAST(i: LONG) -> bool {
286     IN4_CLASSD(i)
287 }
288 pub const IN4ADDR_ANY: ULONG = INADDR_ANY;
289 pub const IN4ADDR_LOOPBACK: ULONG = 0x0100007f;
290 pub const IN4ADDR_BROADCAST: ULONG = INADDR_BROADCAST;
291 pub const IN4ADDR_NONE: ULONG = INADDR_NONE;
292 pub const IN4ADDR_LOOPBACKPREFIX_LENGTH: usize = 8;
293 pub const IN4ADDR_LINKLOCALPREFIX_LENGTH: usize = 16;
294 pub const IN4ADDR_MULTICASTPREFIX_LENGTH: usize = 4;
295 #[inline]
IN4_ADDR_EQUAL(a: &IN_ADDR, b: &IN_ADDR) -> bool296 pub fn IN4_ADDR_EQUAL(a: &IN_ADDR, b: &IN_ADDR) -> bool {
297     unsafe { *a.S_un.S_addr() == *b.S_un.S_addr() }
298 }
299 #[inline]
IN4_UNALIGNED_ADDR_EQUAL(a: &IN_ADDR, b: &IN_ADDR) -> bool300 pub fn IN4_UNALIGNED_ADDR_EQUAL(a: &IN_ADDR, b: &IN_ADDR) -> bool {
301     unsafe { *a.S_un.S_addr() == *b.S_un.S_addr() }
302 }
303 #[inline]
IN4_IS_ADDR_UNSPECIFIED(a: &IN_ADDR) -> bool304 pub fn IN4_IS_ADDR_UNSPECIFIED(a: &IN_ADDR) -> bool {
305     unsafe { *a.S_un.S_addr() == IN4ADDR_ANY }
306 }
307 #[inline]
IN4_IS_UNALIGNED_ADDR_UNSPECIFIED(a: &IN_ADDR) -> bool308 pub fn IN4_IS_UNALIGNED_ADDR_UNSPECIFIED(a: &IN_ADDR) -> bool {
309     unsafe { *a.S_un.S_addr() == IN4ADDR_ANY }
310 }
311 #[inline]
IN4_IS_ADDR_LOOPBACK(a: &IN_ADDR) -> bool312 pub fn IN4_IS_ADDR_LOOPBACK(a: &IN_ADDR) -> bool {
313     unsafe { a.S_un.S_un_b().s_b1 == 0x7f }
314 }
315 #[inline]
IN4_IS_UNALIGNED_ADDR_LOOPBACK(a: &IN_ADDR) -> bool316 pub fn IN4_IS_UNALIGNED_ADDR_LOOPBACK(a: &IN_ADDR) -> bool {
317     unsafe { a.S_un.S_un_b().s_b1 == 0x7f }
318 }
319 #[inline]
IN4_IS_ADDR_BROADCAST(a: &IN_ADDR) -> bool320 pub fn IN4_IS_ADDR_BROADCAST(a: &IN_ADDR) -> bool {
321     unsafe { *a.S_un.S_addr() == IN4ADDR_BROADCAST }
322 }
323 #[inline]
IN4_IS_UNALIGNED_ADDR_BROADCAST(a: &IN_ADDR) -> bool324 pub fn IN4_IS_UNALIGNED_ADDR_BROADCAST(a: &IN_ADDR) -> bool {
325     unsafe { *a.S_un.S_addr() == IN4ADDR_BROADCAST }
326 }
327 #[inline]
IN4_IS_ADDR_MULTICAST(a: &IN_ADDR) -> bool328 pub fn IN4_IS_ADDR_MULTICAST(a: &IN_ADDR) -> bool {
329     IN4_MULTICAST(unsafe { *a.S_un.S_addr() as LONG })
330 }
331 #[inline]
IN4_IS_UNALIGNED_ADDR_MULTICAST(a: &IN_ADDR) -> bool332 pub fn IN4_IS_UNALIGNED_ADDR_MULTICAST(a: &IN_ADDR) -> bool {
333     IN4_MULTICAST(unsafe { *a.S_un.S_addr() as LONG })
334 }
335 #[inline]
IN4_IS_ADDR_LINKLOCAL(a: &IN_ADDR) -> bool336 pub fn IN4_IS_ADDR_LINKLOCAL(a: &IN_ADDR) -> bool {
337     unsafe { (*a.S_un.S_addr() & 0xffff) == 0xfea9 }
338 }
339 #[inline]
IN4_IS_UNALIGNED_ADDR_LINKLOCAL(a: &IN_ADDR) -> bool340 pub fn IN4_IS_UNALIGNED_ADDR_LINKLOCAL(a: &IN_ADDR) -> bool {
341     unsafe { (*a.S_un.S_addr() & 0xffff) == 0xfea9 }
342 }
343 #[inline]
IN4_IS_ADDR_SITELOCAL(_: &IN_ADDR) -> bool344 pub fn IN4_IS_ADDR_SITELOCAL(_: &IN_ADDR) -> bool {
345     false
346 }
347 #[inline]
IN4_IS_UNALIGNED_ADDR_SITELOCAL(_: &IN_ADDR) -> bool348 pub fn IN4_IS_UNALIGNED_ADDR_SITELOCAL(_: &IN_ADDR) -> bool {
349     false
350 }
351 #[inline]
IN4_IS_ADDR_RFC1918(a: &IN_ADDR) -> bool352 pub fn IN4_IS_ADDR_RFC1918(a: &IN_ADDR) -> bool {
353     let s_addr = unsafe { *a.S_un.S_addr() };
354     ((s_addr & 0x00ff) == 0x0a) || ((s_addr & 0xf0ff) == 0x10ac) || ((s_addr & 0xffff) == 0xa8c0)
355 }
356 #[inline]
IN4_IS_UNALIGNED_ADDR_RFC1918(a: &IN_ADDR) -> bool357 pub fn IN4_IS_UNALIGNED_ADDR_RFC1918(a: &IN_ADDR) -> bool {
358     IN4_IS_ADDR_RFC1918(a)
359 }
360 #[inline]
IN4_IS_ADDR_MC_LINKLOCAL(a: &IN_ADDR) -> bool361 pub fn IN4_IS_ADDR_MC_LINKLOCAL(a: &IN_ADDR) -> bool {
362     unsafe { (*a.S_un.S_addr() & 0xffffff) == 0xe0 }
363 }
364 #[inline]
IN4_IS_ADDR_MC_ADMINLOCAL(a: &IN_ADDR) -> bool365 pub fn IN4_IS_ADDR_MC_ADMINLOCAL(a: &IN_ADDR) -> bool {
366     unsafe { (*a.S_un.S_addr() & 0xffff) == 0xffef }
367 }
368 #[inline]
IN4_IS_ADDR_MC_SITELOCAL(a: &IN_ADDR) -> bool369 pub fn IN4_IS_ADDR_MC_SITELOCAL(a: &IN_ADDR) -> bool {
370     let first = unsafe { (*a.S_un.S_addr() & 0xff) == 0xef };
371     first && !IN4_IS_ADDR_MC_ADMINLOCAL(a)
372 }
373 #[inline]
IN4ADDR_ISANY(a: &SOCKADDR_IN) -> bool374 pub fn IN4ADDR_ISANY(a: &SOCKADDR_IN) -> bool {
375     IN4_IS_ADDR_UNSPECIFIED(&a.sin_addr)
376 }
377 #[inline]
IN4ADDR_ISLOOPBACK(a: &SOCKADDR_IN) -> bool378 pub fn IN4ADDR_ISLOOPBACK(a: &SOCKADDR_IN) -> bool {
379     IN4_IS_ADDR_LOOPBACK(&a.sin_addr)
380 }
381 extern "system" {
RtlIpv4AddressToStringA( Addr: *const IN_ADDR, S: PSTR, ) -> PSTR382     pub fn RtlIpv4AddressToStringA(
383         Addr: *const IN_ADDR,
384         S: PSTR,
385     ) -> PSTR;
RtlIpv4AddressToStringExA( Address: *const IN_ADDR, Port: USHORT, AddressString: PSTR, AddressStringLength: PULONG, ) -> LONG386     pub fn RtlIpv4AddressToStringExA(
387         Address: *const IN_ADDR,
388         Port: USHORT,
389         AddressString: PSTR,
390         AddressStringLength: PULONG,
391     ) -> LONG;
RtlIpv4AddressToStringW( Addr: *const IN_ADDR, S: PWSTR, ) -> PWSTR392     pub fn RtlIpv4AddressToStringW(
393         Addr: *const IN_ADDR,
394         S: PWSTR,
395     ) -> PWSTR;
RtlIpv4AddressToStringExW( Address: *const IN_ADDR, Port: USHORT, AddressString: PWSTR, AddressStringLength: PULONG, ) -> LONG396     pub fn RtlIpv4AddressToStringExW(
397         Address: *const IN_ADDR,
398         Port: USHORT,
399         AddressString: PWSTR,
400         AddressStringLength: PULONG,
401     ) -> LONG;
RtlIpv4StringToAddressA( S: PCSTR, Strict: BOOLEAN, Terminator: *mut PCSTR, Addr: *mut IN_ADDR, ) -> LONG402     pub fn RtlIpv4StringToAddressA(
403         S: PCSTR,
404         Strict: BOOLEAN,
405         Terminator: *mut PCSTR,
406         Addr: *mut IN_ADDR,
407     ) -> LONG;
RtlIpv4StringToAddressExA( AddressString: PCSTR, Strict: BOOLEAN, Address: *mut IN_ADDR, Port: PUSHORT, ) -> LONG408     pub fn RtlIpv4StringToAddressExA(
409         AddressString: PCSTR,
410         Strict: BOOLEAN,
411         Address: *mut IN_ADDR,
412         Port: PUSHORT,
413     ) -> LONG;
RtlIpv4StringToAddressW( S: PCWSTR, Strict: BOOLEAN, Terminator: *mut LPCWSTR, Addr: *mut IN_ADDR, ) -> LONG414     pub fn RtlIpv4StringToAddressW(
415         S: PCWSTR,
416         Strict: BOOLEAN,
417         Terminator: *mut LPCWSTR,
418         Addr: *mut IN_ADDR,
419     ) -> LONG;
RtlIpv4StringToAddressExW( AddressString: PCWSTR, Strict: BOOLEAN, Address: *mut IN_ADDR, Port: PUSHORT, ) -> LONG420     pub fn RtlIpv4StringToAddressExW(
421         AddressString: PCWSTR,
422         Strict: BOOLEAN,
423         Address: *mut IN_ADDR,
424         Port: PUSHORT,
425     ) -> LONG;
RtlIpv6AddressToStringA( Addr: *const IN6_ADDR, S: PSTR, ) -> PSTR426     pub fn RtlIpv6AddressToStringA(
427         Addr: *const IN6_ADDR,
428         S: PSTR,
429     ) -> PSTR;
RtlIpv6AddressToStringExA( Address: *const IN6_ADDR, ScopeId: ULONG, Port: USHORT, AddressString: PSTR, AddressStringLength: PULONG, ) -> LONG430     pub fn RtlIpv6AddressToStringExA(
431         Address: *const IN6_ADDR,
432         ScopeId: ULONG,
433         Port: USHORT,
434         AddressString: PSTR,
435         AddressStringLength: PULONG,
436     ) -> LONG;
RtlIpv6AddressToStringW( Addr: *const IN6_ADDR, S: PWSTR, ) -> PWSTR437     pub fn RtlIpv6AddressToStringW(
438         Addr: *const IN6_ADDR,
439         S: PWSTR,
440     ) -> PWSTR;
RtlIpv6AddressToStringExW( Address: *const IN6_ADDR, ScopeId: ULONG, Port: USHORT, AddressString: PWSTR, AddressStringLength: PULONG, ) -> LONG441     pub fn RtlIpv6AddressToStringExW(
442         Address: *const IN6_ADDR,
443         ScopeId: ULONG,
444         Port: USHORT,
445         AddressString: PWSTR,
446         AddressStringLength: PULONG,
447     ) -> LONG;
RtlIpv6StringToAddressA( S: PCSTR, Terminator: *mut PCSTR, Addr: *mut IN6_ADDR, ) -> LONG448     pub fn RtlIpv6StringToAddressA(
449         S: PCSTR,
450         Terminator: *mut PCSTR,
451         Addr: *mut IN6_ADDR,
452     ) -> LONG;
RtlIpv6StringToAddressExA( AddressString: PCSTR, Address: *mut IN6_ADDR, ScopeId: PULONG, Port: PUSHORT, ) -> LONG453     pub fn RtlIpv6StringToAddressExA(
454         AddressString: PCSTR,
455         Address: *mut IN6_ADDR,
456         ScopeId: PULONG,
457         Port: PUSHORT,
458     ) -> LONG;
RtlIpv6StringToAddressW( S: PCWSTR, Terminator: *mut PCWSTR, Addr: *mut IN6_ADDR, ) -> LONG459     pub fn RtlIpv6StringToAddressW(
460         S: PCWSTR,
461         Terminator: *mut PCWSTR,
462         Addr: *mut IN6_ADDR,
463     ) -> LONG;
RtlIpv6StringToAddressExW( AddressString: PCWSTR, Address: *mut IN6_ADDR, ScopeId: PULONG, Port: PUSHORT, ) -> LONG464     pub fn RtlIpv6StringToAddressExW(
465         AddressString: PCWSTR,
466         Address: *mut IN6_ADDR,
467         ScopeId: PULONG,
468         Port: PUSHORT,
469     ) -> LONG;
470 }
471 DECLARE_HANDLE!{DL_EUI48, _DL_EUI48}
472 pub type PDL_EUI48 = *mut DL_EUI48;
473 extern "system" {
RtlEthernetAddressToStringA( Addr: *const DL_EUI48, S: PSTR, ) -> PSTR474     pub fn RtlEthernetAddressToStringA(
475         Addr: *const DL_EUI48,
476         S: PSTR,
477     ) -> PSTR;
RtlEthernetAddressToStringW( Addr: *const DL_EUI48, S: PWSTR, ) -> PWSTR478     pub fn RtlEthernetAddressToStringW(
479         Addr: *const DL_EUI48,
480         S: PWSTR,
481     ) -> PWSTR;
RtlEthernetStringToAddressA( S: PCSTR, Terminator: *mut PCSTR, Addr: *mut DL_EUI48, ) -> LONG482     pub fn RtlEthernetStringToAddressA(
483         S: PCSTR,
484         Terminator: *mut PCSTR,
485         Addr: *mut DL_EUI48,
486     ) -> LONG;
RtlEthernetStringToAddressW( S: PCWSTR, Terminator: *mut LPCWSTR, Addr: *mut DL_EUI48, ) -> LONG487     pub fn RtlEthernetStringToAddressW(
488         S: PCWSTR,
489         Terminator: *mut LPCWSTR,
490         Addr: *mut DL_EUI48,
491     ) -> LONG;
492 }
493