| // 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; |
| } |