// 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,
0 xaec2ef9c,
0 x3a4d,
0 x4d3e,
0 x88,
0 x42,
0 x23,
0 x99,
0 x42,
0 xe3,
0 x9a,
0 x47}
DEFINE_GUID!{REAL_TIME_NOTIFICATION_CAPABILITY,
0 x6b59819a,
0 x5cae,
0 x492d,
0 xa9,
0 x01,
0 x2a,
0 x3c,
0 x2c,
0 x50,
0 x16,
0 x4f}
DEFINE_GUID!{REAL_TIME_NOTIFICATION_CAPABILITY_EX,
0 x6843da03,
0 x154a,
0 x4616,
0 xa5,
0 x08,
0 x44,
0 x37,
0 x12,
0 x95,
0 xf9,
0 x6b}
DEFINE_GUID!{ASSOCIATE_NAMERES_CONTEXT,
0 x59a38b67,
0 xd4fe,
0 x46e1,
0 xba,
0 x3c,
0 x87,
0 xea,
0 x74,
0 xca,
0 x30,
0 x49}
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_SY
STEM_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 = -1 i16 as u16;
pub const TCP_INITIAL_RTO_UNSPECIFIED_MAX_SYN_RETRANSMISSIONS: UCHAR = -1 i8 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 = 0 x1;
pub const SOCKET_SETTINGS_IPSEC_OPTIONAL_PEER_NAME_VERIFICATION: ULONG = 0 x2;
pub const SOCKET_SETTINGS_IPSEC_ALLOW_FIRST_INBOUND_PKT_UNENCRYPTED: ULONG = 0 x4;
pub const SOCKET_SETTINGS_IPSEC_PEER_NAME_IS_RAW_FORMAT: ULONG = 0 x8;
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 = 0 x1;
pub const SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID: ULONG = 0 x1;
pub const SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID: ULONG = 0 x2;
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 = 0 x1;
pub const SOCKET_INFO_CONNECTION_ENCRYPTED: ULONG = 0 x2;
pub const SOCKET_INFO_CONNECTION_IMPERSONATED: ULONG = 0 x4;
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 & 0 x80) == 0
}
#[ inline]
pub fn IN4_CLASSB(i: LONG) -> bool {
(i & 0 xc0) == 0 x80
}
#[ inline]
pub fn IN4_CLASSC(i: LONG) -> bool {
(i & 0 xe0) == 0 xc0
}
#[ inline]
pub fn IN4_CLASSD(i: LONG) -> bool {
(i & 0 xf0) == 0 xe0
}
#[ inline]
pub fn IN4_MULTICAST(i: LONG) -> bool {
IN4_CLASSD(i)
}
pub const IN4ADDR_ANY: ULONG = INADDR_ANY;
pub const IN4ADDR_LOOPBACK: ULONG = 0 x0100007f;
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 == 0 x7f }
}
#[ inline]
pub fn IN4_IS_UNALIGNED_ADDR_LOOPBACK(a: &IN_ADDR) -> bool {
unsafe { a.S_un.S_un_b().s_b1 == 0 x7f }
}
#[ 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() & 0 xffff) == 0 xfea9 }
}
#[ inline]
pub fn IN4_IS_UNALIGNED_ADDR_LINKLOCAL(a: &IN_ADDR) -> bool {
unsafe { (*a.S_un.S_addr() & 0 xffff) == 0 xfea9 }
}
#[ 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 & 0 x00ff) == 0 x0a) || ((s_addr & 0 xf0ff) == 0 x10ac) || ((s_addr & 0 xffff) == 0 xa8c0)
}
#[ 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() & 0 xffffff) == 0 xe0 }
}
#[ inline]
pub fn IN4_IS_ADDR_MC_ADMINLOCAL(a: &IN_ADDR) -> bool {
unsafe { (*a.S_un.S_addr() & 0 xffff) == 0 xffef }
}
#[ inline]
pub fn IN4_IS_ADDR_MC_SITELOCAL(a: &IN_ADDR) -> bool {
let first = unsafe { (*a.S_un.S_addr() & 0 xff) == 0 xef };
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;
}
Messung V0.5 in Prozent C=70 H=97 G=84
¤ Dauer der Verarbeitung: 0.2 Sekunden
(vorverarbeitet am 2026-06-19)
¤
*© Formatika GbR, Deutschland