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 // #include <iprtrmib.h>
7 // #include <ipexport.h>
8 // #include <iptypes.h>
9 // #include <tcpestats.h>
10 use shared::basetsd::{PULONG64, ULONG64};
11 use shared::ifdef::NET_LUID;
12 use shared::ifmib::{PMIB_IFROW, PMIB_IFTABLE};
13 use shared::ipmib::{
14     PMIB_ICMP, PMIB_ICMP_EX, PMIB_IPADDRTABLE, PMIB_IPFORWARDROW, PMIB_IPFORWARDTABLE,
15     PMIB_IPNETROW, PMIB_IPNETTABLE, PMIB_IPSTATS
16 };
17 use shared::iprtrmib::{TCPIP_OWNER_MODULE_INFO_CLASS, TCP_TABLE_CLASS, UDP_TABLE_CLASS};
18 use shared::minwindef::{BOOL, BYTE, DWORD, LPDWORD, PDWORD, PUCHAR, PULONG, UINT};
19 use shared::ntdef::{
20     BOOLEAN, HANDLE, LPWSTR, PHANDLE, PVOID, PWSTR, ULONG, ULONGLONG, USHORT, WCHAR,
21 };
22 use shared::tcpestats::TCP_ESTATS_TYPE;
23 use shared::tcpmib::{
24     PMIB_TCP6ROW, PMIB_TCP6ROW_OWNER_MODULE, PMIB_TCP6TABLE, PMIB_TCP6TABLE2, PMIB_TCPROW,
25     PMIB_TCPROW_OWNER_MODULE, PMIB_TCPSTATS, PMIB_TCPSTATS2, PMIB_TCPTABLE, PMIB_TCPTABLE2
26 };
27 use shared::udpmib::{
28     PMIB_UDP6ROW_OWNER_MODULE, PMIB_UDP6TABLE, PMIB_UDPROW_OWNER_MODULE, PMIB_UDPSTATS,
29     PMIB_UDPSTATS2, PMIB_UDPTABLE
30 };
31 use shared::ws2def::{PSOCKADDR, SOCKADDR, SOCKADDR_IN};
32 use shared::ws2ipdef::SOCKADDR_IN6;
33 use um::ipexport::{
34     IPAddr, IPMask, IP_STATUS, PIP_ADAPTER_INDEX_MAP, PIP_ADAPTER_ORDER_MAP, PIP_INTERFACE_INFO,
35     PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS,
36 };
37 use um::iptypes::{
38     PFIXED_INFO, PIP_ADAPTER_ADDRESSES, PIP_ADAPTER_INFO, PIP_INTERFACE_NAME_INFO,
39     PIP_PER_ADAPTER_INFO,
40 };
41 use um::minwinbase::{LPOVERLAPPED,OVERLAPPED};
42 extern "system" {
GetNumberOfInterfaces( pdwNumIf: PDWORD ) -> DWORD43     pub fn GetNumberOfInterfaces(
44         pdwNumIf: PDWORD
45     ) -> DWORD;
GetIfEntry( pIfRow: PMIB_IFROW, ) -> DWORD46     pub fn GetIfEntry(
47         pIfRow: PMIB_IFROW,
48     ) -> DWORD;
GetIfTable( pIfTable: PMIB_IFTABLE, pdwSize: PULONG, bOrder: BOOL, ) -> DWORD49     pub fn GetIfTable(
50         pIfTable: PMIB_IFTABLE,
51         pdwSize: PULONG,
52         bOrder: BOOL,
53     ) -> DWORD;
GetIpAddrTable( pIpAddrTable: PMIB_IPADDRTABLE, pdwSize: PULONG, bOrder: BOOL, ) -> DWORD54     pub fn GetIpAddrTable(
55         pIpAddrTable: PMIB_IPADDRTABLE,
56         pdwSize: PULONG,
57         bOrder: BOOL,
58     ) -> DWORD;
GetIpNetTable( IpNetTable: PMIB_IPNETTABLE, SizePointer: PULONG, Order: BOOL, ) -> ULONG59     pub fn GetIpNetTable(
60         IpNetTable: PMIB_IPNETTABLE,
61         SizePointer: PULONG,
62         Order: BOOL,
63     ) -> ULONG;
GetIpForwardTable( pIpForwardTable: PMIB_IPFORWARDTABLE, pdwSize: PULONG, bOrder: BOOL, ) -> DWORD64     pub fn GetIpForwardTable(
65         pIpForwardTable: PMIB_IPFORWARDTABLE,
66         pdwSize: PULONG,
67         bOrder: BOOL,
68     ) -> DWORD;
GetTcpTable( TcpTable: PMIB_TCPTABLE, SizePointer: PULONG, Order: BOOL, ) -> ULONG69     pub fn GetTcpTable(
70         TcpTable: PMIB_TCPTABLE,
71         SizePointer: PULONG,
72         Order: BOOL,
73     ) -> ULONG;
74     // https://msdn.microsoft.com/en-us/library/windows/desktop/aa365928(v=vs.85).aspx
GetExtendedTcpTable( pTcpTable: PVOID, pdwSize: PDWORD, bOrder: BOOL, ulAf: ULONG, TableClass: TCP_TABLE_CLASS, Reserved: ULONG, ) -> DWORD75     pub fn GetExtendedTcpTable(
76         pTcpTable: PVOID,
77         pdwSize: PDWORD,
78         bOrder: BOOL,
79         ulAf: ULONG,
80         TableClass: TCP_TABLE_CLASS,
81         Reserved: ULONG,
82     ) -> DWORD;
GetOwnerModuleFromTcpEntry( pTcpEntry: PMIB_TCPROW_OWNER_MODULE, Class: TCPIP_OWNER_MODULE_INFO_CLASS, pBuffer: PVOID, pdwSize: PDWORD, ) -> DWORD83     pub fn GetOwnerModuleFromTcpEntry(
84         pTcpEntry: PMIB_TCPROW_OWNER_MODULE,
85         Class: TCPIP_OWNER_MODULE_INFO_CLASS,
86         pBuffer: PVOID,
87         pdwSize: PDWORD,
88     ) -> DWORD;
GetUdpTable( UdpTable: PMIB_UDPTABLE, SizePointer: PULONG, Order: BOOL, ) -> ULONG89     pub fn GetUdpTable(
90         UdpTable: PMIB_UDPTABLE,
91         SizePointer: PULONG,
92         Order: BOOL,
93     ) -> ULONG;
GetExtendedUdpTable( pUdpTable: PVOID, pdwSize: PDWORD, bOrder: BOOL, ulAf: ULONG, TableClass: UDP_TABLE_CLASS, Reserved: ULONG, ) -> DWORD94     pub fn GetExtendedUdpTable(
95         pUdpTable: PVOID,
96         pdwSize: PDWORD,
97         bOrder: BOOL,
98         ulAf: ULONG,
99         TableClass: UDP_TABLE_CLASS,
100         Reserved: ULONG,
101     ) -> DWORD;
GetOwnerModuleFromUdpEntry( pUdpEntry: PMIB_UDPROW_OWNER_MODULE, Class: TCPIP_OWNER_MODULE_INFO_CLASS, pBuffer: PVOID, pdwSize: PDWORD, ) -> DWORD102     pub fn GetOwnerModuleFromUdpEntry(
103         pUdpEntry: PMIB_UDPROW_OWNER_MODULE,
104         Class: TCPIP_OWNER_MODULE_INFO_CLASS,
105         pBuffer: PVOID,
106         pdwSize: PDWORD,
107     ) -> DWORD;
GetTcpTable2( TcpTable: PMIB_TCPTABLE2, SizePointer: PULONG, Order: BOOL, ) -> ULONG108     pub fn GetTcpTable2(
109         TcpTable: PMIB_TCPTABLE2,
110         SizePointer: PULONG,
111         Order: BOOL,
112     ) -> ULONG;
113     // Deprecated APIs, Added for documentation.
114     // pub fn AllocateAndGetTcpExTableFromStack() -> DWORD;
115     // pub fn AllocateAndGetUdpExTableFromStack() -> DWORD;
GetTcp6Table( TcpTable: PMIB_TCP6TABLE, SizePointer: PULONG, Order: BOOL, ) -> ULONG116     pub fn GetTcp6Table(
117         TcpTable: PMIB_TCP6TABLE,
118         SizePointer: PULONG,
119         Order: BOOL,
120     ) -> ULONG;
GetTcp6Table2( TcpTable: PMIB_TCP6TABLE2, SizePointer: PULONG, Order: BOOL, ) -> ULONG121     pub fn GetTcp6Table2(
122         TcpTable: PMIB_TCP6TABLE2,
123         SizePointer: PULONG,
124         Order: BOOL,
125     ) -> ULONG;
GetPerTcpConnectionEStats( Row: PMIB_TCPROW, EstatsType: TCP_ESTATS_TYPE, Rw: PUCHAR, RwVersion: ULONG, RwSize: ULONG, Ros: PUCHAR, RosVersion: ULONG, RosSize: ULONG, Rod: PUCHAR, RodVersion: ULONG, RodSize: ULONG, ) -> ULONG126     pub fn GetPerTcpConnectionEStats(
127         Row: PMIB_TCPROW,
128         EstatsType: TCP_ESTATS_TYPE,
129         Rw: PUCHAR,
130         RwVersion: ULONG,
131         RwSize: ULONG,
132         Ros: PUCHAR,
133         RosVersion: ULONG,
134         RosSize: ULONG,
135         Rod: PUCHAR,
136         RodVersion: ULONG,
137         RodSize: ULONG,
138     ) -> ULONG;
SetPerTcpConnectionEStats( Row: PMIB_TCPROW, EstatsType: TCP_ESTATS_TYPE, Rw: PUCHAR, RwVersion: ULONG, RwSize: ULONG, Offset: ULONG, ) -> ULONG139     pub fn SetPerTcpConnectionEStats(
140         Row: PMIB_TCPROW,
141         EstatsType: TCP_ESTATS_TYPE,
142         Rw: PUCHAR,
143         RwVersion: ULONG,
144         RwSize: ULONG,
145         Offset: ULONG,
146     ) -> ULONG;
GetPerTcp6ConnectionEStats( Row: PMIB_TCP6ROW, EstatsType: TCP_ESTATS_TYPE, Rw: PUCHAR, RwVersion: ULONG, RwSize: ULONG, Ros: PUCHAR, RosVersion: ULONG, RosSize: ULONG, Rod: PUCHAR, RodVersion: ULONG, RodSize: ULONG, ) -> ULONG147     pub fn GetPerTcp6ConnectionEStats(
148         Row: PMIB_TCP6ROW,
149         EstatsType: TCP_ESTATS_TYPE,
150         Rw: PUCHAR,
151         RwVersion: ULONG,
152         RwSize: ULONG,
153         Ros: PUCHAR,
154         RosVersion: ULONG,
155         RosSize: ULONG,
156         Rod: PUCHAR,
157         RodVersion: ULONG,
158         RodSize: ULONG,
159     ) -> ULONG;
SetPerTcp6ConnectionEStats( Row: PMIB_TCP6ROW, EstatsType: TCP_ESTATS_TYPE, Rw: PUCHAR, RwVersion: ULONG, RwSize: ULONG, Offset: ULONG, ) -> ULONG160     pub fn SetPerTcp6ConnectionEStats(
161         Row: PMIB_TCP6ROW,
162         EstatsType: TCP_ESTATS_TYPE,
163         Rw: PUCHAR,
164         RwVersion: ULONG,
165         RwSize: ULONG,
166         Offset: ULONG,
167     ) -> ULONG;
GetOwnerModuleFromTcp6Entry( pTcpEntry: PMIB_TCP6ROW_OWNER_MODULE, Class: TCPIP_OWNER_MODULE_INFO_CLASS, pBuffer: PVOID, pdwSize: PDWORD, ) -> DWORD168     pub fn GetOwnerModuleFromTcp6Entry(
169         pTcpEntry: PMIB_TCP6ROW_OWNER_MODULE,
170         Class: TCPIP_OWNER_MODULE_INFO_CLASS,
171         pBuffer: PVOID,
172         pdwSize: PDWORD,
173     ) -> DWORD;
GetUdp6Table( Udp6Table: PMIB_UDP6TABLE, SizePointer: PULONG, Order: BOOL, ) -> ULONG174     pub fn GetUdp6Table(
175         Udp6Table: PMIB_UDP6TABLE,
176         SizePointer: PULONG,
177         Order: BOOL,
178     ) -> ULONG;
GetOwnerModuleFromUdp6Entry( pUdpEntry: PMIB_UDP6ROW_OWNER_MODULE, Class: TCPIP_OWNER_MODULE_INFO_CLASS, pBuffer: PVOID, pdwSize: PDWORD, ) -> DWORD179     pub fn GetOwnerModuleFromUdp6Entry(
180         pUdpEntry: PMIB_UDP6ROW_OWNER_MODULE,
181         Class: TCPIP_OWNER_MODULE_INFO_CLASS,
182         pBuffer: PVOID,
183         pdwSize: PDWORD,
184     ) -> DWORD;
GetOwnerModuleFromPidAndInfo( ulPid: ULONG, pInfo: *mut ULONGLONG, Class: TCPIP_OWNER_MODULE_INFO_CLASS, pBuffer: PVOID, pdwSize: PDWORD, ) -> DWORD185     pub fn GetOwnerModuleFromPidAndInfo(
186         ulPid: ULONG,
187         pInfo: *mut ULONGLONG,
188         Class: TCPIP_OWNER_MODULE_INFO_CLASS,
189         pBuffer: PVOID,
190         pdwSize: PDWORD,
191     ) -> DWORD;
GetIpStatistics( Statistics: PMIB_IPSTATS, ) -> ULONG192     pub fn GetIpStatistics(
193         Statistics: PMIB_IPSTATS,
194     ) -> ULONG;
GetIcmpStatistics( Statistics: PMIB_ICMP, ) -> ULONG195     pub fn GetIcmpStatistics(
196         Statistics: PMIB_ICMP,
197     ) -> ULONG;
GetTcpStatistics( Statistics: PMIB_TCPSTATS, ) -> ULONG198     pub fn GetTcpStatistics(
199         Statistics: PMIB_TCPSTATS,
200     ) -> ULONG;
GetUdpStatistics( Stats: PMIB_UDPSTATS, ) -> ULONG201     pub fn GetUdpStatistics(
202         Stats: PMIB_UDPSTATS,
203     ) -> ULONG;
SetIpStatisticsEx( Statistics: PMIB_IPSTATS, Family: ULONG, ) -> ULONG204     pub fn SetIpStatisticsEx(
205         Statistics: PMIB_IPSTATS,
206         Family: ULONG,
207     ) -> ULONG;
GetIpStatisticsEx( Statistics: PMIB_IPSTATS, Family: ULONG, ) -> ULONG208     pub fn GetIpStatisticsEx(
209         Statistics: PMIB_IPSTATS,
210         Family: ULONG,
211     ) -> ULONG;
GetIcmpStatisticsEx( Statistics: PMIB_ICMP_EX, Family: ULONG, ) -> ULONG212     pub fn GetIcmpStatisticsEx(
213         Statistics: PMIB_ICMP_EX,
214         Family: ULONG,
215     ) -> ULONG;
GetTcpStatisticsEx( Statistics: PMIB_TCPSTATS, Family: ULONG, ) -> ULONG216     pub fn GetTcpStatisticsEx(
217         Statistics: PMIB_TCPSTATS,
218         Family: ULONG,
219     ) -> ULONG;
GetUdpStatisticsEx( Statistics: PMIB_UDPSTATS, Family: ULONG, ) -> ULONG220     pub fn GetUdpStatisticsEx(
221         Statistics: PMIB_UDPSTATS,
222         Family: ULONG,
223     ) -> ULONG;
GetTcpStatisticsEx2( Statistics: PMIB_TCPSTATS2, Family: ULONG, ) -> ULONG224     pub fn GetTcpStatisticsEx2(
225         Statistics: PMIB_TCPSTATS2,
226         Family: ULONG,
227     ) -> ULONG;
GetUdpStatisticsEx2( Statistics: PMIB_UDPSTATS2, Family: ULONG, ) -> ULONG228     pub fn GetUdpStatisticsEx2(
229         Statistics: PMIB_UDPSTATS2,
230         Family: ULONG,
231     ) -> ULONG;
SetIfEntry( pIfRow: PMIB_IFROW, ) -> DWORD232     pub fn SetIfEntry(
233         pIfRow: PMIB_IFROW,
234     ) -> DWORD;
CreateIpForwardEntry( pRoute: PMIB_IPFORWARDROW, ) -> DWORD235     pub fn CreateIpForwardEntry(
236         pRoute: PMIB_IPFORWARDROW,
237     ) -> DWORD;
SetIpForwardEntry( pRoute: PMIB_IPFORWARDROW, ) -> DWORD238     pub fn SetIpForwardEntry(
239         pRoute: PMIB_IPFORWARDROW,
240     ) -> DWORD;
DeleteIpForwardEntry( pRoute: PMIB_IPFORWARDROW, ) -> DWORD241     pub fn DeleteIpForwardEntry(
242         pRoute: PMIB_IPFORWARDROW,
243     ) -> DWORD;
SetIpStatistics( pIpStats: PMIB_IPSTATS, ) -> DWORD244     pub fn SetIpStatistics(
245         pIpStats: PMIB_IPSTATS,
246     ) -> DWORD;
SetIpTTL( nTTL: UINT, ) -> DWORD247     pub fn SetIpTTL(
248         nTTL: UINT,
249     ) -> DWORD;
CreateIpNetEntry( pArpEntry: PMIB_IPNETROW, ) -> DWORD250     pub fn CreateIpNetEntry(
251         pArpEntry: PMIB_IPNETROW,
252     ) -> DWORD;
SetIpNetEntry( pArpEntry: PMIB_IPNETROW, ) -> DWORD253     pub fn SetIpNetEntry(
254         pArpEntry: PMIB_IPNETROW,
255     ) -> DWORD;
DeleteIpNetEntry( pArpEntry: PMIB_IPNETROW, ) -> DWORD256     pub fn DeleteIpNetEntry(
257         pArpEntry: PMIB_IPNETROW,
258     ) -> DWORD;
FlushIpNetTable( dwIfIndex: DWORD, ) -> DWORD259     pub fn FlushIpNetTable(
260         dwIfIndex: DWORD,
261     ) -> DWORD;
CreateProxyArpEntry( dwAddress: DWORD, dwMask: DWORD, dwIfIndex: DWORD, ) -> DWORD262     pub fn CreateProxyArpEntry(
263         dwAddress: DWORD,
264         dwMask: DWORD,
265         dwIfIndex: DWORD,
266     ) -> DWORD;
DeleteProxyArpEntry( dwAddress: DWORD, dwMask: DWORD, dwIfIndex: DWORD, ) -> DWORD267     pub fn DeleteProxyArpEntry(
268         dwAddress: DWORD,
269         dwMask: DWORD,
270         dwIfIndex: DWORD,
271     ) -> DWORD;
SetTcpEntry( pTcpRow: PMIB_TCPROW, ) -> DWORD272     pub fn SetTcpEntry(
273         pTcpRow: PMIB_TCPROW,
274     ) -> DWORD;
GetInterfaceInfo( pIfTable: PIP_INTERFACE_INFO, dwOutBufLen: PULONG, ) -> DWORD275     pub fn GetInterfaceInfo(
276         pIfTable: PIP_INTERFACE_INFO,
277         dwOutBufLen: PULONG,
278     ) -> DWORD;
GetUniDirectionalAdapterInfo( pIPIfInfo: PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS, dwOutBufLen: PULONG, ) -> DWORD279     pub fn GetUniDirectionalAdapterInfo(
280         pIPIfInfo: PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS,
281         dwOutBufLen: PULONG,
282     ) -> DWORD;
NhpAllocateAndGetInterfaceInfoFromStack( ppTable: *mut PIP_INTERFACE_NAME_INFO, pdwCount: PDWORD, bOrder: BOOL, hHeap: HANDLE, dwFlags: DWORD, ) -> DWORD283     pub fn NhpAllocateAndGetInterfaceInfoFromStack(
284         ppTable: *mut PIP_INTERFACE_NAME_INFO,
285         pdwCount: PDWORD,
286         bOrder: BOOL,
287         hHeap: HANDLE,
288         dwFlags: DWORD,
289     ) -> DWORD;
GetBestInterface( dwDestAddr: IPAddr, pdwBestIfIndex: PDWORD, ) -> DWORD290     pub fn GetBestInterface(
291         dwDestAddr: IPAddr,
292         pdwBestIfIndex: PDWORD,
293     ) -> DWORD;
GetBestInterfaceEx( pDestAddr: PSOCKADDR, pdwBestIfIndex: PDWORD, ) -> DWORD294     pub fn GetBestInterfaceEx(
295         pDestAddr: PSOCKADDR,
296         pdwBestIfIndex: PDWORD,
297     ) -> DWORD;
GetBestRoute( dwDestAddr: DWORD, dwSourceAddr: DWORD, pBestRoute: PMIB_IPFORWARDROW, ) -> DWORD298     pub fn GetBestRoute(
299         dwDestAddr: DWORD,
300         dwSourceAddr: DWORD,
301         pBestRoute: PMIB_IPFORWARDROW,
302     ) -> DWORD;
NotifyAddrChange( Handle: PHANDLE, overlapped: LPOVERLAPPED, ) -> DWORD303     pub fn NotifyAddrChange(
304         Handle: PHANDLE,
305         overlapped: LPOVERLAPPED,
306     ) -> DWORD;
NotifyRouteChange( Handle: PHANDLE, overlapped: LPOVERLAPPED, ) -> DWORD307     pub fn NotifyRouteChange(
308         Handle: PHANDLE,
309         overlapped: LPOVERLAPPED,
310     ) -> DWORD;
CancelIPChangeNotify( notifyOverlapped: LPOVERLAPPED ) -> BOOL311     pub fn CancelIPChangeNotify(
312         notifyOverlapped: LPOVERLAPPED
313     ) -> BOOL;
GetAdapterIndex( AdapterName: LPWSTR, IfIndex: PULONG, ) -> DWORD314     pub fn GetAdapterIndex(
315         AdapterName: LPWSTR,
316         IfIndex: PULONG,
317     ) -> DWORD;
AddIPAddress( Address: IPAddr, IpMask: IPMask, IfIndex: DWORD, NTEContext: PULONG, NTEInstance: PULONG, ) -> DWORD318     pub fn AddIPAddress(
319         Address: IPAddr,
320         IpMask: IPMask,
321         IfIndex: DWORD,
322         NTEContext: PULONG,
323         NTEInstance: PULONG,
324     ) -> DWORD;
DeleteIPAddress( NTEContext: ULONG, ) -> DWORD325     pub fn DeleteIPAddress(
326         NTEContext: ULONG,
327     ) -> DWORD;
GetNetworkParams( pFixedInfo: PFIXED_INFO, pOutBufLen: PULONG, ) -> DWORD328     pub fn GetNetworkParams(
329         pFixedInfo: PFIXED_INFO,
330         pOutBufLen: PULONG,
331     ) -> DWORD;
GetAdaptersInfo( AdapterInfo: PIP_ADAPTER_INFO, SizePointer: PULONG, ) -> ULONG332     pub fn GetAdaptersInfo(
333         AdapterInfo: PIP_ADAPTER_INFO,
334         SizePointer: PULONG,
335     ) -> ULONG;
GetAdapterOrderMap() -> PIP_ADAPTER_ORDER_MAP336     pub fn GetAdapterOrderMap() -> PIP_ADAPTER_ORDER_MAP;
GetAdaptersAddresses( Family: ULONG, Flags: ULONG, Reserved: PVOID, AdapterAddresses: PIP_ADAPTER_ADDRESSES, SizePointer: PULONG, ) -> ULONG337     pub fn GetAdaptersAddresses(
338         Family: ULONG,
339         Flags: ULONG,
340         Reserved: PVOID,
341         AdapterAddresses: PIP_ADAPTER_ADDRESSES,
342         SizePointer: PULONG,
343     ) -> ULONG;
GetPerAdapterInfo( IfIndex: ULONG, pPerAdapterInfo: PIP_PER_ADAPTER_INFO, pOutBufLen: PULONG, ) -> DWORD344     pub fn GetPerAdapterInfo(
345         IfIndex: ULONG,
346         pPerAdapterInfo: PIP_PER_ADAPTER_INFO,
347         pOutBufLen: PULONG,
348     ) -> DWORD;
349 }
350 STRUCT!{struct INTERFACE_TIMESTAMP_CAPABILITY_FLAGS {
351     PtpV2OverUdpIPv4EventMsgReceiveHw: BOOLEAN,
352     PtpV2OverUdpIPv4AllMsgReceiveHw: BOOLEAN,
353     PtpV2OverUdpIPv4EventMsgTransmitHw: BOOLEAN,
354     PtpV2OverUdpIPv4AllMsgTransmitHw: BOOLEAN,
355     PtpV2OverUdpIPv6EventMsgReceiveHw: BOOLEAN,
356     PtpV2OverUdpIPv6AllMsgReceiveHw: BOOLEAN,
357     PtpV2OverUdpIPv6EventMsgTransmitHw: BOOLEAN,
358     PtpV2OverUdpIPv6AllMsgTransmitHw: BOOLEAN,
359     AllReceiveHw: BOOLEAN,
360     AllTransmitHw: BOOLEAN,
361     TaggedTransmitHw: BOOLEAN,
362     AllReceiveSw: BOOLEAN,
363     AllTransmitSw: BOOLEAN,
364     TaggedTransmitSw: BOOLEAN,
365 }}
366 pub type PINTERFACE_TIMESTAMP_CAPABILITY_FLAGS = *mut INTERFACE_TIMESTAMP_CAPABILITY_FLAGS;
367 STRUCT!{struct INTERFACE_TIMESTAMP_CAPABILITIES {
368     Version: ULONG,
369     HardwareClockFrequencyHz: ULONG64,
370     CrossTimestamp: BOOLEAN,
371     Reserved1: ULONG64,
372     Reserved2: ULONG64,
373     TimestampFlags: INTERFACE_TIMESTAMP_CAPABILITY_FLAGS,
374 }}
375 pub type PINTERFACE_TIMESTAMP_CAPABILITIES = *mut INTERFACE_TIMESTAMP_CAPABILITIES;
376 STRUCT!{struct INTERFACE_HARDWARE_CROSSTIMESTAMP {
377     Version: ULONG,
378     Flags: ULONG,
379     SystemTimestamp1: ULONG64,
380     HardwareClockTimestamp: ULONG64,
381     SystemTimestamp2: ULONG64,
382 }}
383 pub type PINTERFACE_HARDWARE_CROSSTIMESTAMP = *mut INTERFACE_HARDWARE_CROSSTIMESTAMP;
384 DECLARE_HANDLE!{HIFTIMESTAMPCHANGE, HIFTIMESTAMPCHANGE__}
385 extern "system" {
GetInterfaceCurrentTimestampCapabilities( InterfaceLuid: *const NET_LUID, TimestampCapabilite: PINTERFACE_TIMESTAMP_CAPABILITIES, ) -> DWORD386     pub fn GetInterfaceCurrentTimestampCapabilities(
387         InterfaceLuid: *const NET_LUID,
388         TimestampCapabilite: PINTERFACE_TIMESTAMP_CAPABILITIES,
389     ) -> DWORD;
GetInterfaceHardwareTimestampCapabilities( InterfaceLuid: *const NET_LUID, TimestampCapabilite: PINTERFACE_TIMESTAMP_CAPABILITIES, ) -> DWORD390     pub fn GetInterfaceHardwareTimestampCapabilities(
391         InterfaceLuid: *const NET_LUID,
392         TimestampCapabilite: PINTERFACE_TIMESTAMP_CAPABILITIES,
393     ) -> DWORD;
CaptureInterfaceHardwareCrossTimestamp( InterfaceLuid: *const NET_LUID, CrossTimestamp: PINTERFACE_HARDWARE_CROSSTIMESTAMP, ) -> DWORD394     pub fn CaptureInterfaceHardwareCrossTimestamp(
395         InterfaceLuid: *const NET_LUID,
396         CrossTimestamp: PINTERFACE_HARDWARE_CROSSTIMESTAMP,
397     ) -> DWORD;
398 }
399 FN!{stdcall INTERFACE_TIMESTAMP_CONFIG_CHANGE_CALLBACK(
400     CallerContext: PVOID,
401 ) -> ()}
402 pub type PINTERFACE_TIMESTAMP_CONFIG_CHANGE_CALLBACK = *mut
403     INTERFACE_TIMESTAMP_CONFIG_CHANGE_CALLBACK;
404 extern "system" {
NotifyIfTimestampConfigChange( CallerContext: PVOID, Callback: PINTERFACE_TIMESTAMP_CONFIG_CHANGE_CALLBACK, NotificationHandle: *mut HIFTIMESTAMPCHANGE, ) -> DWORD405     pub fn NotifyIfTimestampConfigChange(
406         CallerContext: PVOID,
407         Callback: PINTERFACE_TIMESTAMP_CONFIG_CHANGE_CALLBACK,
408         NotificationHandle: *mut HIFTIMESTAMPCHANGE,
409     ) -> DWORD;
CancelIfTimestampConfigChange( NotificationHandle: HIFTIMESTAMPCHANGE, )410     pub fn CancelIfTimestampConfigChange(
411         NotificationHandle: HIFTIMESTAMPCHANGE,
412     );
IpReleaseAddress( AdapterInfo: PIP_ADAPTER_INDEX_MAP, ) -> DWORD413     pub fn IpReleaseAddress(
414         AdapterInfo: PIP_ADAPTER_INDEX_MAP,
415     ) -> DWORD;
IpRenewAddress( AdapterInfo: PIP_ADAPTER_INDEX_MAP, ) -> DWORD416     pub fn IpRenewAddress(
417         AdapterInfo: PIP_ADAPTER_INDEX_MAP,
418     ) -> DWORD;
SendARP( DestIP: IPAddr, SrcIP: IPAddr, pMacAddr: PVOID, PhyAddrLen: PULONG, ) -> DWORD419     pub fn SendARP(
420         DestIP: IPAddr,
421         SrcIP: IPAddr,
422         pMacAddr: PVOID,
423         PhyAddrLen: PULONG,
424     ) -> DWORD;
GetRTTAndHopCount( DestIpAddress: IPAddr, HopCount: PULONG, MaxHops: ULONG, RTT: PULONG, ) -> BOOL425     pub fn GetRTTAndHopCount(
426         DestIpAddress: IPAddr,
427         HopCount: PULONG,
428         MaxHops: ULONG,
429         RTT: PULONG,
430     ) -> BOOL;
GetFriendlyIfIndex( IfIndex: DWORD, ) -> DWORD431     pub fn GetFriendlyIfIndex(
432         IfIndex: DWORD,
433     ) -> DWORD;
EnableRouter( pHandle: *mut HANDLE, pOverlapped: *mut OVERLAPPED, ) -> DWORD434     pub fn EnableRouter(
435         pHandle: *mut HANDLE,
436         pOverlapped: *mut OVERLAPPED,
437     ) -> DWORD;
UnenableRouter( pOverlapped: *mut OVERLAPPED, lpdwEnableCount: LPDWORD, ) -> DWORD438     pub fn UnenableRouter(
439         pOverlapped: *mut OVERLAPPED,
440         lpdwEnableCount: LPDWORD,
441     ) -> DWORD;
DisableMediaSense( pHandle: *mut HANDLE, pOverLapped: *mut OVERLAPPED, ) -> DWORD442     pub fn DisableMediaSense(
443         pHandle: *mut HANDLE,
444         pOverLapped: *mut OVERLAPPED,
445     ) -> DWORD;
RestoreMediaSense( pOverlapped: *mut OVERLAPPED, lpdwEnableCount: LPDWORD, ) -> DWORD446     pub fn RestoreMediaSense(
447         pOverlapped: *mut OVERLAPPED,
448         lpdwEnableCount: LPDWORD,
449     ) -> DWORD;
GetIpErrorString( ErrorCode: IP_STATUS, Buffer: PWSTR, Size: PDWORD, ) -> DWORD450     pub fn GetIpErrorString(
451         ErrorCode: IP_STATUS,
452         Buffer: PWSTR,
453         Size: PDWORD,
454     ) -> DWORD;
ResolveNeighbor( NetworkAddress: *mut SOCKADDR, PhysicalAddress: PVOID, PhysicalAddressLength: PULONG, ) -> ULONG455     pub fn ResolveNeighbor(
456         NetworkAddress: *mut SOCKADDR,
457         PhysicalAddress: PVOID,
458         PhysicalAddressLength: PULONG,
459     ) -> ULONG;
CreatePersistentTcpPortReservation( StartPort: USHORT, NumberOfPorts: USHORT, Token: PULONG64, ) -> ULONG460     pub fn CreatePersistentTcpPortReservation(
461         StartPort: USHORT,
462         NumberOfPorts: USHORT,
463         Token: PULONG64,
464     ) -> ULONG;
CreatePersistentUdpPortReservation( StartPort: USHORT, NumberOfPorts: USHORT, Token: PULONG64, ) -> ULONG465     pub fn CreatePersistentUdpPortReservation(
466         StartPort: USHORT,
467         NumberOfPorts: USHORT,
468         Token: PULONG64,
469     ) -> ULONG;
DeletePersistentTcpPortReservation( StartPort: USHORT, NumberOfPorts: USHORT, ) -> ULONG470     pub fn DeletePersistentTcpPortReservation(
471         StartPort: USHORT,
472         NumberOfPorts: USHORT,
473     ) -> ULONG;
DeletePersistentUdpPortReservation( StartPort: USHORT, NumberOfPorts: USHORT, ) -> ULONG474     pub fn DeletePersistentUdpPortReservation(
475         StartPort: USHORT,
476         NumberOfPorts: USHORT,
477     ) -> ULONG;
LookupPersistentTcpPortReservation( StartPort: USHORT, NumberOfPorts: USHORT, Token: PULONG64, ) -> ULONG478     pub fn LookupPersistentTcpPortReservation(
479         StartPort: USHORT,
480         NumberOfPorts: USHORT,
481         Token: PULONG64,
482     ) -> ULONG;
LookupPersistentUdpPortReservation( StartPort: USHORT, NumberOfPorts: USHORT, Token: PULONG64, ) -> ULONG483     pub fn LookupPersistentUdpPortReservation(
484         StartPort: USHORT,
485         NumberOfPorts: USHORT,
486         Token: PULONG64,
487     ) -> ULONG;
488 }
489 ENUM!{enum NET_ADDRESS_FORMAT {
490     NET_ADDRESS_FORMAT_UNSPECIFIED = 0,
491     NET_ADDRESS_DNS_NAME = 1,
492     NET_ADDRESS_IPV4 = 2,
493     NET_ADDRESS_IPV6 = 3,
494 }}
495 pub const DNS_MAX_NAME_BUFFER_LENGTH: usize = 256;
496 STRUCT!{struct NET_ADDRESS_INFO_u_s {
497     Address: [WCHAR; DNS_MAX_NAME_BUFFER_LENGTH],
498     Port: [WCHAR; 6],
499 }}
500 UNION!{union NET_ADDRESS_INFO_u {
501     [u32; 131],
502     NamedAddress NamedAddress_mut: NET_ADDRESS_INFO_u_s,
503     Ipv4Address Ipv4Address_mut: SOCKADDR_IN,
504     Ipv6Address Ipv6Address_mut: SOCKADDR_IN6,
505     IpAddress IpAddress_mut: SOCKADDR,
506 }}
507 STRUCT!{struct NET_ADDRESS_INFO {
508     Format: NET_ADDRESS_FORMAT,
509     u: NET_ADDRESS_INFO_u,
510 }}
511 pub type PNET_ADDRESS_INFO = *mut NET_ADDRESS_INFO;
512 extern "system" {
513     // #if defined (_WS2DEF_) && defined (_WS2IPDEF_) && defined(_WINDNS_INCLUDED_)
ParseNetworkString( NetworkString: *const *mut WCHAR, Types: DWORD, AddressInfo: PNET_ADDRESS_INFO, PortNumber: *mut USHORT, PrefixLength: *mut BYTE, ) -> DWORD514     pub fn ParseNetworkString(
515         NetworkString: *const *mut WCHAR,
516         Types: DWORD,
517         AddressInfo: PNET_ADDRESS_INFO,
518         PortNumber: *mut USHORT,
519         PrefixLength: *mut BYTE,
520     ) -> DWORD;
521 }
522