summaryrefslogtreecommitdiffstats
path: root/third_party/rust/winapi/src/shared/mstcpip.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/winapi/src/shared/mstcpip.rs')
-rw-r--r--third_party/rust/winapi/src/shared/mstcpip.rs492
1 files changed, 492 insertions, 0 deletions
diff --git a/third_party/rust/winapi/src/shared/mstcpip.rs b/third_party/rust/winapi/src/shared/mstcpip.rs
new file mode 100644
index 0000000000..fe2072544d
--- /dev/null
+++ b/third_party/rust/winapi/src/shared/mstcpip.rs
@@ -0,0 +1,492 @@
+// Licensed under the Apache License, Version 2.0
+// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
+// All files in the project carrying such notice may not be copied, modified, or distributed
+// except according to those terms
+//! This module contains Microsoft-specific extensions to the core Winsock definitions.
+use ctypes::wchar_t;
+use shared::basetsd::{UINT32, UINT64, ULONG64};
+use shared::guiddef::GUID;
+use shared::in6addr::IN6_ADDR;
+use shared::inaddr::IN_ADDR;
+use shared::minwindef::{DWORD, PULONG, PUSHORT, UCHAR, ULONG, USHORT};
+use shared::ws2def::{
+ INADDR_ANY, INADDR_BROADCAST, INADDR_NONE, IOC_VENDOR, SOCKADDR_IN,
+ SOCKADDR_STORAGE,
+};
+use um::winnt::{BOOLEAN, LONG, LPCWSTR, PCSTR, PCWSTR, PSTR, PWSTR};
+DEFINE_GUID!{SOCKET_DEFAULT2_QM_POLICY,
+ 0xaec2ef9c, 0x3a4d, 0x4d3e, 0x88, 0x42, 0x23, 0x99, 0x42, 0xe3, 0x9a, 0x47}
+DEFINE_GUID!{REAL_TIME_NOTIFICATION_CAPABILITY,
+ 0x6b59819a, 0x5cae, 0x492d, 0xa9, 0x01, 0x2a, 0x3c, 0x2c, 0x50, 0x16, 0x4f}
+DEFINE_GUID!{REAL_TIME_NOTIFICATION_CAPABILITY_EX,
+ 0x6843da03, 0x154a, 0x4616, 0xa5, 0x08, 0x44, 0x37, 0x12, 0x95, 0xf9, 0x6b}
+DEFINE_GUID!{ASSOCIATE_NAMERES_CONTEXT,
+ 0x59a38b67, 0xd4fe, 0x46e1, 0xba, 0x3c, 0x87, 0xea, 0x74, 0xca, 0x30, 0x49}
+ENUM!{enum TCPSTATE {
+ TCPSTATE_CLOSED,
+ TCPSTATE_LISTEN,
+ TCPSTATE_SYN_SENT,
+ TCPSTATE_SYN_RCVD,
+ TCPSTATE_ESTABLISHED,
+ TCPSTATE_FIN_WAIT_1,
+ TCPSTATE_FIN_WAIT_2,
+ TCPSTATE_CLOSE_WAIT,
+ TCPSTATE_CLOSING,
+ TCPSTATE_LAST_ACK,
+ TCPSTATE_TIME_WAIT,
+ TCPSTATE_MAX,
+}}
+STRUCT!{struct TRANSPORT_SETTING_ID {
+ Guid: GUID,
+}}
+pub type PTRANSPORT_SETTING_ID = *mut TRANSPORT_SETTING_ID;
+STRUCT!{struct tcp_keepalive {
+ onoff: ULONG,
+ keepalivetime: ULONG,
+ keepaliveinterval: ULONG,
+}}
+ENUM!{enum CONTROL_CHANNEL_TRIGGER_STATUS {
+ CONTROL_CHANNEL_TRIGGER_STATUS_INVALID = 0,
+ CONTROL_CHANNEL_TRIGGER_STATUS_SOFTWARE_SLOT_ALLOCATED = 1,
+ CONTROL_CHANNEL_TRIGGER_STATUS_HARDWARE_SLOT_ALLOCATED = 2,
+ CONTROL_CHANNEL_TRIGGER_STATUS_POLICY_ERROR = 3,
+ CONTROL_CHANNEL_TRIGGER_STATUS_SYSTEM_ERROR = 4,
+ CONTROL_CHANNEL_TRIGGER_STATUS_TRANSPORT_DISCONNECTED = 5,
+ CONTROL_CHANNEL_TRIGGER_STATUS_SERVICE_UNAVAILABLE = 6,
+}}
+pub type PCONTROL_CHANNEL_TRIGGER_STATUS = *mut CONTROL_CHANNEL_TRIGGER_STATUS;
+pub const CONTROL_CHANNEL_TRIGGER_STATUS_MAX: u32 = CONTROL_CHANNEL_TRIGGER_STATUS_SYSTEM_ERROR;
+STRUCT!{struct REAL_TIME_NOTIFICATION_SETTING_INPUT {
+ TransportSettingId: TRANSPORT_SETTING_ID,
+ BrokerEventGuid: GUID,
+}}
+pub type PREAL_TIME_NOTIFICATION_SETTING_INPUT = *mut REAL_TIME_NOTIFICATION_SETTING_INPUT;
+STRUCT!{struct REAL_TIME_NOTIFICATION_SETTING_INPUT_EX {
+ TransportSettingId: TRANSPORT_SETTING_ID,
+ BrokerEventGuid: GUID,
+ Unmark: BOOLEAN,
+}}
+pub type PREAL_TIME_NOTIFICATION_SETTING_INPUT_EX = *mut REAL_TIME_NOTIFICATION_SETTING_INPUT_EX;
+STRUCT!{struct REAL_TIME_NOTIFICATION_SETTING_OUTPUT {
+ ChannelStatus: CONTROL_CHANNEL_TRIGGER_STATUS,
+}}
+pub type PREAL_TIME_NOTIFICATION_SETTING_OUTPUT = *mut REAL_TIME_NOTIFICATION_SETTING_OUTPUT;
+STRUCT!{struct ASSOCIATE_NAMERES_CONTEXT_INPUT {
+ TransportSettingId: TRANSPORT_SETTING_ID,
+ Handle: UINT64,
+}}
+pub type PASSOCIATE_NAMERES_CONTEXT_INPUT = *mut ASSOCIATE_NAMERES_CONTEXT_INPUT;
+pub const SIO_RCVALL: DWORD = _WSAIOW!(IOC_VENDOR,1);
+pub const SIO_RCVALL_MCAST: DWORD = _WSAIOW!(IOC_VENDOR,2);
+pub const SIO_RCVALL_IGMPMCAST: DWORD = _WSAIOW!(IOC_VENDOR,3);
+pub const SIO_KEEPALIVE_VALS: DWORD = _WSAIOW!(IOC_VENDOR,4);
+pub const SIO_ABSORB_RTRALERT: DWORD = _WSAIOW!(IOC_VENDOR,5);
+pub const SIO_UCAST_IF: DWORD = _WSAIOW!(IOC_VENDOR,6);
+pub const SIO_LIMIT_BROADCASTS: DWORD = _WSAIOW!(IOC_VENDOR,7);
+pub const SIO_INDEX_BIND: DWORD = _WSAIOW!(IOC_VENDOR,8);
+pub const SIO_INDEX_MCASTIF: DWORD = _WSAIOW!(IOC_VENDOR,9);
+pub const SIO_INDEX_ADD_MCAST: DWORD = _WSAIOW!(IOC_VENDOR,10);
+pub const SIO_INDEX_DEL_MCAST: DWORD = _WSAIOW!(IOC_VENDOR,11);
+pub const SIO_RCVALL_MCAST_IF: DWORD = _WSAIOW!(IOC_VENDOR,13);
+pub const SIO_RCVALL_IF: DWORD = _WSAIOW!(IOC_VENDOR,14);
+pub const SIO_LOOPBACK_FAST_PATH: DWORD = _WSAIOW!(IOC_VENDOR,16);
+pub const SIO_TCP_INITIAL_RTO: DWORD = _WSAIOW!(IOC_VENDOR,17);
+pub const SIO_APPLY_TRANSPORT_SETTING: DWORD = _WSAIOW!(IOC_VENDOR,19);
+pub const SIO_QUERY_TRANSPORT_SETTING: DWORD = _WSAIOW!(IOC_VENDOR,20);
+pub const SIO_TCP_SET_ICW: DWORD = _WSAIOW!(IOC_VENDOR,22);
+pub const SIO_TCP_SET_ACK_FREQUENCY: DWORD = _WSAIOW!(IOC_VENDOR,23);
+pub const SIO_TCP_INFO: DWORD = _WSAIORW!(IOC_VENDOR,39);
+ENUM!{enum RCVALL_VALUE {
+ RCVALL_OFF = 0,
+ RCVALL_ON = 1,
+ RCVALL_SOCKETLEVELONLY = 2,
+ RCVALL_IPLEVEL = 3,
+}}
+pub type PRCVALL_VALUE = *mut RCVALL_VALUE;
+STRUCT!{struct RCVALL_IF {
+ Mode: RCVALL_VALUE,
+ Interface: ULONG,
+}}
+pub type PRCVALL_IF = *mut RCVALL_IF;
+pub const TCP_INITIAL_RTO_UNSPECIFIED_RTT: USHORT = -1i16 as u16;
+pub const TCP_INITIAL_RTO_UNSPECIFIED_MAX_SYN_RETRANSMISSIONS: UCHAR = -1i8 as u8;
+pub const TCP_INITIAL_RTO_DEFAULT_RTT: USHORT = 0;
+pub const TCP_INITIAL_RTO_DEFAULT_MAX_SYN_RETRANSMISSIONS: UCHAR = 0;
+STRUCT!{struct TCP_INITIAL_RTO_PARAMETERS {
+ Rtt: USHORT,
+ MaxSynRetransmissions: UCHAR,
+}}
+pub type PTCP_INITIAL_RTO_PARAMETERS = *mut TCP_INITIAL_RTO_PARAMETERS;
+ENUM!{enum TCP_ICW_LEVEL {
+ TCP_ICW_LEVEL_DEFAULT = 0,
+ TCP_ICW_LEVEL_HIGH = 1,
+ TCP_ICW_LEVEL_VERY_HIGH = 2,
+ TCP_ICW_LEVEL_AGGRESSIVE = 3,
+ TCP_ICW_LEVEL_EXPERIMENTAL = 4,
+ TCP_ICW_LEVEL_COMPAT = 254,
+ TCP_ICW_LEVEL_MAX = 255,
+}}
+pub type PTCP_ICW_LEVEL = *mut TCP_ICW_LEVEL;
+STRUCT!{struct TCP_ICW_PARAMETERS {
+ Level: TCP_ICW_LEVEL,
+}}
+pub type PTCP_ICW_PARAMETERS = *mut TCP_ICW_PARAMETERS;
+STRUCT!{struct TCP_ACK_FREQUENCY_PARAMETERS {
+ TcpDelayedAckFrequency: UCHAR,
+}}
+pub type PTCP_ACK_FREQUENCY_PARAMETERS = *mut TCP_ACK_FREQUENCY_PARAMETERS;
+STRUCT!{struct TCP_INFO_v0 {
+ State: TCPSTATE,
+ Mss: ULONG,
+ ConnectionTimeMs: ULONG64,
+ TimestampsEnabled: BOOLEAN,
+ RttUs: ULONG,
+ MinRttUs: ULONG,
+ BytesInFlight: ULONG,
+ Cwnd: ULONG,
+ SndWnd: ULONG,
+ RcvWnd: ULONG,
+ RcvBuf: ULONG,
+ BytesOut: ULONG64,
+ BytesIn: ULONG64,
+ BytesReordered: ULONG,
+ BytesRetrans: ULONG,
+ FastRetrans: ULONG,
+ DupAcksIn: ULONG,
+ TimeoutEpisodes: ULONG,
+ SynRetrans: UCHAR,
+}}
+pub type PTCP_INFO_v0 = *mut TCP_INFO_v0;
+pub const SIO_ACQUIRE_PORT_RESERVATION: DWORD = _WSAIOW!(IOC_VENDOR, 100);
+pub const SIO_RELEASE_PORT_RESERVATION: DWORD = _WSAIOW!(IOC_VENDOR, 101);
+pub const SIO_ASSOCIATE_PORT_RESERVATION: DWORD = _WSAIOW!(IOC_VENDOR, 102);
+STRUCT!{struct INET_PORT_RANGE {
+ StartPort: USHORT,
+ NumberOfPorts: USHORT,
+}}
+pub type PINET_PORT_RANGE = *mut INET_PORT_RANGE;
+pub type INET_PORT_RESERVATION = INET_PORT_RANGE;
+pub type PINET_PORT_RESERVATION = *mut INET_PORT_RANGE;
+STRUCT!{struct INET_PORT_RESERVATION_TOKEN {
+ Token: ULONG64,
+}}
+pub type PINET_PORT_RESERVATION_TOKEN = *mut INET_PORT_RESERVATION_TOKEN;
+STRUCT!{struct INET_PORT_RESERVATION_INSTANCE {
+ Reservation: INET_PORT_RESERVATION,
+ Token: INET_PORT_RESERVATION_TOKEN,
+}}
+pub type PINET_PORT_RESERVATION_INSTANCE = *mut INET_PORT_RESERVATION_INSTANCE;
+STRUCT!{struct INET_PORT_RESERVATION_INFORMATION {
+ OwningPid: ULONG,
+}}
+pub type PINET_PORT_RESERVATION_INFORMATION = *mut INET_PORT_RESERVATION_INFORMATION;
+pub const SIO_SET_SECURITY: DWORD = _WSAIOW!(IOC_VENDOR, 200);
+pub const SIO_QUERY_SECURITY: DWORD = _WSAIORW!(IOC_VENDOR, 201);
+pub const SIO_SET_PEER_TARGET_NAME: DWORD = _WSAIOW!(IOC_VENDOR, 202);
+pub const SIO_DELETE_PEER_TARGET_NAME: DWORD = _WSAIOW!(IOC_VENDOR, 203);
+pub const SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS: DWORD = _WSAIOW!(IOC_VENDOR, 220);
+pub const SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT: DWORD = _WSAIOW!(IOC_VENDOR, 221);
+pub const SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS: DWORD = _WSAIOW!(IOC_VENDOR, 222);
+pub const SIO_SOCKET_USAGE_NOTIFICATION: DWORD = _WSAIOW!(IOC_VENDOR, 204);
+ENUM!{enum SOCKET_USAGE_TYPE {
+ SYSTEM_CRITICAL_SOCKET = 1,
+}}
+ENUM!{enum SOCKET_SECURITY_PROTOCOL {
+ SOCKET_SECURITY_PROTOCOL_DEFAULT,
+ SOCKET_SECURITY_PROTOCOL_IPSEC,
+ SOCKET_SECURITY_PROTOCOL_IPSEC2,
+ SOCKET_SECURITY_PROTOCOL_INVALID,
+}}
+STRUCT!{struct SOCKET_SECURITY_SETTINGS {
+ SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
+ SecurityFlags: ULONG,
+}}
+pub const SOCKET_SETTINGS_IPSEC_SKIP_FILTER_INSTANTIATION: ULONG = 0x1;
+pub const SOCKET_SETTINGS_IPSEC_OPTIONAL_PEER_NAME_VERIFICATION: ULONG = 0x2;
+pub const SOCKET_SETTINGS_IPSEC_ALLOW_FIRST_INBOUND_PKT_UNENCRYPTED: ULONG = 0x4;
+pub const SOCKET_SETTINGS_IPSEC_PEER_NAME_IS_RAW_FORMAT: ULONG = 0x8;
+STRUCT!{struct SOCKET_SECURITY_SETTINGS_IPSEC {
+ SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
+ SecurityFlags: ULONG,
+ IpsecFlags: ULONG,
+ AuthipMMPolicyKey: GUID,
+ AuthipQMPolicyKey: GUID,
+ Reserved: GUID,
+ Reserved2: UINT64,
+ UserNameStringLen: ULONG,
+ DomainNameStringLen: ULONG,
+ PasswordStringLen: ULONG,
+ AllStrings: [wchar_t; 0],
+}}
+STRUCT!{struct SOCKET_PEER_TARGET_NAME {
+ SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
+ PeerAddress: SOCKADDR_STORAGE,
+ PeerTargetNameStringLen: ULONG,
+ AllStrings: [wchar_t; 0],
+}}
+STRUCT!{struct SOCKET_SECURITY_QUERY_TEMPLATE {
+ SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
+ PeerAddress: SOCKADDR_STORAGE,
+ PeerTokenAccessMask: ULONG,
+}}
+pub const SOCKET_QUERY_IPSEC2_ABORT_CONNECTION_ON_FIELD_CHANGE: ULONG = 0x1;
+pub const SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID: ULONG = 0x1;
+pub const SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID: ULONG = 0x2;
+STRUCT!{struct SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2 {
+ SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
+ PeerAddress: SOCKADDR_STORAGE,
+ PeerTokenAccessMask: ULONG,
+ Flags: ULONG,
+ FieldMask: ULONG,
+}}
+pub const SOCKET_INFO_CONNECTION_SECURED: ULONG = 0x1;
+pub const SOCKET_INFO_CONNECTION_ENCRYPTED: ULONG = 0x2;
+pub const SOCKET_INFO_CONNECTION_IMPERSONATED: ULONG = 0x4;
+STRUCT!{struct SOCKET_SECURITY_QUERY_INFO {
+ SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
+ Flags: ULONG,
+ PeerApplicationAccessTokenHandle: UINT64,
+ PeerMachineAccessTokenHandle: UINT64,
+}}
+STRUCT!{struct SOCKET_SECURITY_QUERY_INFO_IPSEC2 {
+ SecurityProtocol: SOCKET_SECURITY_PROTOCOL,
+ Flags: ULONG,
+ PeerApplicationAccessTokenHandle: UINT64,
+ PeerMachineAccessTokenHandle: UINT64,
+ MmSaId: UINT64,
+ QmSaId: UINT64,
+ NegotiationWinerr: UINT32,
+ SaLookupContext: GUID,
+}}
+pub const SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE: DWORD = _WSAIOR!(IOC_VENDOR, 205);
+pub const SIO_QUERY_RSS_SCALABILITY_INFO: DWORD = _WSAIOR!(IOC_VENDOR, 210);
+STRUCT!{struct RSS_SCALABILITY_INFO {
+ RssEnabled: BOOLEAN,
+}}
+pub type PRSS_SCALABILITY_INFO = *mut RSS_SCALABILITY_INFO;
+#[inline]
+pub fn IN4_CLASSA(i: LONG) -> bool {
+ (i & 0x80) == 0
+}
+#[inline]
+pub fn IN4_CLASSB(i: LONG) -> bool {
+ (i & 0xc0) == 0x80
+}
+#[inline]
+pub fn IN4_CLASSC(i: LONG) -> bool {
+ (i & 0xe0) == 0xc0
+}
+#[inline]
+pub fn IN4_CLASSD(i: LONG) -> bool {
+ (i & 0xf0) == 0xe0
+}
+#[inline]
+pub fn IN4_MULTICAST(i: LONG) -> bool {
+ IN4_CLASSD(i)
+}
+pub const IN4ADDR_ANY: ULONG = INADDR_ANY;
+pub const IN4ADDR_LOOPBACK: ULONG = 0x0100007f;
+pub const IN4ADDR_BROADCAST: ULONG = INADDR_BROADCAST;
+pub const IN4ADDR_NONE: ULONG = INADDR_NONE;
+pub const IN4ADDR_LOOPBACKPREFIX_LENGTH: usize = 8;
+pub const IN4ADDR_LINKLOCALPREFIX_LENGTH: usize = 16;
+pub const IN4ADDR_MULTICASTPREFIX_LENGTH: usize = 4;
+#[inline]
+pub fn IN4_ADDR_EQUAL(a: &IN_ADDR, b: &IN_ADDR) -> bool {
+ unsafe { *a.S_un.S_addr() == *b.S_un.S_addr() }
+}
+#[inline]
+pub fn IN4_UNALIGNED_ADDR_EQUAL(a: &IN_ADDR, b: &IN_ADDR) -> bool {
+ unsafe { *a.S_un.S_addr() == *b.S_un.S_addr() }
+}
+#[inline]
+pub fn IN4_IS_ADDR_UNSPECIFIED(a: &IN_ADDR) -> bool {
+ unsafe { *a.S_un.S_addr() == IN4ADDR_ANY }
+}
+#[inline]
+pub fn IN4_IS_UNALIGNED_ADDR_UNSPECIFIED(a: &IN_ADDR) -> bool {
+ unsafe { *a.S_un.S_addr() == IN4ADDR_ANY }
+}
+#[inline]
+pub fn IN4_IS_ADDR_LOOPBACK(a: &IN_ADDR) -> bool {
+ unsafe { a.S_un.S_un_b().s_b1 == 0x7f }
+}
+#[inline]
+pub fn IN4_IS_UNALIGNED_ADDR_LOOPBACK(a: &IN_ADDR) -> bool {
+ unsafe { a.S_un.S_un_b().s_b1 == 0x7f }
+}
+#[inline]
+pub fn IN4_IS_ADDR_BROADCAST(a: &IN_ADDR) -> bool {
+ unsafe { *a.S_un.S_addr() == IN4ADDR_BROADCAST }
+}
+#[inline]
+pub fn IN4_IS_UNALIGNED_ADDR_BROADCAST(a: &IN_ADDR) -> bool {
+ unsafe { *a.S_un.S_addr() == IN4ADDR_BROADCAST }
+}
+#[inline]
+pub fn IN4_IS_ADDR_MULTICAST(a: &IN_ADDR) -> bool {
+ IN4_MULTICAST(unsafe { *a.S_un.S_addr() as LONG })
+}
+#[inline]
+pub fn IN4_IS_UNALIGNED_ADDR_MULTICAST(a: &IN_ADDR) -> bool {
+ IN4_MULTICAST(unsafe { *a.S_un.S_addr() as LONG })
+}
+#[inline]
+pub fn IN4_IS_ADDR_LINKLOCAL(a: &IN_ADDR) -> bool {
+ unsafe { (*a.S_un.S_addr() & 0xffff) == 0xfea9 }
+}
+#[inline]
+pub fn IN4_IS_UNALIGNED_ADDR_LINKLOCAL(a: &IN_ADDR) -> bool {
+ unsafe { (*a.S_un.S_addr() & 0xffff) == 0xfea9 }
+}
+#[inline]
+pub fn IN4_IS_ADDR_SITELOCAL(_: &IN_ADDR) -> bool {
+ false
+}
+#[inline]
+pub fn IN4_IS_UNALIGNED_ADDR_SITELOCAL(_: &IN_ADDR) -> bool {
+ false
+}
+#[inline]
+pub fn IN4_IS_ADDR_RFC1918(a: &IN_ADDR) -> bool {
+ let s_addr = unsafe { *a.S_un.S_addr() };
+ ((s_addr & 0x00ff) == 0x0a) || ((s_addr & 0xf0ff) == 0x10ac) || ((s_addr & 0xffff) == 0xa8c0)
+}
+#[inline]
+pub fn IN4_IS_UNALIGNED_ADDR_RFC1918(a: &IN_ADDR) -> bool {
+ IN4_IS_ADDR_RFC1918(a)
+}
+#[inline]
+pub fn IN4_IS_ADDR_MC_LINKLOCAL(a: &IN_ADDR) -> bool {
+ unsafe { (*a.S_un.S_addr() & 0xffffff) == 0xe0 }
+}
+#[inline]
+pub fn IN4_IS_ADDR_MC_ADMINLOCAL(a: &IN_ADDR) -> bool {
+ unsafe { (*a.S_un.S_addr() & 0xffff) == 0xffef }
+}
+#[inline]
+pub fn IN4_IS_ADDR_MC_SITELOCAL(a: &IN_ADDR) -> bool {
+ let first = unsafe { (*a.S_un.S_addr() & 0xff) == 0xef };
+ first && !IN4_IS_ADDR_MC_ADMINLOCAL(a)
+}
+#[inline]
+pub fn IN4ADDR_ISANY(a: &SOCKADDR_IN) -> bool {
+ IN4_IS_ADDR_UNSPECIFIED(&a.sin_addr)
+}
+#[inline]
+pub fn IN4ADDR_ISLOOPBACK(a: &SOCKADDR_IN) -> bool {
+ IN4_IS_ADDR_LOOPBACK(&a.sin_addr)
+}
+extern "system" {
+ pub fn RtlIpv4AddressToStringA(
+ Addr: *const IN_ADDR,
+ S: PSTR,
+ ) -> PSTR;
+ pub fn RtlIpv4AddressToStringExA(
+ Address: *const IN_ADDR,
+ Port: USHORT,
+ AddressString: PSTR,
+ AddressStringLength: PULONG,
+ ) -> LONG;
+ pub fn RtlIpv4AddressToStringW(
+ Addr: *const IN_ADDR,
+ S: PWSTR,
+ ) -> PWSTR;
+ pub fn RtlIpv4AddressToStringExW(
+ Address: *const IN_ADDR,
+ Port: USHORT,
+ AddressString: PWSTR,
+ AddressStringLength: PULONG,
+ ) -> LONG;
+ pub fn RtlIpv4StringToAddressA(
+ S: PCSTR,
+ Strict: BOOLEAN,
+ Terminator: *mut PCSTR,
+ Addr: *mut IN_ADDR,
+ ) -> LONG;
+ pub fn RtlIpv4StringToAddressExA(
+ AddressString: PCSTR,
+ Strict: BOOLEAN,
+ Address: *mut IN_ADDR,
+ Port: PUSHORT,
+ ) -> LONG;
+ pub fn RtlIpv4StringToAddressW(
+ S: PCWSTR,
+ Strict: BOOLEAN,
+ Terminator: *mut LPCWSTR,
+ Addr: *mut IN_ADDR,
+ ) -> LONG;
+ pub fn RtlIpv4StringToAddressExW(
+ AddressString: PCWSTR,
+ Strict: BOOLEAN,
+ Address: *mut IN_ADDR,
+ Port: PUSHORT,
+ ) -> LONG;
+ pub fn RtlIpv6AddressToStringA(
+ Addr: *const IN6_ADDR,
+ S: PSTR,
+ ) -> PSTR;
+ pub fn RtlIpv6AddressToStringExA(
+ Address: *const IN6_ADDR,
+ ScopeId: ULONG,
+ Port: USHORT,
+ AddressString: PSTR,
+ AddressStringLength: PULONG,
+ ) -> LONG;
+ pub fn RtlIpv6AddressToStringW(
+ Addr: *const IN6_ADDR,
+ S: PWSTR,
+ ) -> PWSTR;
+ pub fn RtlIpv6AddressToStringExW(
+ Address: *const IN6_ADDR,
+ ScopeId: ULONG,
+ Port: USHORT,
+ AddressString: PWSTR,
+ AddressStringLength: PULONG,
+ ) -> LONG;
+ pub fn RtlIpv6StringToAddressA(
+ S: PCSTR,
+ Terminator: *mut PCSTR,
+ Addr: *mut IN6_ADDR,
+ ) -> LONG;
+ pub fn RtlIpv6StringToAddressExA(
+ AddressString: PCSTR,
+ Address: *mut IN6_ADDR,
+ ScopeId: PULONG,
+ Port: PUSHORT,
+ ) -> LONG;
+ pub fn RtlIpv6StringToAddressW(
+ S: PCWSTR,
+ Terminator: *mut PCWSTR,
+ Addr: *mut IN6_ADDR,
+ ) -> LONG;
+ pub fn RtlIpv6StringToAddressExW(
+ AddressString: PCWSTR,
+ Address: *mut IN6_ADDR,
+ ScopeId: PULONG,
+ Port: PUSHORT,
+ ) -> LONG;
+}
+DECLARE_HANDLE!{DL_EUI48, _DL_EUI48}
+pub type PDL_EUI48 = *mut DL_EUI48;
+extern "system" {
+ pub fn RtlEthernetAddressToStringA(
+ Addr: *const DL_EUI48,
+ S: PSTR,
+ ) -> PSTR;
+ pub fn RtlEthernetAddressToStringW(
+ Addr: *const DL_EUI48,
+ S: PWSTR,
+ ) -> PWSTR;
+ pub fn RtlEthernetStringToAddressA(
+ S: PCSTR,
+ Terminator: *mut PCSTR,
+ Addr: *mut DL_EUI48,
+ ) -> LONG;
+ pub fn RtlEthernetStringToAddressW(
+ S: PCWSTR,
+ Terminator: *mut LPCWSTR,
+ Addr: *mut DL_EUI48,
+ ) -> LONG;
+}