1use 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, BaseReachableTime: ULONG,
151 RetransmitTime: ULONG,
152 PathMtuDiscoveryTimeout: ULONG, LinkLocalAddressBehavior: NL_LINK_LOCAL_ADDRESS_BEHAVIOR,
154 LinkLocalAddressTimeout: ULONG, ZoneIndices: [ULONG; ScopeLevelCount as usize], 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, LastUnreachable LastUnreachable_mut: ULONG, }}
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}