winapi_ui_automation/shared/
netioapi.rs

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.
6use shared::basetsd::{PUINT8, SIZE_T, UINT8, ULONG64};
7use shared::guiddef::GUID;
8use 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};
15use shared::ipifcons::IFTYPE;
16use shared::minwindef::{BYTE, DWORD, PULONG, UCHAR, ULONG, USHORT};
17use 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};
22use shared::ntddndis::{NDIS_MEDIUM, NDIS_PHYSICAL_MEDIUM};
23use shared::ntdef::{
24    BOOLEAN, CHAR, HANDLE, LARGE_INTEGER, PCHAR, PCSTR, PSTR, PVOID, PWCHAR, PWSTR, WCHAR,
25};
26use shared::ws2def::{ADDRESS_FAMILY, SCOPE_ID, ScopeLevelCount};
27use shared::ws2ipdef::{PSOCKADDR_IN6_PAIR, SOCKADDR_IN6, SOCKADDR_INET};
28const ANY_SIZE: usize = 1;
29pub type NETIO_STATUS = DWORD;
30pub type NETIOAPI_API = NETIO_STATUS;
31ENUM!{enum MIB_NOTIFICATION_TYPE {
32    MibParameterNotification,
33    MibAddInstance,
34    MibDeleteInstance,
35    MibInitialNotification,
36}}
37pub type PMIB_NOTIFICATION_TYPE = *mut MIB_NOTIFICATION_TYPE;
38STRUCT!{struct MIB_IF_ROW2_InterfaceAndOperStatusFlags {
39    bitfield: BYTE,
40}}
41BITFIELD!{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]}
51STRUCT!{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}}
94pub type PMIB_IF_ROW2 = *mut MIB_IF_ROW2;
95STRUCT!{struct MIB_IF_TABLE2 {
96    NumEntries: ULONG,
97    Table: [MIB_IF_ROW2; ANY_SIZE],
98}}
99pub type PMIB_IF_TABLE2 = *mut MIB_IF_TABLE2;
100extern "system" {
101    pub fn GetIfEntry2(
102        Row: PMIB_IF_ROW2,
103    ) -> NETIOAPI_API;
104}
105ENUM!{enum MIB_IF_ENTRY_LEVEL {
106    MibIfEntryNormal = 0,
107    MibIfEntryNormalWithoutStatistics = 2,
108}}
109pub type PMIB_IF_ENTRY_LEVEL = *mut MIB_IF_ENTRY_LEVEL;
110extern "system" {
111    pub fn GetIfEntry2Ex(
112        Level: MIB_IF_ENTRY_LEVEL,
113        Row: PMIB_IF_ROW2,
114    ) -> NETIOAPI_API;
115    pub fn GetIfTable2(
116        Table: *mut PMIB_IF_TABLE2,
117    ) -> NETIOAPI_API;
118}
119ENUM!{enum MIB_IF_TABLE_LEVEL {
120    MibIfTableNormal = 0,
121    MibIfTableRaw = 1,
122    MibIfTableNormalWithoutStatistics = 2,
123}}
124pub type PMIB_IF_TABLE_LEVEL = *mut MIB_IF_TABLE_LEVEL;
125extern "system" {
126    pub fn GetIfTable2Ex(
127        Level: MIB_IF_TABLE_LEVEL,
128        Table: *mut PMIB_IF_TABLE2,
129    ) -> NETIOAPI_API;
130}
131STRUCT!{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}}
168pub type PMIB_IPINTERFACE_ROW = *mut MIB_IPINTERFACE_ROW;
169STRUCT!{struct MIB_IPINTERFACE_TABLE {
170    NumEntries: ULONG,
171    Table: [MIB_IPINTERFACE_ROW; ANY_SIZE],
172}}
173pub type PMIB_IPINTERFACE_TABLE = *mut MIB_IPINTERFACE_TABLE;
174STRUCT!{struct MIB_IFSTACK_ROW {
175    HigherLayerInterfaceIndex: NET_IFINDEX,
176    LowerLayerInterfaceIndex: NET_IFINDEX,
177}}
178pub type PMIB_IFSTACK_ROW = *mut MIB_IFSTACK_ROW;
179STRUCT!{struct MIB_INVERTEDIFSTACK_ROW {
180    LowerLayerInterfaceIndex: NET_IFINDEX,
181    HigherLayerInterfaceIndex: NET_IFINDEX,
182}}
183pub type PMIB_INVERTEDIFSTACK_ROW = *mut MIB_INVERTEDIFSTACK_ROW;
184STRUCT!{struct MIB_IFSTACK_TABLE {
185    NumEntries: ULONG,
186    Table: [MIB_IFSTACK_ROW; ANY_SIZE],
187}}
188pub type PMIB_IFSTACK_TABLE = *mut MIB_IFSTACK_TABLE;
189STRUCT!{struct MIB_INVERTEDIFSTACK_TABLE {
190    NumEntries: ULONG,
191    Table: [MIB_INVERTEDIFSTACK_ROW; ANY_SIZE],
192}}
193pub type PMIB_INVERTEDIFSTACK_TABLE = *mut MIB_INVERTEDIFSTACK_TABLE;
194FN!{stdcall PIPINTERFACE_CHANGE_CALLBACK(
195    CallerContext: PVOID,
196    Row: PMIB_IPINTERFACE_ROW,
197    NotificationType: MIB_NOTIFICATION_TYPE,
198) -> ()}
199STRUCT!{struct MIB_IP_NETWORK_CONNECTION_BANDWIDTH_ESTIMATES {
200    InboundBandwidthInformation: NL_BANDWIDTH_INFORMATION,
201    OutboundBandwidthInformation: NL_BANDWIDTH_INFORMATION,
202}}
203pub type PMIB_IP_NETWORK_CONNECTION_BANDWIDTH_ESTIMATES = *mut
204    MIB_IP_NETWORK_CONNECTION_BANDWIDTH_ESTIMATES;
205extern "system" {
206    pub fn GetIfStackTable(
207        Table: *mut PMIB_IFSTACK_TABLE,
208    ) -> NETIOAPI_API;
209    pub fn GetInvertedIfStackTable(
210        Table: *mut PMIB_INVERTEDIFSTACK_TABLE,
211    ) -> NETIOAPI_API;
212    pub fn GetIpInterfaceEntry(
213        Row: PMIB_IPINTERFACE_ROW,
214    ) -> NETIOAPI_API;
215    pub fn GetIpInterfaceTable(
216        Family: ADDRESS_FAMILY,
217        Table: *mut PMIB_IPINTERFACE_TABLE,
218    ) -> NETIOAPI_API;
219    pub fn InitializeIpInterfaceEntry(
220        Row: PMIB_IPINTERFACE_ROW,
221    );
222    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;
229    pub fn SetIpInterfaceEntry(
230        Row: PMIB_IPINTERFACE_ROW,
231    ) -> NETIOAPI_API;
232    pub fn GetIpNetworkConnectionBandwidthEstimates(
233        InterfaceIndex: NET_IFINDEX,
234        AddressFamily: ADDRESS_FAMILY,
235        BandwidthEstimates: PMIB_IP_NETWORK_CONNECTION_BANDWIDTH_ESTIMATES,
236    ) -> NETIOAPI_API;
237}
238STRUCT!{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}}
252pub type PMIB_UNICASTIPADDRESS_ROW = *mut MIB_UNICASTIPADDRESS_ROW;
253STRUCT!{struct MIB_UNICASTIPADDRESS_TABLE {
254    NumEntries: ULONG,
255    Table: [MIB_UNICASTIPADDRESS_ROW; ANY_SIZE],
256}}
257pub type PMIB_UNICASTIPADDRESS_TABLE = *mut MIB_UNICASTIPADDRESS_TABLE;
258FN!{stdcall PUNICAST_IPADDRESS_CHANGE_CALLBACK(
259    CallerContext: PVOID,
260    Row: PMIB_UNICASTIPADDRESS_ROW,
261    NotificationType: MIB_NOTIFICATION_TYPE,
262) -> ()}
263extern "system" {
264    pub fn CreateUnicastIpAddressEntry(
265        Row: *const MIB_UNICASTIPADDRESS_ROW,
266    ) -> NETIOAPI_API;
267    pub fn DeleteUnicastIpAddressEntry(
268        Row: *const MIB_UNICASTIPADDRESS_ROW,
269    ) -> NETIOAPI_API;
270    pub fn GetUnicastIpAddressEntry(
271        Row: PMIB_UNICASTIPADDRESS_ROW
272    ) -> NETIOAPI_API;
273    pub fn GetUnicastIpAddressTable(
274        Family: ADDRESS_FAMILY,
275        Table: *mut PMIB_UNICASTIPADDRESS_TABLE,
276    ) -> NETIOAPI_API;
277    pub fn InitializeUnicastIpAddressEntry(
278        Row: PMIB_UNICASTIPADDRESS_ROW,
279    );
280    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}
288FN!{stdcall PSTABLE_UNICAST_IPADDRESS_TABLE_CALLBACK(
289    CallerContext: PVOID,
290    AddressTable: PMIB_UNICASTIPADDRESS_TABLE,
291) -> ()}
292extern "system" {
293    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;
300    pub fn SetUnicastIpAddressEntry(
301        Row: *const MIB_UNICASTIPADDRESS_ROW,
302    ) -> NETIOAPI_API;
303}
304STRUCT!{struct MIB_ANYCASTIPADDRESS_ROW {
305    Address: SOCKADDR_INET,
306    InterfaceLuid: NET_LUID,
307    InterfaceIndex: NET_IFINDEX,
308    ScopeId: SCOPE_ID,
309}}
310pub type PMIB_ANYCASTIPADDRESS_ROW = *mut MIB_ANYCASTIPADDRESS_ROW;
311STRUCT!{struct MIB_ANYCASTIPADDRESS_TABLE {
312    NumEntries: ULONG,
313    Table: [MIB_ANYCASTIPADDRESS_ROW; ANY_SIZE],
314}}
315pub type PMIB_ANYCASTIPADDRESS_TABLE = *mut MIB_ANYCASTIPADDRESS_TABLE;
316extern "system" {
317    pub fn CreateAnycastIpAddressEntry(
318        Row: *const MIB_ANYCASTIPADDRESS_ROW,
319    ) -> NETIOAPI_API;
320    pub fn DeleteAnycastIpAddressEntry(
321        Row: *const MIB_ANYCASTIPADDRESS_ROW,
322    ) -> NETIOAPI_API;
323    pub fn GetAnycastIpAddressEntry(
324        Row: PMIB_ANYCASTIPADDRESS_ROW,
325    ) -> NETIOAPI_API;
326    pub fn GetAnycastIpAddressTable(
327        Family: ADDRESS_FAMILY,
328        Table: *mut PMIB_ANYCASTIPADDRESS_TABLE,
329    ) -> NETIOAPI_API;
330}
331STRUCT!{struct MIB_MULTICASTIPADDRESS_ROW {
332    Address: SOCKADDR_INET,
333    InterfaceIndex: NET_IFINDEX,
334    InterfaceLuid: NET_LUID,
335    ScopeId: SCOPE_ID,
336}}
337pub type PMIB_MULTICASTIPADDRESS_ROW = *mut MIB_MULTICASTIPADDRESS_ROW;
338STRUCT!{struct MIB_MULTICASTIPADDRESS_TABLE {
339    NumEntries: ULONG,
340    Table: [MIB_MULTICASTIPADDRESS_ROW; ANY_SIZE],
341}}
342pub type PMIB_MULTICASTIPADDRESS_TABLE = *mut MIB_MULTICASTIPADDRESS_TABLE;
343extern "system" {
344    pub fn GetMulticastIpAddressEntry(
345        Row: PMIB_MULTICASTIPADDRESS_ROW,
346    ) -> NETIOAPI_API;
347    pub fn GetMulticastIpAddressTable(
348        Family: ADDRESS_FAMILY,
349        Table: *mut PMIB_MULTICASTIPADDRESS_TABLE,
350    ) -> NETIOAPI_API;
351}
352STRUCT!{struct IP_ADDRESS_PREFIX {
353    Prefix: SOCKADDR_INET,
354    PrefixLength: UINT8,
355}}
356pub type PIP_ADDRESS_PREFIX = *mut IP_ADDRESS_PREFIX;
357STRUCT!{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}}
374pub type PMIB_IPFORWARD_ROW2 = *mut MIB_IPFORWARD_ROW2;
375STRUCT!{struct MIB_IPFORWARD_TABLE2 {
376    NumEntries: ULONG,
377    Table: [MIB_IPFORWARD_ROW2; ANY_SIZE],
378}}
379pub type PMIB_IPFORWARD_TABLE2 = *mut MIB_IPFORWARD_TABLE2;
380FN!{stdcall PIPFORWARD_CHANGE_CALLBACK(
381    CallerContext: PVOID,
382    Row: PMIB_IPFORWARD_ROW2,
383    NotificationType: MIB_NOTIFICATION_TYPE,
384) -> ()}
385extern "system" {
386    pub fn CreateIpForwardEntry2(
387        Row: *const MIB_IPFORWARD_ROW2,
388    ) -> NETIOAPI_API;
389    pub fn DeleteIpForwardEntry2(
390        Row: *const MIB_IPFORWARD_ROW2,
391    ) -> NETIOAPI_API;
392    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;
401    pub fn GetIpForwardEntry2(
402        Row: PMIB_IPFORWARD_ROW2,
403    ) -> NETIOAPI_API;
404    pub fn GetIpForwardTable2(
405        Family: ADDRESS_FAMILY,
406        Table: *mut PMIB_IPFORWARD_TABLE2,
407    ) -> NETIOAPI_API;
408    pub fn InitializeIpForwardEntry(
409        Row: PMIB_IPFORWARD_ROW2,
410    );
411    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;
418    pub fn SetIpForwardEntry2(
419        Route: *const MIB_IPFORWARD_ROW2,
420    ) -> NETIOAPI_API;
421}
422UNION!{union MIB_IPPATH_ROW_u {
423    [u32; 1],
424    LastReachable LastReachable_mut: ULONG, // Milliseconds.
425    LastUnreachable LastUnreachable_mut: ULONG, // Milliseconds.
426}}
427STRUCT!{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}}
441pub type PMIB_IPPATH_ROW = *mut MIB_IPPATH_ROW;
442STRUCT!{struct MIB_IPPATH_TABLE {
443    NumEntries: ULONG,
444    Table: [MIB_IPPATH_ROW; ANY_SIZE],
445}}
446pub type PMIB_IPPATH_TABLE = *mut MIB_IPPATH_TABLE;
447extern "system" {
448    pub fn FlushIpPathTable(
449        Family: ADDRESS_FAMILY,
450    ) -> NETIOAPI_API;
451    pub fn GetIpPathEntry(
452        Row: PMIB_IPPATH_ROW,
453    ) -> NETIOAPI_API;
454    pub fn GetIpPathTable(
455        Family: ADDRESS_FAMILY,
456        Table: *mut PMIB_IPPATH_TABLE,
457    ) -> NETIOAPI_API;
458}
459STRUCT!{struct MIB_IPNET_ROW2_s {
460    Flags: UCHAR,
461}}
462BITFIELD!{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]}
467UNION!{union MIB_IPNET_ROW2_ReachabilityTime {
468    [u32; 1],
469    LastReachable LastReachable_mut: ULONG,
470    LastUnreachable LastUnreachable_mut: ULONG,
471}}
472STRUCT!{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}}
482pub type PMIB_IPNET_ROW2 = *mut MIB_IPNET_ROW2;
483STRUCT!{struct MIB_IPNET_TABLE2 {
484    NumEntries: ULONG,
485    Table: [MIB_IPNET_ROW2; ANY_SIZE],
486}}
487pub type PMIB_IPNET_TABLE2 = *mut MIB_IPNET_TABLE2;
488extern "system" {
489    pub fn CreateIpNetEntry2(
490        Row: *const MIB_IPNET_ROW2,
491    ) -> NETIOAPI_API;
492    pub fn DeleteIpNetEntry2(
493        Row: *const MIB_IPNET_ROW2,
494    ) -> NETIOAPI_API;
495    pub fn FlushIpNetTable2(
496        Family: ADDRESS_FAMILY,
497        InterfaceIndex: NET_IFINDEX,
498    ) -> NETIOAPI_API;
499    pub fn GetIpNetEntry2(
500        Row: PMIB_IPNET_ROW2,
501    ) -> NETIOAPI_API;
502    pub fn GetIpNetTable2(
503        Family: ADDRESS_FAMILY,
504        Table: *mut PMIB_IPNET_TABLE2,
505    ) -> NETIOAPI_API;
506    pub fn ResolveIpNetEntry2(
507        Row: PMIB_IPNET_ROW2,
508        SourceAddress: *const SOCKADDR_INET,
509    ) -> NETIOAPI_API;
510    pub fn SetIpNetEntry2(
511        Row: PMIB_IPNET_ROW2,
512    ) -> NETIOAPI_API;
513}
514pub const MIB_INVALID_TEREDO_PORT_NUMBER: USHORT = 0;
515FN!{stdcall PTEREDO_PORT_CHANGE_CALLBACK(
516    CallerContext: PVOID,
517    Port: USHORT,
518    NotificationType: MIB_NOTIFICATION_TYPE,
519) -> ()}
520extern "system" {
521    pub fn NotifyTeredoPortChange(
522        Callback: PTEREDO_PORT_CHANGE_CALLBACK,
523        CallerContext: PVOID,
524        InitialNotification: BOOLEAN,
525        NotificationHandle: *mut HANDLE,
526    ) -> NETIOAPI_API;
527    pub fn GetTeredoPort(
528        Port: *mut USHORT,
529    ) -> NETIOAPI_API;
530    pub fn CancelMibChangeNotify2(
531        NotificationHandle: HANDLE,
532    ) -> NETIOAPI_API;
533    pub fn FreeMibTable(
534        Memory: PVOID,
535    );
536    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;
545    pub fn ConvertCompartmentGuidToId(
546        CompartmentGuid: *const GUID,
547        CompartmentId: PNET_IF_COMPARTMENT_ID,
548    ) -> NETIOAPI_API;
549    pub fn ConvertCompartmentIdToGuid(
550        CompartmentId: NET_IF_COMPARTMENT_ID,
551        CompartmentGuid: *mut GUID,
552    ) -> NETIOAPI_API;
553    pub fn ConvertInterfaceNameToLuidA(
554        InterfaceName: *const CHAR,
555        InterfaceLuid: *mut NET_LUID,
556    ) -> NETIOAPI_API;
557    pub fn ConvertInterfaceNameToLuidW(
558        InterfaceName: *const WCHAR,
559        InterfaceLuid: *mut NET_LUID,
560    ) -> NETIOAPI_API;
561    pub fn ConvertInterfaceLuidToNameA(
562        InterfaceLuid: *const NET_LUID,
563        InterfaceName: PSTR,
564        Length: SIZE_T,
565    ) -> NETIOAPI_API;
566    pub fn ConvertInterfaceLuidToNameW(
567        InterfaceLuid: *const NET_LUID,
568        InterfaceName: PWSTR,
569        Length: SIZE_T,
570    ) -> NETIOAPI_API;
571    pub fn ConvertInterfaceLuidToIndex(
572        InterfaceLuid: *const NET_LUID,
573        InterfaceIndex: PNET_IFINDEX,
574    ) -> NETIOAPI_API;
575    pub fn ConvertInterfaceIndexToLuid(
576        InterfaceIndex: NET_IFINDEX,
577        InterfaceLuid: PNET_LUID,
578    ) -> NETIOAPI_API;
579    pub fn ConvertInterfaceLuidToAlias(
580        InterfaceLuid: *const NET_LUID,
581        InterfaceAlias: PWSTR,
582        Length: SIZE_T,
583    ) -> NETIOAPI_API;
584    pub fn ConvertInterfaceAliasToLuid(
585        InterfaceAlias: *const WCHAR,
586        InterfaceLuid: PNET_LUID,
587    ) -> NETIOAPI_API;
588    pub fn ConvertInterfaceLuidToGuid(
589        InterfaceLuid: *const NET_LUID,
590        InterfaceGuid: *mut GUID,
591    ) -> NETIOAPI_API;
592    pub fn ConvertInterfaceGuidToLuid(
593        InterfaceGuid: *const GUID,
594        InterfaceLuid: PNET_LUID,
595    ) -> NETIOAPI_API;
596    pub fn if_nametoindex(
597        InterfaceName: PCSTR,
598    ) -> NET_IFINDEX;
599    pub fn if_indextoname(
600        InterfaceIndex: NET_IFINDEX,
601        InterfaceName: PCHAR,
602    ) -> PCHAR;
603    pub fn GetCurrentThreadCompartmentId() -> NET_IF_COMPARTMENT_ID;
604    pub fn SetCurrentThreadCompartmentId(
605        CompartmentId: NET_IF_COMPARTMENT_ID
606    ) -> NETIOAPI_API;
607    pub fn GetCurrentThreadCompartmentScope(
608        CompartmentScope: PNET_IF_COMPARTMENT_SCOPE,
609        CompartmentId: PNET_IF_COMPARTMENT_ID,
610    );
611    pub fn SetCurrentThreadCompartmentScope(
612        CompartmentScope: NET_IF_COMPARTMENT_SCOPE,
613    ) -> NETIOAPI_API;
614    pub fn GetJobCompartmentId(
615        JobHandle: HANDLE,
616    ) -> NET_IF_COMPARTMENT_ID;
617    pub fn SetJobCompartmentId(
618        JobHandle: HANDLE,
619        CompartmentId: NET_IF_COMPARTMENT_ID,
620    ) -> NETIOAPI_API;
621    pub fn GetSessionCompartmentId(
622        SessionId: ULONG,
623    ) -> NET_IF_COMPARTMENT_ID;
624    pub fn SetSessionCompartmentId(
625        SessionId: ULONG,
626        CompartmentId: NET_IF_COMPARTMENT_ID,
627    ) -> NETIOAPI_API;
628    pub fn GetDefaultCompartmentId() -> NET_IF_COMPARTMENT_ID;
629    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;
636    pub fn SetNetworkInformation(
637        NetworkGuid: *const NET_IF_NETWORK_GUID,
638        CompartmentId: NET_IF_COMPARTMENT_ID,
639        NetworkName: *const WCHAR,
640    ) -> NETIOAPI_API;
641    pub fn ConvertLengthToIpv4Mask(
642        MaskLength: ULONG,
643        Mask: PULONG,
644    ) -> NETIOAPI_API;
645    pub fn ConvertIpv4MaskToLength(
646        Mask: ULONG,
647        MaskLength: PUINT8,
648    ) -> NETIOAPI_API;
649}
650pub const DNS_SETTINGS_VERSION1: ULONG = 0x0001;
651pub const DNS_INTERFACE_SETTINGS_VERSION1: ULONG = 0x0001;
652pub const DNS_SETTING_IPV6: ULONG64 = 0x0001;
653pub const DNS_SETTING_NAMESERVER: ULONG64 = 0x0002;
654pub const DNS_SETTING_SEARCHLIST: ULONG64 = 0x0004;
655pub const DNS_SETTING_REGISTRATION_ENABLED: ULONG64 = 0x0008;
656pub const DNS_SETTING_REGISTER_ADAPTER_NAME: ULONG64 = 0x0010;
657pub const DNS_SETTING_DOMAIN: ULONG64 = 0x0020;
658pub const DNS_SETTING_HOSTNAME: ULONG64 = 0x0040;
659pub const DNS_SETTINGS_ENABLE_LLMNR: ULONG64 = 0x0080;
660pub const DNS_SETTINGS_QUERY_ADAPTER_NAME: ULONG64 = 0x0100;
661pub const DNS_SETTING_PROFILE_NAMESERVER: ULONG64 = 0x0200;
662STRUCT!{struct DNS_SETTINGS {
663    Version: ULONG,
664    Flags: ULONG64,
665    Hostname: PWSTR,
666    Domain: PWSTR,
667    SearchList: PWSTR,
668}}
669STRUCT!{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}}
681extern "system" {
682    pub fn GetDnsSettings(
683        Settings: *mut DNS_SETTINGS,
684    ) -> NETIOAPI_API;
685    pub fn FreeDnsSettings(
686        Settings: *mut DNS_SETTINGS,
687    );
688    pub fn SetDnsSettings(
689        Settings: *const DNS_SETTINGS,
690    ) -> NETIOAPI_API;
691    pub fn GetInterfaceDnsSettings(
692        Interface: GUID,
693        Settings: *mut DNS_INTERFACE_SETTINGS,
694    ) -> NETIOAPI_API;
695    pub fn FreeInterfaceDnsSettings(
696        Settings: *mut DNS_INTERFACE_SETTINGS,
697    );
698    pub fn SetInterfaceDnsSettings(
699        Interface: GUID,
700        Settings: *const DNS_INTERFACE_SETTINGS,
701    ) -> NETIOAPI_API;
702}