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