Source code

Revision control

Copy as Markdown

Other Tools

// 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.
use shared::basetsd::{PUINT8, SIZE_T, UINT8, ULONG64};
use shared::guiddef::GUID;
use shared::ifdef::{
IF_MAX_PHYS_ADDRESS_LENGTH, IF_MAX_STRING_SIZE, IF_OPER_STATUS, NET_IFINDEX,
NET_IF_ACCESS_TYPE, NET_IF_ADMIN_STATUS, NET_IF_COMPARTMENT_ID, NET_IF_COMPARTMENT_SCOPE,
NET_IF_CONNECTION_TYPE, NET_IF_DIRECTION_TYPE, NET_IF_MEDIA_CONNECT_STATE, NET_IF_NETWORK_GUID,
NET_LUID, PNET_IFINDEX, PNET_IF_COMPARTMENT_ID, PNET_IF_COMPARTMENT_SCOPE, PNET_LUID,
TUNNEL_TYPE,
};
use shared::ipifcons::IFTYPE;
use shared::minwindef::{BYTE, DWORD, PULONG, UCHAR, ULONG, USHORT};
use shared::nldef::{
NL_BANDWIDTH_INFORMATION, NL_DAD_STATE, NL_INTERFACE_OFFLOAD_ROD,
NL_LINK_LOCAL_ADDRESS_BEHAVIOR, NL_NEIGHBOR_STATE, NL_PREFIX_ORIGIN,
NL_ROUTER_DISCOVERY_BEHAVIOR, NL_ROUTE_ORIGIN, NL_ROUTE_PROTOCOL, NL_SUFFIX_ORIGIN,
};
use shared::ntddndis::{NDIS_MEDIUM, NDIS_PHYSICAL_MEDIUM};
use shared::ntdef::{
BOOLEAN, CHAR, HANDLE, LARGE_INTEGER, PCHAR, PCSTR, PSTR, PVOID, PWCHAR, PWSTR, WCHAR,
};
use shared::ws2def::{ADDRESS_FAMILY, SCOPE_ID, ScopeLevelCount};
use shared::ws2ipdef::{PSOCKADDR_IN6_PAIR, SOCKADDR_IN6, SOCKADDR_INET};
const ANY_SIZE: usize = 1;
pub type NETIO_STATUS = DWORD;
pub type NETIOAPI_API = NETIO_STATUS;
ENUM!{enum MIB_NOTIFICATION_TYPE {
MibParameterNotification,
MibAddInstance,
MibDeleteInstance,
MibInitialNotification,
}}
pub type PMIB_NOTIFICATION_TYPE = *mut MIB_NOTIFICATION_TYPE;
STRUCT!{struct MIB_IF_ROW2_InterfaceAndOperStatusFlags {
bitfield: BYTE,
}}
BITFIELD!{MIB_IF_ROW2_InterfaceAndOperStatusFlags bitfield: BOOLEAN [
HardwareInterface set_HardwareInterface[0..1],
FilterInterface set_FilterInterface[1..2],
ConnectorPresent set_ConnectorPresent[2..3],
NotAuthenticated set_NotAuthenticated[3..4],
NotMediaConnected set_NotMediaConnected[4..5],
Paused set_Paused[5..6],
LowPower set_LowPower[6..7],
EndPointInterface set_EndPointInterface[7..8],
]}
STRUCT!{struct MIB_IF_ROW2 {
InterfaceLuid: NET_LUID,
InterfaceIndex: NET_IFINDEX,
InterfaceGuid: GUID,
Alias: [WCHAR; IF_MAX_STRING_SIZE + 1],
Description: [WCHAR; IF_MAX_STRING_SIZE + 1],
PhysicalAddressLength: ULONG,
PhysicalAddress: [UCHAR; IF_MAX_PHYS_ADDRESS_LENGTH],
PermanentPhysicalAddress: [UCHAR; IF_MAX_PHYS_ADDRESS_LENGTH],
Mtu: ULONG,
Type: IFTYPE,
TunnelType: TUNNEL_TYPE,
MediaType: NDIS_MEDIUM,
PhysicalMediumType: NDIS_PHYSICAL_MEDIUM,
AccessType: NET_IF_ACCESS_TYPE,
DirectionType: NET_IF_DIRECTION_TYPE,
InterfaceAndOperStatusFlags: MIB_IF_ROW2_InterfaceAndOperStatusFlags,
OperStatus: IF_OPER_STATUS,
AdminStatus: NET_IF_ADMIN_STATUS,
MediaConnectState: NET_IF_MEDIA_CONNECT_STATE,
NetworkGuid: NET_IF_NETWORK_GUID,
ConnectionType: NET_IF_CONNECTION_TYPE,
TransmitLinkSpeed: ULONG64,
ReceiveLinkSpeed: ULONG64,
InOctets: ULONG64,
InUcastPkts: ULONG64,
InNUcastPkts: ULONG64,
InDiscards: ULONG64,
InErrors: ULONG64,
InUnknownProtos: ULONG64,
InUcastOctets: ULONG64,
InMulticastOctets: ULONG64,
InBroadcastOctets: ULONG64,
OutOctets: ULONG64,
OutUcastPkts: ULONG64,
OutNUcastPkts: ULONG64,
OutDiscards: ULONG64,
OutErrors: ULONG64,
OutUcastOctets: ULONG64,
OutMulticastOctets: ULONG64,
OutBroadcastOctets: ULONG64,
OutQLen: ULONG64,
}}
pub type PMIB_IF_ROW2 = *mut MIB_IF_ROW2;
STRUCT!{struct MIB_IF_TABLE2 {
NumEntries: ULONG,
Table: [MIB_IF_ROW2; ANY_SIZE],
}}
pub type PMIB_IF_TABLE2 = *mut MIB_IF_TABLE2;
extern "system" {
pub fn GetIfEntry2(
Row: PMIB_IF_ROW2,
) -> NETIOAPI_API;
}
ENUM!{enum MIB_IF_ENTRY_LEVEL {
MibIfEntryNormal = 0,
MibIfEntryNormalWithoutStatistics = 2,
}}
pub type PMIB_IF_ENTRY_LEVEL = *mut MIB_IF_ENTRY_LEVEL;
extern "system" {
pub fn GetIfEntry2Ex(
Level: MIB_IF_ENTRY_LEVEL,
Row: PMIB_IF_ROW2,
) -> NETIOAPI_API;
pub fn GetIfTable2(
Table: *mut PMIB_IF_TABLE2,
) -> NETIOAPI_API;
}
ENUM!{enum MIB_IF_TABLE_LEVEL {
MibIfTableNormal = 0,
MibIfTableRaw = 1,
MibIfTableNormalWithoutStatistics = 2,
}}
pub type PMIB_IF_TABLE_LEVEL = *mut MIB_IF_TABLE_LEVEL;
extern "system" {
pub fn GetIfTable2Ex(
Level: MIB_IF_TABLE_LEVEL,
Table: *mut PMIB_IF_TABLE2,
) -> NETIOAPI_API;
}
STRUCT!{struct MIB_IPINTERFACE_ROW {
Family: ADDRESS_FAMILY,
InterfaceLuid: NET_LUID,
InterfaceIndex: NET_IFINDEX,
MaxReassemblySize: ULONG,
InterfaceIdentifier: ULONG64,
MinRouterAdvertisementInterval: ULONG,
MaxRouterAdvertisementInterval: ULONG,
AdvertisingEnabled: BOOLEAN,
ForwardingEnabled: BOOLEAN,
WeakHostSend: BOOLEAN,
WeakHostReceive: BOOLEAN,
UseAutomaticMetric: BOOLEAN,
UseNeighborUnreachabilityDetection: BOOLEAN,
ManagedAddressConfigurationSupported: BOOLEAN,
OtherStatefulConfigurationSupported: BOOLEAN,
AdvertiseDefaultRoute: BOOLEAN,
RouterDiscoveryBehavior: NL_ROUTER_DISCOVERY_BEHAVIOR,
DadTransmits: ULONG, // DupAddrDetectTransmits in RFC 2462.
BaseReachableTime: ULONG,
RetransmitTime: ULONG,
PathMtuDiscoveryTimeout: ULONG, // Path MTU discovery timeout (in ms).
LinkLocalAddressBehavior: NL_LINK_LOCAL_ADDRESS_BEHAVIOR,
LinkLocalAddressTimeout: ULONG, // In ms.
ZoneIndices: [ULONG; ScopeLevelCount as usize], // Zone part of a SCOPE_ID.
SitePrefixLength: ULONG,
Metric: ULONG,
NlMtu: ULONG,
Connected: BOOLEAN,
SupportsWakeUpPatterns: BOOLEAN,
SupportsNeighborDiscovery: BOOLEAN,
SupportsRouterDiscovery: BOOLEAN,
ReachableTime: ULONG,
TransmitOffload: NL_INTERFACE_OFFLOAD_ROD,
ReceiveOffload: NL_INTERFACE_OFFLOAD_ROD,
DisableDefaultRoutes: BOOLEAN,
}}
pub type PMIB_IPINTERFACE_ROW = *mut MIB_IPINTERFACE_ROW;
STRUCT!{struct MIB_IPINTERFACE_TABLE {
NumEntries: ULONG,
Table: [MIB_IPINTERFACE_ROW; ANY_SIZE],
}}
pub type PMIB_IPINTERFACE_TABLE = *mut MIB_IPINTERFACE_TABLE;
STRUCT!{struct MIB_IFSTACK_ROW {
HigherLayerInterfaceIndex: NET_IFINDEX,
LowerLayerInterfaceIndex: NET_IFINDEX,
}}
pub type PMIB_IFSTACK_ROW = *mut MIB_IFSTACK_ROW;
STRUCT!{struct MIB_INVERTEDIFSTACK_ROW {
LowerLayerInterfaceIndex: NET_IFINDEX,
HigherLayerInterfaceIndex: NET_IFINDEX,
}}
pub type PMIB_INVERTEDIFSTACK_ROW = *mut MIB_INVERTEDIFSTACK_ROW;
STRUCT!{struct MIB_IFSTACK_TABLE {
NumEntries: ULONG,
Table: [MIB_IFSTACK_ROW; ANY_SIZE],
}}
pub type PMIB_IFSTACK_TABLE = *mut MIB_IFSTACK_TABLE;
STRUCT!{struct MIB_INVERTEDIFSTACK_TABLE {
NumEntries: ULONG,
Table: [MIB_INVERTEDIFSTACK_ROW; ANY_SIZE],
}}
pub type PMIB_INVERTEDIFSTACK_TABLE = *mut MIB_INVERTEDIFSTACK_TABLE;
FN!{stdcall PIPINTERFACE_CHANGE_CALLBACK(
CallerContext: PVOID,
Row: PMIB_IPINTERFACE_ROW,
NotificationType: MIB_NOTIFICATION_TYPE,
) -> ()}
STRUCT!{struct MIB_IP_NETWORK_CONNECTION_BANDWIDTH_ESTIMATES {
InboundBandwidthInformation: NL_BANDWIDTH_INFORMATION,
OutboundBandwidthInformation: NL_BANDWIDTH_INFORMATION,
}}
pub type PMIB_IP_NETWORK_CONNECTION_BANDWIDTH_ESTIMATES = *mut
MIB_IP_NETWORK_CONNECTION_BANDWIDTH_ESTIMATES;
extern "system" {
pub fn GetIfStackTable(
Table: *mut PMIB_IFSTACK_TABLE,
) -> NETIOAPI_API;
pub fn GetInvertedIfStackTable(
Table: *mut PMIB_INVERTEDIFSTACK_TABLE,
) -> NETIOAPI_API;
pub fn GetIpInterfaceEntry(
Row: PMIB_IPINTERFACE_ROW,
) -> NETIOAPI_API;
pub fn GetIpInterfaceTable(
Family: ADDRESS_FAMILY,
Table: *mut PMIB_IPINTERFACE_TABLE,
) -> NETIOAPI_API;
pub fn InitializeIpInterfaceEntry(
Row: PMIB_IPINTERFACE_ROW,
);
pub fn NotifyIpInterfaceChange(
Family: ADDRESS_FAMILY,
Callback: PIPINTERFACE_CHANGE_CALLBACK,
CallerContext: PVOID,
InitialNotification: BOOLEAN,
NotificationHandle: *mut HANDLE
) -> NETIOAPI_API;
pub fn SetIpInterfaceEntry(
Row: PMIB_IPINTERFACE_ROW,
) -> NETIOAPI_API;
pub fn GetIpNetworkConnectionBandwidthEstimates(
InterfaceIndex: NET_IFINDEX,
AddressFamily: ADDRESS_FAMILY,
BandwidthEstimates: PMIB_IP_NETWORK_CONNECTION_BANDWIDTH_ESTIMATES,
) -> NETIOAPI_API;
}
STRUCT!{struct MIB_UNICASTIPADDRESS_ROW {
Address: SOCKADDR_INET,
InterfaceLuid: NET_LUID,
InterfaceIndex: NET_IFINDEX,
PrefixOrigin: NL_PREFIX_ORIGIN,
SuffixOrigin: NL_SUFFIX_ORIGIN,
ValidLifetime: ULONG,
PreferredLifetime: ULONG,
OnLinkPrefixLength: UINT8,
SkipAsSource: BOOLEAN,
DadState: NL_DAD_STATE,
ScopeId: SCOPE_ID,
CreationTimeStamp: LARGE_INTEGER,
}}
pub type PMIB_UNICASTIPADDRESS_ROW = *mut MIB_UNICASTIPADDRESS_ROW;
STRUCT!{struct MIB_UNICASTIPADDRESS_TABLE {
NumEntries: ULONG,
Table: [MIB_UNICASTIPADDRESS_ROW; ANY_SIZE],
}}
pub type PMIB_UNICASTIPADDRESS_TABLE = *mut MIB_UNICASTIPADDRESS_TABLE;
FN!{stdcall PUNICAST_IPADDRESS_CHANGE_CALLBACK(
CallerContext: PVOID,
Row: PMIB_UNICASTIPADDRESS_ROW,
NotificationType: MIB_NOTIFICATION_TYPE,
) -> ()}
extern "system" {
pub fn CreateUnicastIpAddressEntry(
Row: *const MIB_UNICASTIPADDRESS_ROW,
) -> NETIOAPI_API;
pub fn DeleteUnicastIpAddressEntry(
Row: *const MIB_UNICASTIPADDRESS_ROW,
) -> NETIOAPI_API;
pub fn GetUnicastIpAddressEntry(
Row: PMIB_UNICASTIPADDRESS_ROW
) -> NETIOAPI_API;
pub fn GetUnicastIpAddressTable(
Family: ADDRESS_FAMILY,
Table: *mut PMIB_UNICASTIPADDRESS_TABLE,
) -> NETIOAPI_API;
pub fn InitializeUnicastIpAddressEntry(
Row: PMIB_UNICASTIPADDRESS_ROW,
);
pub fn NotifyUnicastIpAddressChange(
Family: ADDRESS_FAMILY,
Callback: PUNICAST_IPADDRESS_CHANGE_CALLBACK,
CallerContext: PVOID,
InitialNotification: BOOLEAN,
NotificationHandle: *mut HANDLE,
) -> NETIOAPI_API;
}
FN!{stdcall PSTABLE_UNICAST_IPADDRESS_TABLE_CALLBACK(
CallerContext: PVOID,
AddressTable: PMIB_UNICASTIPADDRESS_TABLE,
) -> ()}
extern "system" {
pub fn NotifyStableUnicastIpAddressTable(
Family: ADDRESS_FAMILY,
Table: *mut PMIB_UNICASTIPADDRESS_TABLE,
CallerCallback: PSTABLE_UNICAST_IPADDRESS_TABLE_CALLBACK,
CallerContext: PVOID,
NotificationHandle: *mut HANDLE,
) -> NETIOAPI_API;
pub fn SetUnicastIpAddressEntry(
Row: *const MIB_UNICASTIPADDRESS_ROW,
) -> NETIOAPI_API;
}
STRUCT!{struct MIB_ANYCASTIPADDRESS_ROW {
Address: SOCKADDR_INET,
InterfaceLuid: NET_LUID,
InterfaceIndex: NET_IFINDEX,
ScopeId: SCOPE_ID,
}}
pub type PMIB_ANYCASTIPADDRESS_ROW = *mut MIB_ANYCASTIPADDRESS_ROW;
STRUCT!{struct MIB_ANYCASTIPADDRESS_TABLE {
NumEntries: ULONG,
Table: [MIB_ANYCASTIPADDRESS_ROW; ANY_SIZE],
}}
pub type PMIB_ANYCASTIPADDRESS_TABLE = *mut MIB_ANYCASTIPADDRESS_TABLE;
extern "system" {
pub fn CreateAnycastIpAddressEntry(
Row: *const MIB_ANYCASTIPADDRESS_ROW,
) -> NETIOAPI_API;
pub fn DeleteAnycastIpAddressEntry(
Row: *const MIB_ANYCASTIPADDRESS_ROW,
) -> NETIOAPI_API;
pub fn GetAnycastIpAddressEntry(
Row: PMIB_ANYCASTIPADDRESS_ROW,
) -> NETIOAPI_API;
pub fn GetAnycastIpAddressTable(
Family: ADDRESS_FAMILY,
Table: *mut PMIB_ANYCASTIPADDRESS_TABLE,
) -> NETIOAPI_API;
}
STRUCT!{struct MIB_MULTICASTIPADDRESS_ROW {
Address: SOCKADDR_INET,
InterfaceIndex: NET_IFINDEX,
InterfaceLuid: NET_LUID,
ScopeId: SCOPE_ID,
}}
pub type PMIB_MULTICASTIPADDRESS_ROW = *mut MIB_MULTICASTIPADDRESS_ROW;
STRUCT!{struct MIB_MULTICASTIPADDRESS_TABLE {
NumEntries: ULONG,
Table: [MIB_MULTICASTIPADDRESS_ROW; ANY_SIZE],
}}
pub type PMIB_MULTICASTIPADDRESS_TABLE = *mut MIB_MULTICASTIPADDRESS_TABLE;
extern "system" {
pub fn GetMulticastIpAddressEntry(
Row: PMIB_MULTICASTIPADDRESS_ROW,
) -> NETIOAPI_API;
pub fn GetMulticastIpAddressTable(
Family: ADDRESS_FAMILY,
Table: *mut PMIB_MULTICASTIPADDRESS_TABLE,
) -> NETIOAPI_API;
}
STRUCT!{struct IP_ADDRESS_PREFIX {
Prefix: SOCKADDR_INET,
PrefixLength: UINT8,
}}
pub type PIP_ADDRESS_PREFIX = *mut IP_ADDRESS_PREFIX;
STRUCT!{struct MIB_IPFORWARD_ROW2 {
InterfaceLuid: NET_LUID,
InterfaceIndex: NET_IFINDEX,
DestinationPrefix: IP_ADDRESS_PREFIX,
NextHop: SOCKADDR_INET,
SitePrefixLength: UCHAR,
ValidLifetime: ULONG,
PreferredLifetime: ULONG,
Metric: ULONG,
Protocol: NL_ROUTE_PROTOCOL,
Loopback: BOOLEAN,
AutoconfigureAddress: BOOLEAN,
Publish: BOOLEAN,
Immortal: BOOLEAN,
Age: ULONG,
Origin: NL_ROUTE_ORIGIN,
}}
pub type PMIB_IPFORWARD_ROW2 = *mut MIB_IPFORWARD_ROW2;
STRUCT!{struct MIB_IPFORWARD_TABLE2 {
NumEntries: ULONG,
Table: [MIB_IPFORWARD_ROW2; ANY_SIZE],
}}
pub type PMIB_IPFORWARD_TABLE2 = *mut MIB_IPFORWARD_TABLE2;
FN!{stdcall PIPFORWARD_CHANGE_CALLBACK(
CallerContext: PVOID,
Row: PMIB_IPFORWARD_ROW2,
NotificationType: MIB_NOTIFICATION_TYPE,
) -> ()}
extern "system" {
pub fn CreateIpForwardEntry2(
Row: *const MIB_IPFORWARD_ROW2,
) -> NETIOAPI_API;
pub fn DeleteIpForwardEntry2(
Row: *const MIB_IPFORWARD_ROW2,
) -> NETIOAPI_API;
pub fn GetBestRoute2(
InterfaceLuid: *mut NET_LUID,
InterfaceIndex: NET_IFINDEX,
SourceAddress: *const SOCKADDR_INET,
DestinationAddress: *const SOCKADDR_INET,
AddressSortOptions: ULONG,
BestRoute: PMIB_IPFORWARD_ROW2,
BestSourceAddress: *mut SOCKADDR_INET,
) -> NETIOAPI_API;
pub fn GetIpForwardEntry2(
Row: PMIB_IPFORWARD_ROW2,
) -> NETIOAPI_API;
pub fn GetIpForwardTable2(
Family: ADDRESS_FAMILY,
Table: *mut PMIB_IPFORWARD_TABLE2,
) -> NETIOAPI_API;
pub fn InitializeIpForwardEntry(
Row: PMIB_IPFORWARD_ROW2,
);
pub fn NotifyRouteChange2(
AddressFamily: ADDRESS_FAMILY,
Callback: PIPFORWARD_CHANGE_CALLBACK,
CallerContext: PVOID,
InitialNotification: BOOLEAN,
NotificationHandle: *mut HANDLE,
) -> NETIOAPI_API;
pub fn SetIpForwardEntry2(
Route: *const MIB_IPFORWARD_ROW2,
) -> NETIOAPI_API;
}
UNION!{union MIB_IPPATH_ROW_u {
[u32; 1],
LastReachable LastReachable_mut: ULONG, // Milliseconds.
LastUnreachable LastUnreachable_mut: ULONG, // Milliseconds.
}}
STRUCT!{struct MIB_IPPATH_ROW {
Source: SOCKADDR_INET,
Destination: SOCKADDR_INET,
InterfaceLuid: NET_LUID,
InterfaceIndex: NET_IFINDEX,
CurrentNextHop: SOCKADDR_INET,
PathMtu: ULONG,
RttMean: ULONG,
RttDeviation: ULONG,
u: MIB_IPPATH_ROW_u,
IsReachable: BOOLEAN,
LinkTransmitSpeed: ULONG64,
LinkReceiveSpeed: ULONG64,
}}
pub type PMIB_IPPATH_ROW = *mut MIB_IPPATH_ROW;
STRUCT!{struct MIB_IPPATH_TABLE {
NumEntries: ULONG,
Table: [MIB_IPPATH_ROW; ANY_SIZE],
}}
pub type PMIB_IPPATH_TABLE = *mut MIB_IPPATH_TABLE;
extern "system" {
pub fn FlushIpPathTable(
Family: ADDRESS_FAMILY,
) -> NETIOAPI_API;
pub fn GetIpPathEntry(
Row: PMIB_IPPATH_ROW,
) -> NETIOAPI_API;
pub fn GetIpPathTable(
Family: ADDRESS_FAMILY,
Table: *mut PMIB_IPPATH_TABLE,
) -> NETIOAPI_API;
}
STRUCT!{struct MIB_IPNET_ROW2_s {
Flags: UCHAR,
}}
BITFIELD!{MIB_IPNET_ROW2_s Flags: UCHAR [
IsRouter set_IsRouter[0..1],
IsUnreachable set_IsUnreachable[1..2],
Reserved set_Reserved[2..8],
]}
UNION!{union MIB_IPNET_ROW2_ReachabilityTime {
[u32; 1],
LastReachable LastReachable_mut: ULONG,
LastUnreachable LastUnreachable_mut: ULONG,
}}
STRUCT!{struct MIB_IPNET_ROW2 {
Address: SOCKADDR_INET,
InterfaceIndex: NET_IFINDEX,
InterfaceLuid: NET_LUID,
PhysicalAddress: [UCHAR; IF_MAX_PHYS_ADDRESS_LENGTH],
PhysicalAddressLength: ULONG,
State: NL_NEIGHBOR_STATE,
s: MIB_IPNET_ROW2_s,
ReachabilityTime: MIB_IPNET_ROW2_ReachabilityTime,
}}
pub type PMIB_IPNET_ROW2 = *mut MIB_IPNET_ROW2;
STRUCT!{struct MIB_IPNET_TABLE2 {
NumEntries: ULONG,
Table: [MIB_IPNET_ROW2; ANY_SIZE],
}}
pub type PMIB_IPNET_TABLE2 = *mut MIB_IPNET_TABLE2;
extern "system" {
pub fn CreateIpNetEntry2(
Row: *const MIB_IPNET_ROW2,
) -> NETIOAPI_API;
pub fn DeleteIpNetEntry2(
Row: *const MIB_IPNET_ROW2,
) -> NETIOAPI_API;
pub fn FlushIpNetTable2(
Family: ADDRESS_FAMILY,
InterfaceIndex: NET_IFINDEX,
) -> NETIOAPI_API;
pub fn GetIpNetEntry2(
Row: PMIB_IPNET_ROW2,
) -> NETIOAPI_API;
pub fn GetIpNetTable2(
Family: ADDRESS_FAMILY,
Table: *mut PMIB_IPNET_TABLE2,
) -> NETIOAPI_API;
pub fn ResolveIpNetEntry2(
Row: PMIB_IPNET_ROW2,
SourceAddress: *const SOCKADDR_INET,
) -> NETIOAPI_API;
pub fn SetIpNetEntry2(
Row: PMIB_IPNET_ROW2,
) -> NETIOAPI_API;
}
pub const MIB_INVALID_TEREDO_PORT_NUMBER: USHORT = 0;
FN!{stdcall PTEREDO_PORT_CHANGE_CALLBACK(
CallerContext: PVOID,
Port: USHORT,
NotificationType: MIB_NOTIFICATION_TYPE,
) -> ()}
extern "system" {
pub fn NotifyTeredoPortChange(
Callback: PTEREDO_PORT_CHANGE_CALLBACK,
CallerContext: PVOID,
InitialNotification: BOOLEAN,
NotificationHandle: *mut HANDLE,
) -> NETIOAPI_API;
pub fn GetTeredoPort(
Port: *mut USHORT,
) -> NETIOAPI_API;
pub fn CancelMibChangeNotify2(
NotificationHandle: HANDLE,
) -> NETIOAPI_API;
pub fn FreeMibTable(
Memory: PVOID,
);
pub fn CreateSortedAddressPairs(
SourceAddressList: *const SOCKADDR_IN6,
SourceAddressCount: ULONG,
DestinationAddressList: *const SOCKADDR_IN6,
DestinationAddressCount: ULONG,
AddressSortOptions: ULONG,
SortedAddressPairList: *mut PSOCKADDR_IN6_PAIR,
SortedAddressPairCount: *mut ULONG,
) -> NETIOAPI_API;
pub fn ConvertCompartmentGuidToId(
CompartmentGuid: *const GUID,
CompartmentId: PNET_IF_COMPARTMENT_ID,
) -> NETIOAPI_API;
pub fn ConvertCompartmentIdToGuid(
CompartmentId: NET_IF_COMPARTMENT_ID,
CompartmentGuid: *mut GUID,
) -> NETIOAPI_API;
pub fn ConvertInterfaceNameToLuidA(
InterfaceName: *const CHAR,
InterfaceLuid: *mut NET_LUID,
) -> NETIOAPI_API;
pub fn ConvertInterfaceNameToLuidW(
InterfaceName: *const WCHAR,
InterfaceLuid: *mut NET_LUID,
) -> NETIOAPI_API;
pub fn ConvertInterfaceLuidToNameA(
InterfaceLuid: *const NET_LUID,
InterfaceName: PSTR,
Length: SIZE_T,
) -> NETIOAPI_API;
pub fn ConvertInterfaceLuidToNameW(
InterfaceLuid: *const NET_LUID,
InterfaceName: PWSTR,
Length: SIZE_T,
) -> NETIOAPI_API;
pub fn ConvertInterfaceLuidToIndex(
InterfaceLuid: *const NET_LUID,
InterfaceIndex: PNET_IFINDEX,
) -> NETIOAPI_API;
pub fn ConvertInterfaceIndexToLuid(
InterfaceIndex: NET_IFINDEX,
InterfaceLuid: PNET_LUID,
) -> NETIOAPI_API;
pub fn ConvertInterfaceLuidToAlias(
InterfaceLuid: *const NET_LUID,
InterfaceAlias: PWSTR,
Length: SIZE_T,
) -> NETIOAPI_API;
pub fn ConvertInterfaceAliasToLuid(
InterfaceAlias: *const WCHAR,
InterfaceLuid: PNET_LUID,
) -> NETIOAPI_API;
pub fn ConvertInterfaceLuidToGuid(
InterfaceLuid: *const NET_LUID,
InterfaceGuid: *mut GUID,
) -> NETIOAPI_API;
pub fn ConvertInterfaceGuidToLuid(
InterfaceGuid: *const GUID,
InterfaceLuid: PNET_LUID,
) -> NETIOAPI_API;
pub fn if_nametoindex(
InterfaceName: PCSTR,
) -> NET_IFINDEX;
pub fn if_indextoname(
InterfaceIndex: NET_IFINDEX,
InterfaceName: PCHAR,
) -> PCHAR;
pub fn GetCurrentThreadCompartmentId() -> NET_IF_COMPARTMENT_ID;
pub fn SetCurrentThreadCompartmentId(
CompartmentId: NET_IF_COMPARTMENT_ID
) -> NETIOAPI_API;
pub fn GetCurrentThreadCompartmentScope(
CompartmentScope: PNET_IF_COMPARTMENT_SCOPE,
CompartmentId: PNET_IF_COMPARTMENT_ID,
);
pub fn SetCurrentThreadCompartmentScope(
CompartmentScope: NET_IF_COMPARTMENT_SCOPE,
) -> NETIOAPI_API;
pub fn GetJobCompartmentId(
JobHandle: HANDLE,
) -> NET_IF_COMPARTMENT_ID;
pub fn SetJobCompartmentId(
JobHandle: HANDLE,
CompartmentId: NET_IF_COMPARTMENT_ID,
) -> NETIOAPI_API;
pub fn GetSessionCompartmentId(
SessionId: ULONG,
) -> NET_IF_COMPARTMENT_ID;
pub fn SetSessionCompartmentId(
SessionId: ULONG,
CompartmentId: NET_IF_COMPARTMENT_ID,
) -> NETIOAPI_API;
pub fn GetDefaultCompartmentId() -> NET_IF_COMPARTMENT_ID;
pub fn GetNetworkInformation(
NetworkGuid: *const NET_IF_NETWORK_GUID,
CompartmentId: PNET_IF_COMPARTMENT_ID,
SiteId: PULONG,
NetworkName: PWCHAR,
Length: ULONG,
) -> NETIOAPI_API;
pub fn SetNetworkInformation(
NetworkGuid: *const NET_IF_NETWORK_GUID,
CompartmentId: NET_IF_COMPARTMENT_ID,
NetworkName: *const WCHAR,
) -> NETIOAPI_API;
pub fn ConvertLengthToIpv4Mask(
MaskLength: ULONG,
Mask: PULONG,
) -> NETIOAPI_API;
pub fn ConvertIpv4MaskToLength(
Mask: ULONG,
MaskLength: PUINT8,
) -> NETIOAPI_API;
}
pub const DNS_SETTINGS_VERSION1: ULONG = 0x0001;
pub const DNS_INTERFACE_SETTINGS_VERSION1: ULONG = 0x0001;
pub const DNS_SETTING_IPV6: ULONG64 = 0x0001;
pub const DNS_SETTING_NAMESERVER: ULONG64 = 0x0002;
pub const DNS_SETTING_SEARCHLIST: ULONG64 = 0x0004;
pub const DNS_SETTING_REGISTRATION_ENABLED: ULONG64 = 0x0008;
pub const DNS_SETTING_REGISTER_ADAPTER_NAME: ULONG64 = 0x0010;
pub const DNS_SETTING_DOMAIN: ULONG64 = 0x0020;
pub const DNS_SETTING_HOSTNAME: ULONG64 = 0x0040;
pub const DNS_SETTINGS_ENABLE_LLMNR: ULONG64 = 0x0080;
pub const DNS_SETTINGS_QUERY_ADAPTER_NAME: ULONG64 = 0x0100;
pub const DNS_SETTING_PROFILE_NAMESERVER: ULONG64 = 0x0200;
STRUCT!{struct DNS_SETTINGS {
Version: ULONG,
Flags: ULONG64,
Hostname: PWSTR,
Domain: PWSTR,
SearchList: PWSTR,
}}
STRUCT!{struct DNS_INTERFACE_SETTINGS {
Version: ULONG,
Flags: ULONG64,
Domain: PWSTR,
NameServer: PWSTR,
SearchList: PWSTR,
RegistrationEnabled: ULONG,
RegisterAdapterName: ULONG,
EnableLLMNR: ULONG,
QueryAdapterName: ULONG,
ProfileNameServer: PWSTR,
}}
extern "system" {
pub fn GetDnsSettings(
Settings: *mut DNS_SETTINGS,
) -> NETIOAPI_API;
pub fn FreeDnsSettings(
Settings: *mut DNS_SETTINGS,
);
pub fn SetDnsSettings(
Settings: *const DNS_SETTINGS,
) -> NETIOAPI_API;
pub fn GetInterfaceDnsSettings(
Interface: GUID,
Settings: *mut DNS_INTERFACE_SETTINGS,
) -> NETIOAPI_API;
pub fn FreeInterfaceDnsSettings(
Settings: *mut DNS_INTERFACE_SETTINGS,
);
pub fn SetInterfaceDnsSettings(
Interface: GUID,
Settings: *const DNS_INTERFACE_SETTINGS,
) -> NETIOAPI_API;
}