winapi_ui_automation/shared/
mstcpip.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//! This module contains Microsoft-specific extensions to the core Winsock definitions.
7use ctypes::wchar_t;
8use shared::basetsd::{UINT32, UINT64, ULONG64};
9use shared::guiddef::GUID;
10use shared::in6addr::IN6_ADDR;
11use shared::inaddr::IN_ADDR;
12use shared::minwindef::{DWORD, PULONG, PUSHORT, UCHAR, ULONG, USHORT};
13use shared::ws2def::{
14    INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, IOC_VENDOR, SOCKADDR_IN,
15    SOCKADDR_STORAGE,
16};
17use um::winnt::{BOOLEAN, LONG, LPCWSTR, PCSTR, PCWSTR, PSTR, PWSTR};
18DEFINE_GUID!{SOCKET_DEFAULT2_QM_POLICY,
19    0xaec2ef9c, 0x3a4d, 0x4d3e, 0x88, 0x42, 0x23, 0x99, 0x42, 0xe3, 0x9a, 0x47}
20DEFINE_GUID!{REAL_TIME_NOTIFICATION_CAPABILITY,
21    0x6b59819a, 0x5cae, 0x492d, 0xa9, 0x01, 0x2a, 0x3c, 0x2c, 0x50, 0x16, 0x4f}
22DEFINE_GUID!{REAL_TIME_NOTIFICATION_CAPABILITY_EX,
23    0x6843da03, 0x154a, 0x4616, 0xa5, 0x08, 0x44, 0x37, 0x12, 0x95, 0xf9, 0x6b}
24DEFINE_GUID!{ASSOCIATE_NAMERES_CONTEXT,
25    0x59a38b67, 0xd4fe, 0x46e1, 0xba, 0x3c, 0x87, 0xea, 0x74, 0xca, 0x30, 0x49}
26ENUM!{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}}
40STRUCT!{struct TRANSPORT_SETTING_ID {
41    Guid: GUID,
42}}
43pub type PTRANSPORT_SETTING_ID = *mut TRANSPORT_SETTING_ID;
44STRUCT!{struct tcp_keepalive {
45    onoff: ULONG,
46    keepalivetime: ULONG,
47    keepaliveinterval: ULONG,
48}}
49ENUM!{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}}
58pub type PCONTROL_CHANNEL_TRIGGER_STATUS = *mut CONTROL_CHANNEL_TRIGGER_STATUS;
59pub const CONTROL_CHANNEL_TRIGGER_STATUS_MAX: u32 = CONTROL_CHANNEL_TRIGGER_STATUS_SYSTEM_ERROR;
60STRUCT!{struct REAL_TIME_NOTIFICATION_SETTING_INPUT {
61    TransportSettingId: TRANSPORT_SETTING_ID,
62    BrokerEventGuid: GUID,
63}}
64pub type PREAL_TIME_NOTIFICATION_SETTING_INPUT = *mut REAL_TIME_NOTIFICATION_SETTING_INPUT;
65STRUCT!{struct REAL_TIME_NOTIFICATION_SETTING_INPUT_EX {
66    TransportSettingId: TRANSPORT_SETTING_ID,
67    BrokerEventGuid: GUID,
68    Unmark: BOOLEAN,
69}}
70pub type PREAL_TIME_NOTIFICATION_SETTING_INPUT_EX = *mut REAL_TIME_NOTIFICATION_SETTING_INPUT_EX;
71STRUCT!{struct REAL_TIME_NOTIFICATION_SETTING_OUTPUT {
72    ChannelStatus: CONTROL_CHANNEL_TRIGGER_STATUS,
73}}
74pub type PREAL_TIME_NOTIFICATION_SETTING_OUTPUT = *mut REAL_TIME_NOTIFICATION_SETTING_OUTPUT;
75STRUCT!{struct ASSOCIATE_NAMERES_CONTEXT_INPUT {
76    TransportSettingId: TRANSPORT_SETTING_ID,
77    Handle: UINT64,
78}}
79pub type PASSOCIATE_NAMERES_CONTEXT_INPUT = *mut ASSOCIATE_NAMERES_CONTEXT_INPUT;
80pub const SIO_RCVALL: DWORD = _WSAIOW!(IOC_VENDOR,1);
81pub const SIO_RCVALL_MCAST: DWORD = _WSAIOW!(IOC_VENDOR,2);
82pub const SIO_RCVALL_IGMPMCAST: DWORD = _WSAIOW!(IOC_VENDOR,3);
83pub const SIO_KEEPALIVE_VALS: DWORD = _WSAIOW!(IOC_VENDOR,4);
84pub const SIO_ABSORB_RTRALERT: DWORD = _WSAIOW!(IOC_VENDOR,5);
85pub const SIO_UCAST_IF: DWORD = _WSAIOW!(IOC_VENDOR,6);
86pub const SIO_LIMIT_BROADCASTS: DWORD = _WSAIOW!(IOC_VENDOR,7);
87pub const SIO_INDEX_BIND: DWORD = _WSAIOW!(IOC_VENDOR,8);
88pub const SIO_INDEX_MCASTIF: DWORD = _WSAIOW!(IOC_VENDOR,9);
89pub const SIO_INDEX_ADD_MCAST: DWORD = _WSAIOW!(IOC_VENDOR,10);
90pub const SIO_INDEX_DEL_MCAST: DWORD = _WSAIOW!(IOC_VENDOR,11);
91pub const SIO_RCVALL_MCAST_IF: DWORD = _WSAIOW!(IOC_VENDOR,13);
92pub const SIO_RCVALL_IF: DWORD = _WSAIOW!(IOC_VENDOR,14);
93pub const SIO_LOOPBACK_FAST_PATH: DWORD = _WSAIOW!(IOC_VENDOR,16);
94pub const SIO_TCP_INITIAL_RTO: DWORD = _WSAIOW!(IOC_VENDOR,17);
95pub const SIO_APPLY_TRANSPORT_SETTING: DWORD = _WSAIOW!(IOC_VENDOR,19);
96pub const SIO_QUERY_TRANSPORT_SETTING: DWORD = _WSAIOW!(IOC_VENDOR,20);
97pub const SIO_TCP_SET_ICW: DWORD = _WSAIOW!(IOC_VENDOR,22);
98pub const SIO_TCP_SET_ACK_FREQUENCY: DWORD = _WSAIOW!(IOC_VENDOR,23);
99pub const SIO_TCP_INFO: DWORD = _WSAIORW!(IOC_VENDOR,39);
100ENUM!{enum RCVALL_VALUE {
101    RCVALL_OFF = 0,
102    RCVALL_ON = 1,
103    RCVALL_SOCKETLEVELONLY = 2,
104    RCVALL_IPLEVEL = 3,
105}}
106pub type PRCVALL_VALUE = *mut RCVALL_VALUE;
107STRUCT!{struct RCVALL_IF {
108    Mode: RCVALL_VALUE,
109    Interface: ULONG,
110}}
111pub type PRCVALL_IF = *mut RCVALL_IF;
112pub const TCP_INITIAL_RTO_UNSPECIFIED_RTT: USHORT = -1i16 as u16;
113pub const TCP_INITIAL_RTO_UNSPECIFIED_MAX_SYN_RETRANSMISSIONS: UCHAR = -1i8 as u8;
114pub const TCP_INITIAL_RTO_DEFAULT_RTT: USHORT = 0;
115pub const TCP_INITIAL_RTO_DEFAULT_MAX_SYN_RETRANSMISSIONS: UCHAR = 0;
116STRUCT!{struct TCP_INITIAL_RTO_PARAMETERS {
117    Rtt: USHORT,
118    MaxSynRetransmissions: UCHAR,
119}}
120pub type PTCP_INITIAL_RTO_PARAMETERS = *mut TCP_INITIAL_RTO_PARAMETERS;
121ENUM!{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}}
130pub type PTCP_ICW_LEVEL = *mut TCP_ICW_LEVEL;
131STRUCT!{struct TCP_ICW_PARAMETERS {
132    Level: TCP_ICW_LEVEL,
133}}
134pub type PTCP_ICW_PARAMETERS = *mut TCP_ICW_PARAMETERS;
135STRUCT!{struct TCP_ACK_FREQUENCY_PARAMETERS {
136    TcpDelayedAckFrequency: UCHAR,
137}}
138pub type PTCP_ACK_FREQUENCY_PARAMETERS = *mut TCP_ACK_FREQUENCY_PARAMETERS;
139STRUCT!{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}}
160pub type PTCP_INFO_v0 = *mut TCP_INFO_v0;
161pub const SIO_ACQUIRE_PORT_RESERVATION: DWORD = _WSAIOW!(IOC_VENDOR, 100);
162pub const SIO_RELEASE_PORT_RESERVATION: DWORD = _WSAIOW!(IOC_VENDOR, 101);
163pub const SIO_ASSOCIATE_PORT_RESERVATION: DWORD = _WSAIOW!(IOC_VENDOR, 102);
164STRUCT!{struct INET_PORT_RANGE {
165    StartPort: USHORT,
166    NumberOfPorts: USHORT,
167}}
168pub type PINET_PORT_RANGE = *mut INET_PORT_RANGE;
169pub type INET_PORT_RESERVATION = INET_PORT_RANGE;
170pub type PINET_PORT_RESERVATION = *mut INET_PORT_RANGE;
171STRUCT!{struct INET_PORT_RESERVATION_TOKEN {
172    Token: ULONG64,
173}}
174pub type PINET_PORT_RESERVATION_TOKEN = *mut INET_PORT_RESERVATION_TOKEN;
175STRUCT!{struct INET_PORT_RESERVATION_INSTANCE {
176    Reservation: INET_PORT_RESERVATION,
177    Token: INET_PORT_RESERVATION_TOKEN,
178}}
179pub type PINET_PORT_RESERVATION_INSTANCE = *mut INET_PORT_RESERVATION_INSTANCE;
180STRUCT!{struct INET_PORT_RESERVATION_INFORMATION {
181    OwningPid: ULONG,
182}}
183pub type PINET_PORT_RESERVATION_INFORMATION = *mut INET_PORT_RESERVATION_INFORMATION;
184pub const SIO_SET_SECURITY: DWORD = _WSAIOW!(IOC_VENDOR, 200);
185pub const SIO_QUERY_SECURITY: DWORD = _WSAIORW!(IOC_VENDOR, 201);
186pub const SIO_SET_PEER_TARGET_NAME: DWORD = _WSAIOW!(IOC_VENDOR, 202);
187pub const SIO_DELETE_PEER_TARGET_NAME: DWORD = _WSAIOW!(IOC_VENDOR, 203);
188pub const SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS: DWORD = _WSAIOW!(IOC_VENDOR, 220);
189pub const SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT: DWORD = _WSAIOW!(IOC_VENDOR, 221);
190pub const SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS: DWORD = _WSAIOW!(IOC_VENDOR, 222);
191pub const SIO_SOCKET_USAGE_NOTIFICATION: DWORD = _WSAIOW!(IOC_VENDOR, 204);
192ENUM!{enum SOCKET_USAGE_TYPE {
193    SYSTEM_CRITICAL_SOCKET = 1,
194}}
195ENUM!{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}}
201STRUCT!{struct SOCKET_SECURITY_SETTINGS {
202    SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
203    SecurityFlags: ULONG,
204}}
205pub const SOCKET_SETTINGS_IPSEC_SKIP_FILTER_INSTANTIATION: ULONG = 0x1;
206pub const SOCKET_SETTINGS_IPSEC_OPTIONAL_PEER_NAME_VERIFICATION: ULONG = 0x2;
207pub const SOCKET_SETTINGS_IPSEC_ALLOW_FIRST_INBOUND_PKT_UNENCRYPTED: ULONG = 0x4;
208pub const SOCKET_SETTINGS_IPSEC_PEER_NAME_IS_RAW_FORMAT: ULONG = 0x8;
209STRUCT!{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}}
222STRUCT!{struct SOCKET_PEER_TARGET_NAME {
223    SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
224    PeerAddress: SOCKADDR_STORAGE,
225    PeerTargetNameStringLen: ULONG,
226    AllStrings: [wchar_t; 0],
227}}
228STRUCT!{struct SOCKET_SECURITY_QUERY_TEMPLATE {
229    SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
230    PeerAddress: SOCKADDR_STORAGE,
231    PeerTokenAccessMask: ULONG,
232}}
233pub const SOCKET_QUERY_IPSEC2_ABORT_CONNECTION_ON_FIELD_CHANGE: ULONG = 0x1;
234pub const SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID: ULONG = 0x1;
235pub const SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID: ULONG = 0x2;
236STRUCT!{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}}
243pub const SOCKET_INFO_CONNECTION_SECURED: ULONG = 0x1;
244pub const SOCKET_INFO_CONNECTION_ENCRYPTED: ULONG = 0x2;
245pub const SOCKET_INFO_CONNECTION_IMPERSONATED: ULONG = 0x4;
246STRUCT!{struct SOCKET_SECURITY_QUERY_INFO {
247    SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
248    Flags: ULONG,
249    PeerApplicationAccessTokenHandle: UINT64,
250    PeerMachineAccessTokenHandle: UINT64,
251}}
252STRUCT!{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}}
262pub const SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE: DWORD = _WSAIOR!(IOC_VENDOR, 205);
263pub const SIO_QUERY_RSS_SCALABILITY_INFO: DWORD = _WSAIOR!(IOC_VENDOR, 210);
264STRUCT!{struct RSS_SCALABILITY_INFO {
265    RssEnabled: BOOLEAN,
266}}
267pub type PRSS_SCALABILITY_INFO = *mut RSS_SCALABILITY_INFO;
268#[inline]
269pub fn IN4_CLASSA(i: LONG) -> bool {
270    (i & 0x80) == 0
271}
272#[inline]
273pub fn IN4_CLASSB(i: LONG) -> bool {
274    (i & 0xc0) == 0x80
275}
276#[inline]
277pub fn IN4_CLASSC(i: LONG) -> bool {
278    (i & 0xe0) == 0xc0
279}
280#[inline]
281pub fn IN4_CLASSD(i: LONG) -> bool {
282    (i & 0xf0) == 0xe0
283}
284#[inline]
285pub fn IN4_MULTICAST(i: LONG) -> bool {
286    IN4_CLASSD(i)
287}
288pub const IN4ADDR_ANY: ULONG = INADDR_ANY;
289pub const IN4ADDR_LOOPBACK: ULONG = 0x0100007f;
290pub const IN4ADDR_BROADCAST: ULONG = INADDR_BROADCAST;
291pub const IN4ADDR_NONE: ULONG = INADDR_NONE;
292pub const IN4ADDR_LOOPBACKPREFIX_LENGTH: usize = 8;
293pub const IN4ADDR_LINKLOCALPREFIX_LENGTH: usize = 16;
294pub const IN4ADDR_MULTICASTPREFIX_LENGTH: usize = 4;
295#[inline]
296pub 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]
300pub 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]
304pub fn IN4_IS_ADDR_UNSPECIFIED(a: &IN_ADDR) -> bool {
305    unsafe { *a.S_un.S_addr() == IN4ADDR_ANY }
306}
307#[inline]
308pub fn IN4_IS_UNALIGNED_ADDR_UNSPECIFIED(a: &IN_ADDR) -> bool {
309    unsafe { *a.S_un.S_addr() == IN4ADDR_ANY }
310}
311#[inline]
312pub fn IN4_IS_ADDR_LOOPBACK(a: &IN_ADDR) -> bool {
313    unsafe { a.S_un.S_un_b().s_b1 == 0x7f }
314}
315#[inline]
316pub fn IN4_IS_UNALIGNED_ADDR_LOOPBACK(a: &IN_ADDR) -> bool {
317    unsafe { a.S_un.S_un_b().s_b1 == 0x7f }
318}
319#[inline]
320pub fn IN4_IS_ADDR_BROADCAST(a: &IN_ADDR) -> bool {
321    unsafe { *a.S_un.S_addr() == IN4ADDR_BROADCAST }
322}
323#[inline]
324pub fn IN4_IS_UNALIGNED_ADDR_BROADCAST(a: &IN_ADDR) -> bool {
325    unsafe { *a.S_un.S_addr() == IN4ADDR_BROADCAST }
326}
327#[inline]
328pub fn IN4_IS_ADDR_MULTICAST(a: &IN_ADDR) -> bool {
329    IN4_MULTICAST(unsafe { *a.S_un.S_addr() as LONG })
330}
331#[inline]
332pub fn IN4_IS_UNALIGNED_ADDR_MULTICAST(a: &IN_ADDR) -> bool {
333    IN4_MULTICAST(unsafe { *a.S_un.S_addr() as LONG })
334}
335#[inline]
336pub fn IN4_IS_ADDR_LINKLOCAL(a: &IN_ADDR) -> bool {
337    unsafe { (*a.S_un.S_addr() & 0xffff) == 0xfea9 }
338}
339#[inline]
340pub fn IN4_IS_UNALIGNED_ADDR_LINKLOCAL(a: &IN_ADDR) -> bool {
341    unsafe { (*a.S_un.S_addr() & 0xffff) == 0xfea9 }
342}
343#[inline]
344pub fn IN4_IS_ADDR_SITELOCAL(_: &IN_ADDR) -> bool {
345    false
346}
347#[inline]
348pub fn IN4_IS_UNALIGNED_ADDR_SITELOCAL(_: &IN_ADDR) -> bool {
349    false
350}
351#[inline]
352pub 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]
357pub fn IN4_IS_UNALIGNED_ADDR_RFC1918(a: &IN_ADDR) -> bool {
358    IN4_IS_ADDR_RFC1918(a)
359}
360#[inline]
361pub fn IN4_IS_ADDR_MC_LINKLOCAL(a: &IN_ADDR) -> bool {
362    unsafe { (*a.S_un.S_addr() & 0xffffff) == 0xe0 }
363}
364#[inline]
365pub fn IN4_IS_ADDR_MC_ADMINLOCAL(a: &IN_ADDR) -> bool {
366    unsafe { (*a.S_un.S_addr() & 0xffff) == 0xffef }
367}
368#[inline]
369pub 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]
374pub fn IN4ADDR_ISANY(a: &SOCKADDR_IN) -> bool {
375    IN4_IS_ADDR_UNSPECIFIED(&a.sin_addr)
376}
377#[inline]
378pub fn IN4ADDR_ISLOOPBACK(a: &SOCKADDR_IN) -> bool {
379    IN4_IS_ADDR_LOOPBACK(&a.sin_addr)
380}
381extern "system" {
382    pub fn RtlIpv4AddressToStringA(
383        Addr: *const IN_ADDR,
384        S: PSTR,
385    ) -> PSTR;
386    pub fn RtlIpv4AddressToStringExA(
387        Address: *const IN_ADDR,
388        Port: USHORT,
389        AddressString: PSTR,
390        AddressStringLength: PULONG,
391    ) -> LONG;
392    pub fn RtlIpv4AddressToStringW(
393        Addr: *const IN_ADDR,
394        S: PWSTR,
395    ) -> PWSTR;
396    pub fn RtlIpv4AddressToStringExW(
397        Address: *const IN_ADDR,
398        Port: USHORT,
399        AddressString: PWSTR,
400        AddressStringLength: PULONG,
401    ) -> LONG;
402    pub fn RtlIpv4StringToAddressA(
403        S: PCSTR,
404        Strict: BOOLEAN,
405        Terminator: *mut PCSTR,
406        Addr: *mut IN_ADDR,
407    ) -> LONG;
408    pub fn RtlIpv4StringToAddressExA(
409        AddressString: PCSTR,
410        Strict: BOOLEAN,
411        Address: *mut IN_ADDR,
412        Port: PUSHORT,
413    ) -> LONG;
414    pub fn RtlIpv4StringToAddressW(
415        S: PCWSTR,
416        Strict: BOOLEAN,
417        Terminator: *mut LPCWSTR,
418        Addr: *mut IN_ADDR,
419    ) -> LONG;
420    pub fn RtlIpv4StringToAddressExW(
421        AddressString: PCWSTR,
422        Strict: BOOLEAN,
423        Address: *mut IN_ADDR,
424        Port: PUSHORT,
425    ) -> LONG;
426    pub fn RtlIpv6AddressToStringA(
427        Addr: *const IN6_ADDR,
428        S: PSTR,
429    ) -> PSTR;
430    pub fn RtlIpv6AddressToStringExA(
431        Address: *const IN6_ADDR,
432        ScopeId: ULONG,
433        Port: USHORT,
434        AddressString: PSTR,
435        AddressStringLength: PULONG,
436    ) -> LONG;
437    pub fn RtlIpv6AddressToStringW(
438        Addr: *const IN6_ADDR,
439        S: PWSTR,
440    ) -> PWSTR;
441    pub fn RtlIpv6AddressToStringExW(
442        Address: *const IN6_ADDR,
443        ScopeId: ULONG,
444        Port: USHORT,
445        AddressString: PWSTR,
446        AddressStringLength: PULONG,
447    ) -> LONG;
448    pub fn RtlIpv6StringToAddressA(
449        S: PCSTR,
450        Terminator: *mut PCSTR,
451        Addr: *mut IN6_ADDR,
452    ) -> LONG;
453    pub fn RtlIpv6StringToAddressExA(
454        AddressString: PCSTR,
455        Address: *mut IN6_ADDR,
456        ScopeId: PULONG,
457        Port: PUSHORT,
458    ) -> LONG;
459    pub fn RtlIpv6StringToAddressW(
460        S: PCWSTR,
461        Terminator: *mut PCWSTR,
462        Addr: *mut IN6_ADDR,
463    ) -> LONG;
464    pub fn RtlIpv6StringToAddressExW(
465        AddressString: PCWSTR,
466        Address: *mut IN6_ADDR,
467        ScopeId: PULONG,
468        Port: PUSHORT,
469    ) -> LONG;
470}
471DECLARE_HANDLE!{DL_EUI48, _DL_EUI48}
472pub type PDL_EUI48 = *mut DL_EUI48;
473extern "system" {
474    pub fn RtlEthernetAddressToStringA(
475        Addr: *const DL_EUI48,
476        S: PSTR,
477    ) -> PSTR;
478    pub fn RtlEthernetAddressToStringW(
479        Addr: *const DL_EUI48,
480        S: PWSTR,
481    ) -> PWSTR;
482    pub fn RtlEthernetStringToAddressA(
483        S: PCSTR,
484        Terminator: *mut PCSTR,
485        Addr: *mut DL_EUI48,
486    ) -> LONG;
487    pub fn RtlEthernetStringToAddressW(
488        S: PCWSTR,
489        Terminator: *mut LPCWSTR,
490        Addr: *mut DL_EUI48,
491    ) -> LONG;
492}