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 use shared::basetsd::{PUINT8, SIZE_T, UINT8, ULONG64}; 7 use shared::guiddef::GUID; 8 use shared::ifdef::{ 9 IF_MAX_PHYS_ADDRESS_LENGTH, IF_MAX_STRING_SIZE, IF_OPER_STATUS, NET_IFINDEX, 10 NET_IF_ACCESS_TYPE, NET_IF_ADMIN_STATUS, NET_IF_COMPARTMENT_ID, NET_IF_COMPARTMENT_SCOPE, 11 NET_IF_CONNECTION_TYPE, NET_IF_DIRECTION_TYPE, NET_IF_MEDIA_CONNECT_STATE, NET_IF_NETWORK_GUID, 12 NET_LUID, PNET_IFINDEX, PNET_IF_COMPARTMENT_ID, PNET_IF_COMPARTMENT_SCOPE, PNET_LUID, 13 TUNNEL_TYPE, 14 }; 15 use shared::ipifcons::IFTYPE; 16 use shared::minwindef::{BYTE, DWORD, PULONG, UCHAR, ULONG, USHORT}; 17 use shared::nldef::{ 18 NL_BANDWIDTH_INFORMATION, NL_DAD_STATE, NL_INTERFACE_OFFLOAD_ROD, 19 NL_LINK_LOCAL_ADDRESS_BEHAVIOR, NL_NEIGHBOR_STATE, NL_PREFIX_ORIGIN, 20 NL_ROUTER_DISCOVERY_BEHAVIOR, NL_ROUTE_ORIGIN, NL_ROUTE_PROTOCOL, NL_SUFFIX_ORIGIN, 21 }; 22 use shared::ntddndis::{NDIS_MEDIUM, NDIS_PHYSICAL_MEDIUM}; 23 use shared::ntdef::{ 24 BOOLEAN, CHAR, HANDLE, LARGE_INTEGER, PCHAR, PCSTR, PSTR, PVOID, PWCHAR, PWSTR, WCHAR, 25 }; 26 use shared::ws2def::{ADDRESS_FAMILY, SCOPE_ID, ScopeLevelCount}; 27 use shared::ws2ipdef::{PSOCKADDR_IN6_PAIR, SOCKADDR_IN6, SOCKADDR_INET}; 28 const ANY_SIZE: usize = 1; 29 pub type NETIO_STATUS = DWORD; 30 pub type NETIOAPI_API = NETIO_STATUS; 31 ENUM!{enum MIB_NOTIFICATION_TYPE { 32 MibParameterNotification, 33 MibAddInstance, 34 MibDeleteInstance, 35 MibInitialNotification, 36 }} 37 pub type PMIB_NOTIFICATION_TYPE = *mut MIB_NOTIFICATION_TYPE; 38 STRUCT!{struct MIB_IF_ROW2_InterfaceAndOperStatusFlags { 39 bitfield: BYTE, 40 }} 41 BITFIELD!{MIB_IF_ROW2_InterfaceAndOperStatusFlags bitfield: BOOLEAN [ 42 HardwareInterface set_HardwareInterface[0..1], 43 FilterInterface set_FilterInterface[1..2], 44 ConnectorPresent set_ConnectorPresent[2..3], 45 NotAuthenticated set_NotAuthenticated[3..4], 46 NotMediaConnected set_NotMediaConnected[4..5], 47 Paused set_Paused[5..6], 48 LowPower set_LowPower[6..7], 49 EndPointInterface set_EndPointInterface[7..8], 50 ]} 51 STRUCT!{struct MIB_IF_ROW2 { 52 InterfaceLuid: NET_LUID, 53 InterfaceIndex: NET_IFINDEX, 54 InterfaceGuid: GUID, 55 Alias: [WCHAR; IF_MAX_STRING_SIZE + 1], 56 Description: [WCHAR; IF_MAX_STRING_SIZE + 1], 57 PhysicalAddressLength: ULONG, 58 PhysicalAddress: [UCHAR; IF_MAX_PHYS_ADDRESS_LENGTH], 59 PermanentPhysicalAddress: [UCHAR; IF_MAX_PHYS_ADDRESS_LENGTH], 60 Mtu: ULONG, 61 Type: IFTYPE, 62 TunnelType: TUNNEL_TYPE, 63 MediaType: NDIS_MEDIUM, 64 PhysicalMediumType: NDIS_PHYSICAL_MEDIUM, 65 AccessType: NET_IF_ACCESS_TYPE, 66 DirectionType: NET_IF_DIRECTION_TYPE, 67 InterfaceAndOperStatusFlags: MIB_IF_ROW2_InterfaceAndOperStatusFlags, 68 OperStatus: IF_OPER_STATUS, 69 AdminStatus: NET_IF_ADMIN_STATUS, 70 MediaConnectState: NET_IF_MEDIA_CONNECT_STATE, 71 NetworkGuid: NET_IF_NETWORK_GUID, 72 ConnectionType: NET_IF_CONNECTION_TYPE, 73 TransmitLinkSpeed: ULONG64, 74 ReceiveLinkSpeed: ULONG64, 75 InOctets: ULONG64, 76 InUcastPkts: ULONG64, 77 InNUcastPkts: ULONG64, 78 InDiscards: ULONG64, 79 InErrors: ULONG64, 80 InUnknownProtos: ULONG64, 81 InUcastOctets: ULONG64, 82 InMulticastOctets: ULONG64, 83 InBroadcastOctets: ULONG64, 84 OutOctets: ULONG64, 85 OutUcastPkts: ULONG64, 86 OutNUcastPkts: ULONG64, 87 OutDiscards: ULONG64, 88 OutErrors: ULONG64, 89 OutUcastOctets: ULONG64, 90 OutMulticastOctets: ULONG64, 91 OutBroadcastOctets: ULONG64, 92 OutQLen: ULONG64, 93 }} 94 pub type PMIB_IF_ROW2 = *mut MIB_IF_ROW2; 95 STRUCT!{struct MIB_IF_TABLE2 { 96 NumEntries: ULONG, 97 Table: [MIB_IF_ROW2; ANY_SIZE], 98 }} 99 pub type PMIB_IF_TABLE2 = *mut MIB_IF_TABLE2; 100 extern "system" { GetIfEntry2( Row: PMIB_IF_ROW2, ) -> NETIOAPI_API101 pub fn GetIfEntry2( 102 Row: PMIB_IF_ROW2, 103 ) -> NETIOAPI_API; 104 } 105 ENUM!{enum MIB_IF_ENTRY_LEVEL { 106 MibIfEntryNormal = 0, 107 MibIfEntryNormalWithoutStatistics = 2, 108 }} 109 pub type PMIB_IF_ENTRY_LEVEL = *mut MIB_IF_ENTRY_LEVEL; 110 extern "system" { GetIfEntry2Ex( Level: MIB_IF_ENTRY_LEVEL, Row: PMIB_IF_ROW2, ) -> NETIOAPI_API111 pub fn GetIfEntry2Ex( 112 Level: MIB_IF_ENTRY_LEVEL, 113 Row: PMIB_IF_ROW2, 114 ) -> NETIOAPI_API; GetIfTable2( Table: *mut PMIB_IF_TABLE2, ) -> NETIOAPI_API115 pub fn GetIfTable2( 116 Table: *mut PMIB_IF_TABLE2, 117 ) -> NETIOAPI_API; 118 } 119 ENUM!{enum MIB_IF_TABLE_LEVEL { 120 MibIfTableNormal = 0, 121 MibIfTableRaw = 1, 122 MibIfTableNormalWithoutStatistics = 2, 123 }} 124 pub type PMIB_IF_TABLE_LEVEL = *mut MIB_IF_TABLE_LEVEL; 125 extern "system" { GetIfTable2Ex( Level: MIB_IF_TABLE_LEVEL, Table: *mut PMIB_IF_TABLE2, ) -> NETIOAPI_API126 pub fn GetIfTable2Ex( 127 Level: MIB_IF_TABLE_LEVEL, 128 Table: *mut PMIB_IF_TABLE2, 129 ) -> NETIOAPI_API; 130 } 131 STRUCT!{struct MIB_IPINTERFACE_ROW { 132 Family: ADDRESS_FAMILY, 133 InterfaceLuid: NET_LUID, 134 InterfaceIndex: NET_IFINDEX, 135 MaxReassemblySize: ULONG, 136 InterfaceIdentifier: ULONG64, 137 MinRouterAdvertisementInterval: ULONG, 138 MaxRouterAdvertisementInterval: ULONG, 139 AdvertisingEnabled: BOOLEAN, 140 ForwardingEnabled: BOOLEAN, 141 WeakHostSend: BOOLEAN, 142 WeakHostReceive: BOOLEAN, 143 UseAutomaticMetric: BOOLEAN, 144 UseNeighborUnreachabilityDetection: BOOLEAN, 145 ManagedAddressConfigurationSupported: BOOLEAN, 146 OtherStatefulConfigurationSupported: BOOLEAN, 147 AdvertiseDefaultRoute: BOOLEAN, 148 RouterDiscoveryBehavior: NL_ROUTER_DISCOVERY_BEHAVIOR, 149 DadTransmits: ULONG, // DupAddrDetectTransmits in RFC 2462. 150 BaseReachableTime: ULONG, 151 RetransmitTime: ULONG, 152 PathMtuDiscoveryTimeout: ULONG, // Path MTU discovery timeout (in ms). 153 LinkLocalAddressBehavior: NL_LINK_LOCAL_ADDRESS_BEHAVIOR, 154 LinkLocalAddressTimeout: ULONG, // In ms. 155 ZoneIndices: [ULONG; ScopeLevelCount as usize], // Zone part of a SCOPE_ID. 156 SitePrefixLength: ULONG, 157 Metric: ULONG, 158 NlMtu: ULONG, 159 Connected: BOOLEAN, 160 SupportsWakeUpPatterns: BOOLEAN, 161 SupportsNeighborDiscovery: BOOLEAN, 162 SupportsRouterDiscovery: BOOLEAN, 163 ReachableTime: ULONG, 164 TransmitOffload: NL_INTERFACE_OFFLOAD_ROD, 165 ReceiveOffload: NL_INTERFACE_OFFLOAD_ROD, 166 DisableDefaultRoutes: BOOLEAN, 167 }} 168 pub type PMIB_IPINTERFACE_ROW = *mut MIB_IPINTERFACE_ROW; 169 STRUCT!{struct MIB_IPINTERFACE_TABLE { 170 NumEntries: ULONG, 171 Table: [MIB_IPINTERFACE_ROW; ANY_SIZE], 172 }} 173 pub type PMIB_IPINTERFACE_TABLE = *mut MIB_IPINTERFACE_TABLE; 174 STRUCT!{struct MIB_IFSTACK_ROW { 175 HigherLayerInterfaceIndex: NET_IFINDEX, 176 LowerLayerInterfaceIndex: NET_IFINDEX, 177 }} 178 pub type PMIB_IFSTACK_ROW = *mut MIB_IFSTACK_ROW; 179 STRUCT!{struct MIB_INVERTEDIFSTACK_ROW { 180 LowerLayerInterfaceIndex: NET_IFINDEX, 181 HigherLayerInterfaceIndex: NET_IFINDEX, 182 }} 183 pub type PMIB_INVERTEDIFSTACK_ROW = *mut MIB_INVERTEDIFSTACK_ROW; 184 STRUCT!{struct MIB_IFSTACK_TABLE { 185 NumEntries: ULONG, 186 Table: [MIB_IFSTACK_ROW; ANY_SIZE], 187 }} 188 pub type PMIB_IFSTACK_TABLE = *mut MIB_IFSTACK_TABLE; 189 STRUCT!{struct MIB_INVERTEDIFSTACK_TABLE { 190 NumEntries: ULONG, 191 Table: [MIB_INVERTEDIFSTACK_ROW; ANY_SIZE], 192 }} 193 pub type PMIB_INVERTEDIFSTACK_TABLE = *mut MIB_INVERTEDIFSTACK_TABLE; 194 FN!{stdcall PIPINTERFACE_CHANGE_CALLBACK( 195 CallerContext: PVOID, 196 Row: PMIB_IPINTERFACE_ROW, 197 NotificationType: MIB_NOTIFICATION_TYPE, 198 ) -> ()} 199 STRUCT!{struct MIB_IP_NETWORK_CONNECTION_BANDWIDTH_ESTIMATES { 200 InboundBandwidthInformation: NL_BANDWIDTH_INFORMATION, 201 OutboundBandwidthInformation: NL_BANDWIDTH_INFORMATION, 202 }} 203 pub type PMIB_IP_NETWORK_CONNECTION_BANDWIDTH_ESTIMATES = *mut 204 MIB_IP_NETWORK_CONNECTION_BANDWIDTH_ESTIMATES; 205 extern "system" { GetIfStackTable( Table: *mut PMIB_IFSTACK_TABLE, ) -> NETIOAPI_API206 pub fn GetIfStackTable( 207 Table: *mut PMIB_IFSTACK_TABLE, 208 ) -> NETIOAPI_API; GetInvertedIfStackTable( Table: *mut PMIB_INVERTEDIFSTACK_TABLE, ) -> NETIOAPI_API209 pub fn GetInvertedIfStackTable( 210 Table: *mut PMIB_INVERTEDIFSTACK_TABLE, 211 ) -> NETIOAPI_API; GetIpInterfaceEntry( Row: PMIB_IPINTERFACE_ROW, ) -> NETIOAPI_API212 pub fn GetIpInterfaceEntry( 213 Row: PMIB_IPINTERFACE_ROW, 214 ) -> NETIOAPI_API; GetIpInterfaceTable( Family: ADDRESS_FAMILY, Table: *mut PMIB_IPINTERFACE_TABLE, ) -> NETIOAPI_API215 pub fn GetIpInterfaceTable( 216 Family: ADDRESS_FAMILY, 217 Table: *mut PMIB_IPINTERFACE_TABLE, 218 ) -> NETIOAPI_API; InitializeIpInterfaceEntry( Row: PMIB_IPINTERFACE_ROW, )219 pub fn InitializeIpInterfaceEntry( 220 Row: PMIB_IPINTERFACE_ROW, 221 ); NotifyIpInterfaceChange( Family: ADDRESS_FAMILY, Callback: PIPINTERFACE_CHANGE_CALLBACK, CallerContext: PVOID, InitialNotification: BOOLEAN, NotificationHandle: *mut HANDLE ) -> NETIOAPI_API222 pub fn NotifyIpInterfaceChange( 223 Family: ADDRESS_FAMILY, 224 Callback: PIPINTERFACE_CHANGE_CALLBACK, 225 CallerContext: PVOID, 226 InitialNotification: BOOLEAN, 227 NotificationHandle: *mut HANDLE 228 ) -> NETIOAPI_API; SetIpInterfaceEntry( Row: PMIB_IPINTERFACE_ROW, ) -> NETIOAPI_API229 pub fn SetIpInterfaceEntry( 230 Row: PMIB_IPINTERFACE_ROW, 231 ) -> NETIOAPI_API; GetIpNetworkConnectionBandwidthEstimates( InterfaceIndex: NET_IFINDEX, AddressFamily: ADDRESS_FAMILY, BandwidthEstimates: PMIB_IP_NETWORK_CONNECTION_BANDWIDTH_ESTIMATES, ) -> NETIOAPI_API232 pub fn GetIpNetworkConnectionBandwidthEstimates( 233 InterfaceIndex: NET_IFINDEX, 234 AddressFamily: ADDRESS_FAMILY, 235 BandwidthEstimates: PMIB_IP_NETWORK_CONNECTION_BANDWIDTH_ESTIMATES, 236 ) -> NETIOAPI_API; 237 } 238 STRUCT!{struct MIB_UNICASTIPADDRESS_ROW { 239 Address: SOCKADDR_INET, 240 InterfaceLuid: NET_LUID, 241 InterfaceIndex: NET_IFINDEX, 242 PrefixOrigin: NL_PREFIX_ORIGIN, 243 SuffixOrigin: NL_SUFFIX_ORIGIN, 244 ValidLifetime: ULONG, 245 PreferredLifetime: ULONG, 246 OnLinkPrefixLength: UINT8, 247 SkipAsSource: BOOLEAN, 248 DadState: NL_DAD_STATE, 249 ScopeId: SCOPE_ID, 250 CreationTimeStamp: LARGE_INTEGER, 251 }} 252 pub type PMIB_UNICASTIPADDRESS_ROW = *mut MIB_UNICASTIPADDRESS_ROW; 253 STRUCT!{struct MIB_UNICASTIPADDRESS_TABLE { 254 NumEntries: ULONG, 255 Table: [MIB_UNICASTIPADDRESS_ROW; ANY_SIZE], 256 }} 257 pub type PMIB_UNICASTIPADDRESS_TABLE = *mut MIB_UNICASTIPADDRESS_TABLE; 258 FN!{stdcall PUNICAST_IPADDRESS_CHANGE_CALLBACK( 259 CallerContext: PVOID, 260 Row: PMIB_UNICASTIPADDRESS_ROW, 261 NotificationType: MIB_NOTIFICATION_TYPE, 262 ) -> ()} 263 extern "system" { CreateUnicastIpAddressEntry( Row: *const MIB_UNICASTIPADDRESS_ROW, ) -> NETIOAPI_API264 pub fn CreateUnicastIpAddressEntry( 265 Row: *const MIB_UNICASTIPADDRESS_ROW, 266 ) -> NETIOAPI_API; DeleteUnicastIpAddressEntry( Row: *const MIB_UNICASTIPADDRESS_ROW, ) -> NETIOAPI_API267 pub fn DeleteUnicastIpAddressEntry( 268 Row: *const MIB_UNICASTIPADDRESS_ROW, 269 ) -> NETIOAPI_API; GetUnicastIpAddressEntry( Row: PMIB_UNICASTIPADDRESS_ROW ) -> NETIOAPI_API270 pub fn GetUnicastIpAddressEntry( 271 Row: PMIB_UNICASTIPADDRESS_ROW 272 ) -> NETIOAPI_API; GetUnicastIpAddressTable( Family: ADDRESS_FAMILY, Table: *mut PMIB_UNICASTIPADDRESS_TABLE, ) -> NETIOAPI_API273 pub fn GetUnicastIpAddressTable( 274 Family: ADDRESS_FAMILY, 275 Table: *mut PMIB_UNICASTIPADDRESS_TABLE, 276 ) -> NETIOAPI_API; InitializeUnicastIpAddressEntry( Row: PMIB_UNICASTIPADDRESS_ROW, )277 pub fn InitializeUnicastIpAddressEntry( 278 Row: PMIB_UNICASTIPADDRESS_ROW, 279 ); NotifyUnicastIpAddressChange( Family: ADDRESS_FAMILY, Callback: PUNICAST_IPADDRESS_CHANGE_CALLBACK, CallerContext: PVOID, InitialNotification: BOOLEAN, NotificationHandle: *mut HANDLE, ) -> NETIOAPI_API280 pub fn NotifyUnicastIpAddressChange( 281 Family: ADDRESS_FAMILY, 282 Callback: PUNICAST_IPADDRESS_CHANGE_CALLBACK, 283 CallerContext: PVOID, 284 InitialNotification: BOOLEAN, 285 NotificationHandle: *mut HANDLE, 286 ) -> NETIOAPI_API; 287 } 288 FN!{stdcall PSTABLE_UNICAST_IPADDRESS_TABLE_CALLBACK( 289 CallerContext: PVOID, 290 AddressTable: PMIB_UNICASTIPADDRESS_TABLE, 291 ) -> ()} 292 extern "system" { NotifyStableUnicastIpAddressTable( Family: ADDRESS_FAMILY, Table: *mut PMIB_UNICASTIPADDRESS_TABLE, CallerCallback: PSTABLE_UNICAST_IPADDRESS_TABLE_CALLBACK, CallerContext: PVOID, NotificationHandle: *mut HANDLE, ) -> NETIOAPI_API293 pub fn NotifyStableUnicastIpAddressTable( 294 Family: ADDRESS_FAMILY, 295 Table: *mut PMIB_UNICASTIPADDRESS_TABLE, 296 CallerCallback: PSTABLE_UNICAST_IPADDRESS_TABLE_CALLBACK, 297 CallerContext: PVOID, 298 NotificationHandle: *mut HANDLE, 299 ) -> NETIOAPI_API; SetUnicastIpAddressEntry( Row: *const MIB_UNICASTIPADDRESS_ROW, ) -> NETIOAPI_API300 pub fn SetUnicastIpAddressEntry( 301 Row: *const MIB_UNICASTIPADDRESS_ROW, 302 ) -> NETIOAPI_API; 303 } 304 STRUCT!{struct MIB_ANYCASTIPADDRESS_ROW { 305 Address: SOCKADDR_INET, 306 InterfaceLuid: NET_LUID, 307 InterfaceIndex: NET_IFINDEX, 308 ScopeId: SCOPE_ID, 309 }} 310 pub type PMIB_ANYCASTIPADDRESS_ROW = *mut MIB_ANYCASTIPADDRESS_ROW; 311 STRUCT!{struct MIB_ANYCASTIPADDRESS_TABLE { 312 NumEntries: ULONG, 313 Table: [MIB_ANYCASTIPADDRESS_ROW; ANY_SIZE], 314 }} 315 pub type PMIB_ANYCASTIPADDRESS_TABLE = *mut MIB_ANYCASTIPADDRESS_TABLE; 316 extern "system" { CreateAnycastIpAddressEntry( Row: *const MIB_ANYCASTIPADDRESS_ROW, ) -> NETIOAPI_API317 pub fn CreateAnycastIpAddressEntry( 318 Row: *const MIB_ANYCASTIPADDRESS_ROW, 319 ) -> NETIOAPI_API; DeleteAnycastIpAddressEntry( Row: *const MIB_ANYCASTIPADDRESS_ROW, ) -> NETIOAPI_API320 pub fn DeleteAnycastIpAddressEntry( 321 Row: *const MIB_ANYCASTIPADDRESS_ROW, 322 ) -> NETIOAPI_API; GetAnycastIpAddressEntry( Row: PMIB_ANYCASTIPADDRESS_ROW, ) -> NETIOAPI_API323 pub fn GetAnycastIpAddressEntry( 324 Row: PMIB_ANYCASTIPADDRESS_ROW, 325 ) -> NETIOAPI_API; GetAnycastIpAddressTable( Family: ADDRESS_FAMILY, Table: *mut PMIB_ANYCASTIPADDRESS_TABLE, ) -> NETIOAPI_API326 pub fn GetAnycastIpAddressTable( 327 Family: ADDRESS_FAMILY, 328 Table: *mut PMIB_ANYCASTIPADDRESS_TABLE, 329 ) -> NETIOAPI_API; 330 } 331 STRUCT!{struct MIB_MULTICASTIPADDRESS_ROW { 332 Address: SOCKADDR_INET, 333 InterfaceIndex: NET_IFINDEX, 334 InterfaceLuid: NET_LUID, 335 ScopeId: SCOPE_ID, 336 }} 337 pub type PMIB_MULTICASTIPADDRESS_ROW = *mut MIB_MULTICASTIPADDRESS_ROW; 338 STRUCT!{struct MIB_MULTICASTIPADDRESS_TABLE { 339 NumEntries: ULONG, 340 Table: [MIB_MULTICASTIPADDRESS_ROW; ANY_SIZE], 341 }} 342 pub type PMIB_MULTICASTIPADDRESS_TABLE = *mut MIB_MULTICASTIPADDRESS_TABLE; 343 extern "system" { GetMulticastIpAddressEntry( Row: PMIB_MULTICASTIPADDRESS_ROW, ) -> NETIOAPI_API344 pub fn GetMulticastIpAddressEntry( 345 Row: PMIB_MULTICASTIPADDRESS_ROW, 346 ) -> NETIOAPI_API; GetMulticastIpAddressTable( Family: ADDRESS_FAMILY, Table: *mut PMIB_MULTICASTIPADDRESS_TABLE, ) -> NETIOAPI_API347 pub fn GetMulticastIpAddressTable( 348 Family: ADDRESS_FAMILY, 349 Table: *mut PMIB_MULTICASTIPADDRESS_TABLE, 350 ) -> NETIOAPI_API; 351 } 352 STRUCT!{struct IP_ADDRESS_PREFIX { 353 Prefix: SOCKADDR_INET, 354 PrefixLength: UINT8, 355 }} 356 pub type PIP_ADDRESS_PREFIX = *mut IP_ADDRESS_PREFIX; 357 STRUCT!{struct MIB_IPFORWARD_ROW2 { 358 InterfaceLuid: NET_LUID, 359 InterfaceIndex: NET_IFINDEX, 360 DestinationPrefix: IP_ADDRESS_PREFIX, 361 NextHop: SOCKADDR_INET, 362 SitePrefixLength: UCHAR, 363 ValidLifetime: ULONG, 364 PreferredLifetime: ULONG, 365 Metric: ULONG, 366 Protocol: NL_ROUTE_PROTOCOL, 367 Loopback: BOOLEAN, 368 AutoconfigureAddress: BOOLEAN, 369 Publish: BOOLEAN, 370 Immortal: BOOLEAN, 371 Age: ULONG, 372 Origin: NL_ROUTE_ORIGIN, 373 }} 374 pub type PMIB_IPFORWARD_ROW2 = *mut MIB_IPFORWARD_ROW2; 375 STRUCT!{struct MIB_IPFORWARD_TABLE2 { 376 NumEntries: ULONG, 377 Table: [MIB_IPFORWARD_ROW2; ANY_SIZE], 378 }} 379 pub type PMIB_IPFORWARD_TABLE2 = *mut MIB_IPFORWARD_TABLE2; 380 FN!{stdcall PIPFORWARD_CHANGE_CALLBACK( 381 CallerContext: PVOID, 382 Row: PMIB_IPFORWARD_ROW2, 383 NotificationType: MIB_NOTIFICATION_TYPE, 384 ) -> ()} 385 extern "system" { CreateIpForwardEntry2( Row: *const MIB_IPFORWARD_ROW2, ) -> NETIOAPI_API386 pub fn CreateIpForwardEntry2( 387 Row: *const MIB_IPFORWARD_ROW2, 388 ) -> NETIOAPI_API; DeleteIpForwardEntry2( Row: *const MIB_IPFORWARD_ROW2, ) -> NETIOAPI_API389 pub fn DeleteIpForwardEntry2( 390 Row: *const MIB_IPFORWARD_ROW2, 391 ) -> NETIOAPI_API; 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_API392 pub fn GetBestRoute2( 393 InterfaceLuid: *mut NET_LUID, 394 InterfaceIndex: NET_IFINDEX, 395 SourceAddress: *const SOCKADDR_INET, 396 DestinationAddress: *const SOCKADDR_INET, 397 AddressSortOptions: ULONG, 398 BestRoute: PMIB_IPFORWARD_ROW2, 399 BestSourceAddress: *mut SOCKADDR_INET, 400 ) -> NETIOAPI_API; GetIpForwardEntry2( Row: PMIB_IPFORWARD_ROW2, ) -> NETIOAPI_API401 pub fn GetIpForwardEntry2( 402 Row: PMIB_IPFORWARD_ROW2, 403 ) -> NETIOAPI_API; GetIpForwardTable2( Family: ADDRESS_FAMILY, Table: *mut PMIB_IPFORWARD_TABLE2, ) -> NETIOAPI_API404 pub fn GetIpForwardTable2( 405 Family: ADDRESS_FAMILY, 406 Table: *mut PMIB_IPFORWARD_TABLE2, 407 ) -> NETIOAPI_API; InitializeIpForwardEntry( Row: PMIB_IPFORWARD_ROW2, )408 pub fn InitializeIpForwardEntry( 409 Row: PMIB_IPFORWARD_ROW2, 410 ); NotifyRouteChange2( AddressFamily: ADDRESS_FAMILY, Callback: PIPFORWARD_CHANGE_CALLBACK, CallerContext: PVOID, InitialNotification: BOOLEAN, NotificationHandle: *mut HANDLE, ) -> NETIOAPI_API411 pub fn NotifyRouteChange2( 412 AddressFamily: ADDRESS_FAMILY, 413 Callback: PIPFORWARD_CHANGE_CALLBACK, 414 CallerContext: PVOID, 415 InitialNotification: BOOLEAN, 416 NotificationHandle: *mut HANDLE, 417 ) -> NETIOAPI_API; SetIpForwardEntry2( Route: *const MIB_IPFORWARD_ROW2, ) -> NETIOAPI_API418 pub fn SetIpForwardEntry2( 419 Route: *const MIB_IPFORWARD_ROW2, 420 ) -> NETIOAPI_API; 421 } 422 UNION!{union MIB_IPPATH_ROW_u { 423 [u32; 1], 424 LastReachable LastReachable_mut: ULONG, // Milliseconds. 425 LastUnreachable LastUnreachable_mut: ULONG, // Milliseconds. 426 }} 427 STRUCT!{struct MIB_IPPATH_ROW { 428 Source: SOCKADDR_INET, 429 Destination: SOCKADDR_INET, 430 InterfaceLuid: NET_LUID, 431 InterfaceIndex: NET_IFINDEX, 432 CurrentNextHop: SOCKADDR_INET, 433 PathMtu: ULONG, 434 RttMean: ULONG, 435 RttDeviation: ULONG, 436 u: MIB_IPPATH_ROW_u, 437 IsReachable: BOOLEAN, 438 LinkTransmitSpeed: ULONG64, 439 LinkReceiveSpeed: ULONG64, 440 }} 441 pub type PMIB_IPPATH_ROW = *mut MIB_IPPATH_ROW; 442 STRUCT!{struct MIB_IPPATH_TABLE { 443 NumEntries: ULONG, 444 Table: [MIB_IPPATH_ROW; ANY_SIZE], 445 }} 446 pub type PMIB_IPPATH_TABLE = *mut MIB_IPPATH_TABLE; 447 extern "system" { FlushIpPathTable( Family: ADDRESS_FAMILY, ) -> NETIOAPI_API448 pub fn FlushIpPathTable( 449 Family: ADDRESS_FAMILY, 450 ) -> NETIOAPI_API; GetIpPathEntry( Row: PMIB_IPPATH_ROW, ) -> NETIOAPI_API451 pub fn GetIpPathEntry( 452 Row: PMIB_IPPATH_ROW, 453 ) -> NETIOAPI_API; GetIpPathTable( Family: ADDRESS_FAMILY, Table: *mut PMIB_IPPATH_TABLE, ) -> NETIOAPI_API454 pub fn GetIpPathTable( 455 Family: ADDRESS_FAMILY, 456 Table: *mut PMIB_IPPATH_TABLE, 457 ) -> NETIOAPI_API; 458 } 459 STRUCT!{struct MIB_IPNET_ROW2_s { 460 Flags: UCHAR, 461 }} 462 BITFIELD!{MIB_IPNET_ROW2_s Flags: UCHAR [ 463 IsRouter set_IsRouter[0..1], 464 IsUnreachable set_IsUnreachable[1..2], 465 Reserved set_Reserved[2..8], 466 ]} 467 UNION!{union MIB_IPNET_ROW2_ReachabilityTime { 468 [u32; 1], 469 LastReachable LastReachable_mut: ULONG, 470 LastUnreachable LastUnreachable_mut: ULONG, 471 }} 472 STRUCT!{struct MIB_IPNET_ROW2 { 473 Address: SOCKADDR_INET, 474 InterfaceIndex: NET_IFINDEX, 475 InterfaceLuid: NET_LUID, 476 PhysicalAddress: [UCHAR; IF_MAX_PHYS_ADDRESS_LENGTH], 477 PhysicalAddressLength: ULONG, 478 State: NL_NEIGHBOR_STATE, 479 s: MIB_IPNET_ROW2_s, 480 ReachabilityTime: MIB_IPNET_ROW2_ReachabilityTime, 481 }} 482 pub type PMIB_IPNET_ROW2 = *mut MIB_IPNET_ROW2; 483 STRUCT!{struct MIB_IPNET_TABLE2 { 484 NumEntries: ULONG, 485 Table: [MIB_IPNET_ROW2; ANY_SIZE], 486 }} 487 pub type PMIB_IPNET_TABLE2 = *mut MIB_IPNET_TABLE2; 488 extern "system" { CreateIpNetEntry2( Row: *const MIB_IPNET_ROW2, ) -> NETIOAPI_API489 pub fn CreateIpNetEntry2( 490 Row: *const MIB_IPNET_ROW2, 491 ) -> NETIOAPI_API; DeleteIpNetEntry2( Row: *const MIB_IPNET_ROW2, ) -> NETIOAPI_API492 pub fn DeleteIpNetEntry2( 493 Row: *const MIB_IPNET_ROW2, 494 ) -> NETIOAPI_API; FlushIpNetTable2( Family: ADDRESS_FAMILY, InterfaceIndex: NET_IFINDEX, ) -> NETIOAPI_API495 pub fn FlushIpNetTable2( 496 Family: ADDRESS_FAMILY, 497 InterfaceIndex: NET_IFINDEX, 498 ) -> NETIOAPI_API; GetIpNetEntry2( Row: PMIB_IPNET_ROW2, ) -> NETIOAPI_API499 pub fn GetIpNetEntry2( 500 Row: PMIB_IPNET_ROW2, 501 ) -> NETIOAPI_API; GetIpNetTable2( Family: ADDRESS_FAMILY, Table: *mut PMIB_IPNET_TABLE2, ) -> NETIOAPI_API502 pub fn GetIpNetTable2( 503 Family: ADDRESS_FAMILY, 504 Table: *mut PMIB_IPNET_TABLE2, 505 ) -> NETIOAPI_API; ResolveIpNetEntry2( Row: PMIB_IPNET_ROW2, SourceAddress: *const SOCKADDR_INET, ) -> NETIOAPI_API506 pub fn ResolveIpNetEntry2( 507 Row: PMIB_IPNET_ROW2, 508 SourceAddress: *const SOCKADDR_INET, 509 ) -> NETIOAPI_API; SetIpNetEntry2( Row: PMIB_IPNET_ROW2, ) -> NETIOAPI_API510 pub fn SetIpNetEntry2( 511 Row: PMIB_IPNET_ROW2, 512 ) -> NETIOAPI_API; 513 } 514 pub const MIB_INVALID_TEREDO_PORT_NUMBER: USHORT = 0; 515 FN!{stdcall PTEREDO_PORT_CHANGE_CALLBACK( 516 CallerContext: PVOID, 517 Port: USHORT, 518 NotificationType: MIB_NOTIFICATION_TYPE, 519 ) -> ()} 520 extern "system" { NotifyTeredoPortChange( Callback: PTEREDO_PORT_CHANGE_CALLBACK, CallerContext: PVOID, InitialNotification: BOOLEAN, NotificationHandle: *mut HANDLE, ) -> NETIOAPI_API521 pub fn NotifyTeredoPortChange( 522 Callback: PTEREDO_PORT_CHANGE_CALLBACK, 523 CallerContext: PVOID, 524 InitialNotification: BOOLEAN, 525 NotificationHandle: *mut HANDLE, 526 ) -> NETIOAPI_API; GetTeredoPort( Port: *mut USHORT, ) -> NETIOAPI_API527 pub fn GetTeredoPort( 528 Port: *mut USHORT, 529 ) -> NETIOAPI_API; CancelMibChangeNotify2( NotificationHandle: HANDLE, ) -> NETIOAPI_API530 pub fn CancelMibChangeNotify2( 531 NotificationHandle: HANDLE, 532 ) -> NETIOAPI_API; FreeMibTable( Memory: PVOID, )533 pub fn FreeMibTable( 534 Memory: PVOID, 535 ); CreateSortedAddressPairs( SourceAddressList: *const SOCKADDR_IN6, SourceAddressCount: ULONG, DestinationAddressList: *const SOCKADDR_IN6, DestinationAddressCount: ULONG, AddressSortOptions: ULONG, SortedAddressPairList: *mut PSOCKADDR_IN6_PAIR, SortedAddressPairCount: *mut ULONG, ) -> NETIOAPI_API536 pub fn CreateSortedAddressPairs( 537 SourceAddressList: *const SOCKADDR_IN6, 538 SourceAddressCount: ULONG, 539 DestinationAddressList: *const SOCKADDR_IN6, 540 DestinationAddressCount: ULONG, 541 AddressSortOptions: ULONG, 542 SortedAddressPairList: *mut PSOCKADDR_IN6_PAIR, 543 SortedAddressPairCount: *mut ULONG, 544 ) -> NETIOAPI_API; ConvertCompartmentGuidToId( CompartmentGuid: *const GUID, CompartmentId: PNET_IF_COMPARTMENT_ID, ) -> NETIOAPI_API545 pub fn ConvertCompartmentGuidToId( 546 CompartmentGuid: *const GUID, 547 CompartmentId: PNET_IF_COMPARTMENT_ID, 548 ) -> NETIOAPI_API; ConvertCompartmentIdToGuid( CompartmentId: NET_IF_COMPARTMENT_ID, CompartmentGuid: *mut GUID, ) -> NETIOAPI_API549 pub fn ConvertCompartmentIdToGuid( 550 CompartmentId: NET_IF_COMPARTMENT_ID, 551 CompartmentGuid: *mut GUID, 552 ) -> NETIOAPI_API; ConvertInterfaceNameToLuidA( InterfaceName: *const CHAR, InterfaceLuid: *mut NET_LUID, ) -> NETIOAPI_API553 pub fn ConvertInterfaceNameToLuidA( 554 InterfaceName: *const CHAR, 555 InterfaceLuid: *mut NET_LUID, 556 ) -> NETIOAPI_API; ConvertInterfaceNameToLuidW( InterfaceName: *const WCHAR, InterfaceLuid: *mut NET_LUID, ) -> NETIOAPI_API557 pub fn ConvertInterfaceNameToLuidW( 558 InterfaceName: *const WCHAR, 559 InterfaceLuid: *mut NET_LUID, 560 ) -> NETIOAPI_API; ConvertInterfaceLuidToNameA( InterfaceLuid: *const NET_LUID, InterfaceName: PSTR, Length: SIZE_T, ) -> NETIOAPI_API561 pub fn ConvertInterfaceLuidToNameA( 562 InterfaceLuid: *const NET_LUID, 563 InterfaceName: PSTR, 564 Length: SIZE_T, 565 ) -> NETIOAPI_API; ConvertInterfaceLuidToNameW( InterfaceLuid: *const NET_LUID, InterfaceName: PWSTR, Length: SIZE_T, ) -> NETIOAPI_API566 pub fn ConvertInterfaceLuidToNameW( 567 InterfaceLuid: *const NET_LUID, 568 InterfaceName: PWSTR, 569 Length: SIZE_T, 570 ) -> NETIOAPI_API; ConvertInterfaceLuidToIndex( InterfaceLuid: *const NET_LUID, InterfaceIndex: PNET_IFINDEX, ) -> NETIOAPI_API571 pub fn ConvertInterfaceLuidToIndex( 572 InterfaceLuid: *const NET_LUID, 573 InterfaceIndex: PNET_IFINDEX, 574 ) -> NETIOAPI_API; ConvertInterfaceIndexToLuid( InterfaceIndex: NET_IFINDEX, InterfaceLuid: PNET_LUID, ) -> NETIOAPI_API575 pub fn ConvertInterfaceIndexToLuid( 576 InterfaceIndex: NET_IFINDEX, 577 InterfaceLuid: PNET_LUID, 578 ) -> NETIOAPI_API; ConvertInterfaceLuidToAlias( InterfaceLuid: *const NET_LUID, InterfaceAlias: PWSTR, Length: SIZE_T, ) -> NETIOAPI_API579 pub fn ConvertInterfaceLuidToAlias( 580 InterfaceLuid: *const NET_LUID, 581 InterfaceAlias: PWSTR, 582 Length: SIZE_T, 583 ) -> NETIOAPI_API; ConvertInterfaceAliasToLuid( InterfaceAlias: *const WCHAR, InterfaceLuid: PNET_LUID, ) -> NETIOAPI_API584 pub fn ConvertInterfaceAliasToLuid( 585 InterfaceAlias: *const WCHAR, 586 InterfaceLuid: PNET_LUID, 587 ) -> NETIOAPI_API; ConvertInterfaceLuidToGuid( InterfaceLuid: *const NET_LUID, InterfaceGuid: *mut GUID, ) -> NETIOAPI_API588 pub fn ConvertInterfaceLuidToGuid( 589 InterfaceLuid: *const NET_LUID, 590 InterfaceGuid: *mut GUID, 591 ) -> NETIOAPI_API; ConvertInterfaceGuidToLuid( InterfaceGuid: *const GUID, InterfaceLuid: PNET_LUID, ) -> NETIOAPI_API592 pub fn ConvertInterfaceGuidToLuid( 593 InterfaceGuid: *const GUID, 594 InterfaceLuid: PNET_LUID, 595 ) -> NETIOAPI_API; if_nametoindex( InterfaceName: PCSTR, ) -> NET_IFINDEX596 pub fn if_nametoindex( 597 InterfaceName: PCSTR, 598 ) -> NET_IFINDEX; if_indextoname( InterfaceIndex: NET_IFINDEX, InterfaceName: PCHAR, ) -> PCHAR599 pub fn if_indextoname( 600 InterfaceIndex: NET_IFINDEX, 601 InterfaceName: PCHAR, 602 ) -> PCHAR; GetCurrentThreadCompartmentId() -> NET_IF_COMPARTMENT_ID603 pub fn GetCurrentThreadCompartmentId() -> NET_IF_COMPARTMENT_ID; SetCurrentThreadCompartmentId( CompartmentId: NET_IF_COMPARTMENT_ID ) -> NETIOAPI_API604 pub fn SetCurrentThreadCompartmentId( 605 CompartmentId: NET_IF_COMPARTMENT_ID 606 ) -> NETIOAPI_API; GetCurrentThreadCompartmentScope( CompartmentScope: PNET_IF_COMPARTMENT_SCOPE, CompartmentId: PNET_IF_COMPARTMENT_ID, )607 pub fn GetCurrentThreadCompartmentScope( 608 CompartmentScope: PNET_IF_COMPARTMENT_SCOPE, 609 CompartmentId: PNET_IF_COMPARTMENT_ID, 610 ); SetCurrentThreadCompartmentScope( CompartmentScope: NET_IF_COMPARTMENT_SCOPE, ) -> NETIOAPI_API611 pub fn SetCurrentThreadCompartmentScope( 612 CompartmentScope: NET_IF_COMPARTMENT_SCOPE, 613 ) -> NETIOAPI_API; GetJobCompartmentId( JobHandle: HANDLE, ) -> NET_IF_COMPARTMENT_ID614 pub fn GetJobCompartmentId( 615 JobHandle: HANDLE, 616 ) -> NET_IF_COMPARTMENT_ID; SetJobCompartmentId( JobHandle: HANDLE, CompartmentId: NET_IF_COMPARTMENT_ID, ) -> NETIOAPI_API617 pub fn SetJobCompartmentId( 618 JobHandle: HANDLE, 619 CompartmentId: NET_IF_COMPARTMENT_ID, 620 ) -> NETIOAPI_API; GetSessionCompartmentId( SessionId: ULONG, ) -> NET_IF_COMPARTMENT_ID621 pub fn GetSessionCompartmentId( 622 SessionId: ULONG, 623 ) -> NET_IF_COMPARTMENT_ID; SetSessionCompartmentId( SessionId: ULONG, CompartmentId: NET_IF_COMPARTMENT_ID, ) -> NETIOAPI_API624 pub fn SetSessionCompartmentId( 625 SessionId: ULONG, 626 CompartmentId: NET_IF_COMPARTMENT_ID, 627 ) -> NETIOAPI_API; GetDefaultCompartmentId() -> NET_IF_COMPARTMENT_ID628 pub fn GetDefaultCompartmentId() -> NET_IF_COMPARTMENT_ID; GetNetworkInformation( NetworkGuid: *const NET_IF_NETWORK_GUID, CompartmentId: PNET_IF_COMPARTMENT_ID, SiteId: PULONG, NetworkName: PWCHAR, Length: ULONG, ) -> NETIOAPI_API629 pub fn GetNetworkInformation( 630 NetworkGuid: *const NET_IF_NETWORK_GUID, 631 CompartmentId: PNET_IF_COMPARTMENT_ID, 632 SiteId: PULONG, 633 NetworkName: PWCHAR, 634 Length: ULONG, 635 ) -> NETIOAPI_API; SetNetworkInformation( NetworkGuid: *const NET_IF_NETWORK_GUID, CompartmentId: NET_IF_COMPARTMENT_ID, NetworkName: *const WCHAR, ) -> NETIOAPI_API636 pub fn SetNetworkInformation( 637 NetworkGuid: *const NET_IF_NETWORK_GUID, 638 CompartmentId: NET_IF_COMPARTMENT_ID, 639 NetworkName: *const WCHAR, 640 ) -> NETIOAPI_API; ConvertLengthToIpv4Mask( MaskLength: ULONG, Mask: PULONG, ) -> NETIOAPI_API641 pub fn ConvertLengthToIpv4Mask( 642 MaskLength: ULONG, 643 Mask: PULONG, 644 ) -> NETIOAPI_API; ConvertIpv4MaskToLength( Mask: ULONG, MaskLength: PUINT8, ) -> NETIOAPI_API645 pub fn ConvertIpv4MaskToLength( 646 Mask: ULONG, 647 MaskLength: PUINT8, 648 ) -> NETIOAPI_API; 649 } 650 pub const DNS_SETTINGS_VERSION1: ULONG = 0x0001; 651 pub const DNS_INTERFACE_SETTINGS_VERSION1: ULONG = 0x0001; 652 pub const DNS_SETTING_IPV6: ULONG64 = 0x0001; 653 pub const DNS_SETTING_NAMESERVER: ULONG64 = 0x0002; 654 pub const DNS_SETTING_SEARCHLIST: ULONG64 = 0x0004; 655 pub const DNS_SETTING_REGISTRATION_ENABLED: ULONG64 = 0x0008; 656 pub const DNS_SETTING_REGISTER_ADAPTER_NAME: ULONG64 = 0x0010; 657 pub const DNS_SETTING_DOMAIN: ULONG64 = 0x0020; 658 pub const DNS_SETTING_HOSTNAME: ULONG64 = 0x0040; 659 pub const DNS_SETTINGS_ENABLE_LLMNR: ULONG64 = 0x0080; 660 pub const DNS_SETTINGS_QUERY_ADAPTER_NAME: ULONG64 = 0x0100; 661 pub const DNS_SETTING_PROFILE_NAMESERVER: ULONG64 = 0x0200; 662 STRUCT!{struct DNS_SETTINGS { 663 Version: ULONG, 664 Flags: ULONG64, 665 Hostname: PWSTR, 666 Domain: PWSTR, 667 SearchList: PWSTR, 668 }} 669 STRUCT!{struct DNS_INTERFACE_SETTINGS { 670 Version: ULONG, 671 Flags: ULONG64, 672 Domain: PWSTR, 673 NameServer: PWSTR, 674 SearchList: PWSTR, 675 RegistrationEnabled: ULONG, 676 RegisterAdapterName: ULONG, 677 EnableLLMNR: ULONG, 678 QueryAdapterName: ULONG, 679 ProfileNameServer: PWSTR, 680 }} 681 extern "system" { GetDnsSettings( Settings: *mut DNS_SETTINGS, ) -> NETIOAPI_API682 pub fn GetDnsSettings( 683 Settings: *mut DNS_SETTINGS, 684 ) -> NETIOAPI_API; FreeDnsSettings( Settings: *mut DNS_SETTINGS, )685 pub fn FreeDnsSettings( 686 Settings: *mut DNS_SETTINGS, 687 ); SetDnsSettings( Settings: *const DNS_SETTINGS, ) -> NETIOAPI_API688 pub fn SetDnsSettings( 689 Settings: *const DNS_SETTINGS, 690 ) -> NETIOAPI_API; GetInterfaceDnsSettings( Interface: GUID, Settings: *mut DNS_INTERFACE_SETTINGS, ) -> NETIOAPI_API691 pub fn GetInterfaceDnsSettings( 692 Interface: GUID, 693 Settings: *mut DNS_INTERFACE_SETTINGS, 694 ) -> NETIOAPI_API; FreeInterfaceDnsSettings( Settings: *mut DNS_INTERFACE_SETTINGS, )695 pub fn FreeInterfaceDnsSettings( 696 Settings: *mut DNS_INTERFACE_SETTINGS, 697 ); SetInterfaceDnsSettings( Interface: GUID, Settings: *const DNS_INTERFACE_SETTINGS, ) -> NETIOAPI_API698 pub fn SetInterfaceDnsSettings( 699 Interface: GUID, 700 Settings: *const DNS_INTERFACE_SETTINGS, 701 ) -> NETIOAPI_API; 702 } 703