winapi_ui_automation/um/
iphlpapi.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.
6// #include <iprtrmib.h>
7// #include <ipexport.h>
8// #include <iptypes.h>
9// #include <tcpestats.h>
10use shared::basetsd::{PULONG64, ULONG64};
11use shared::ifdef::NET_LUID;
12use shared::ifmib::{PMIB_IFROW, PMIB_IFTABLE};
13use shared::ipmib::{
14    PMIB_ICMP, PMIB_ICMP_EX, PMIB_IPADDRTABLE, PMIB_IPFORWARDROW, PMIB_IPFORWARDTABLE,
15    PMIB_IPNETROW, PMIB_IPNETTABLE, PMIB_IPSTATS
16};
17use shared::iprtrmib::{TCPIP_OWNER_MODULE_INFO_CLASS, TCP_TABLE_CLASS, UDP_TABLE_CLASS};
18use shared::minwindef::{BOOL, BYTE, DWORD, LPDWORD, PDWORD, PUCHAR, PULONG, UINT};
19use shared::ntdef::{
20    BOOLEAN, HANDLE, LPWSTR, PHANDLE, PVOID, PWSTR, ULONG, ULONGLONG, USHORT, WCHAR,
21};
22use shared::tcpestats::TCP_ESTATS_TYPE;
23use 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};
27use shared::udpmib::{
28    PMIB_UDP6ROW_OWNER_MODULE, PMIB_UDP6TABLE, PMIB_UDPROW_OWNER_MODULE, PMIB_UDPSTATS,
29    PMIB_UDPSTATS2, PMIB_UDPTABLE
30};
31use shared::ws2def::{PSOCKADDR, SOCKADDR, SOCKADDR_IN};
32use shared::ws2ipdef::SOCKADDR_IN6;
33use um::ipexport::{
34    IPAddr, IPMask, IP_STATUS, PIP_ADAPTER_INDEX_MAP, PIP_ADAPTER_ORDER_MAP, PIP_INTERFACE_INFO,
35    PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS,
36};
37use um::iptypes::{
38    PFIXED_INFO, PIP_ADAPTER_ADDRESSES, PIP_ADAPTER_INFO, PIP_INTERFACE_NAME_INFO,
39    PIP_PER_ADAPTER_INFO,
40};
41use um::minwinbase::{LPOVERLAPPED,OVERLAPPED};
42extern "system" {
43    pub fn GetNumberOfInterfaces(
44        pdwNumIf: PDWORD
45    ) -> DWORD;
46    pub fn GetIfEntry(
47        pIfRow: PMIB_IFROW,
48    ) -> DWORD;
49    pub fn GetIfTable(
50        pIfTable: PMIB_IFTABLE,
51        pdwSize: PULONG,
52        bOrder: BOOL,
53    ) -> DWORD;
54    pub fn GetIpAddrTable(
55        pIpAddrTable: PMIB_IPADDRTABLE,
56        pdwSize: PULONG,
57        bOrder: BOOL,
58    ) -> DWORD;
59    pub fn GetIpNetTable(
60        IpNetTable: PMIB_IPNETTABLE,
61        SizePointer: PULONG,
62        Order: BOOL,
63    ) -> ULONG;
64    pub fn GetIpForwardTable(
65        pIpForwardTable: PMIB_IPFORWARDTABLE,
66        pdwSize: PULONG,
67        bOrder: BOOL,
68    ) -> DWORD;
69    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
75    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;
83    pub fn GetOwnerModuleFromTcpEntry(
84        pTcpEntry: PMIB_TCPROW_OWNER_MODULE,
85        Class: TCPIP_OWNER_MODULE_INFO_CLASS,
86        pBuffer: PVOID,
87        pdwSize: PDWORD,
88    ) -> DWORD;
89    pub fn GetUdpTable(
90        UdpTable: PMIB_UDPTABLE,
91        SizePointer: PULONG,
92        Order: BOOL,
93    ) -> ULONG;
94    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;
102    pub fn GetOwnerModuleFromUdpEntry(
103        pUdpEntry: PMIB_UDPROW_OWNER_MODULE,
104        Class: TCPIP_OWNER_MODULE_INFO_CLASS,
105        pBuffer: PVOID,
106        pdwSize: PDWORD,
107    ) -> DWORD;
108    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;
116    pub fn GetTcp6Table(
117        TcpTable: PMIB_TCP6TABLE,
118        SizePointer: PULONG,
119        Order: BOOL,
120    ) -> ULONG;
121    pub fn GetTcp6Table2(
122        TcpTable: PMIB_TCP6TABLE2,
123        SizePointer: PULONG,
124        Order: BOOL,
125    ) -> ULONG;
126    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;
139    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;
147    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;
160    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;
168    pub fn GetOwnerModuleFromTcp6Entry(
169        pTcpEntry: PMIB_TCP6ROW_OWNER_MODULE,
170        Class: TCPIP_OWNER_MODULE_INFO_CLASS,
171        pBuffer: PVOID,
172        pdwSize: PDWORD,
173    ) -> DWORD;
174    pub fn GetUdp6Table(
175        Udp6Table: PMIB_UDP6TABLE,
176        SizePointer: PULONG,
177        Order: BOOL,
178    ) -> ULONG;
179    pub fn GetOwnerModuleFromUdp6Entry(
180        pUdpEntry: PMIB_UDP6ROW_OWNER_MODULE,
181        Class: TCPIP_OWNER_MODULE_INFO_CLASS,
182        pBuffer: PVOID,
183        pdwSize: PDWORD,
184    ) -> DWORD;
185    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;
192    pub fn GetIpStatistics(
193        Statistics: PMIB_IPSTATS,
194    ) -> ULONG;
195    pub fn GetIcmpStatistics(
196        Statistics: PMIB_ICMP,
197    ) -> ULONG;
198    pub fn GetTcpStatistics(
199        Statistics: PMIB_TCPSTATS,
200    ) -> ULONG;
201    pub fn GetUdpStatistics(
202        Stats: PMIB_UDPSTATS,
203    ) -> ULONG;
204    pub fn SetIpStatisticsEx(
205        Statistics: PMIB_IPSTATS,
206        Family: ULONG,
207    ) -> ULONG;
208    pub fn GetIpStatisticsEx(
209        Statistics: PMIB_IPSTATS,
210        Family: ULONG,
211    ) -> ULONG;
212    pub fn GetIcmpStatisticsEx(
213        Statistics: PMIB_ICMP_EX,
214        Family: ULONG,
215    ) -> ULONG;
216    pub fn GetTcpStatisticsEx(
217        Statistics: PMIB_TCPSTATS,
218        Family: ULONG,
219    ) -> ULONG;
220    pub fn GetUdpStatisticsEx(
221        Statistics: PMIB_UDPSTATS,
222        Family: ULONG,
223    ) -> ULONG;
224    pub fn GetTcpStatisticsEx2(
225        Statistics: PMIB_TCPSTATS2,
226        Family: ULONG,
227    ) -> ULONG;
228    pub fn GetUdpStatisticsEx2(
229        Statistics: PMIB_UDPSTATS2,
230        Family: ULONG,
231    ) -> ULONG;
232    pub fn SetIfEntry(
233        pIfRow: PMIB_IFROW,
234    ) -> DWORD;
235    pub fn CreateIpForwardEntry(
236        pRoute: PMIB_IPFORWARDROW,
237    ) -> DWORD;
238    pub fn SetIpForwardEntry(
239        pRoute: PMIB_IPFORWARDROW,
240    ) -> DWORD;
241    pub fn DeleteIpForwardEntry(
242        pRoute: PMIB_IPFORWARDROW,
243    ) -> DWORD;
244    pub fn SetIpStatistics(
245        pIpStats: PMIB_IPSTATS,
246    ) -> DWORD;
247    pub fn SetIpTTL(
248        nTTL: UINT,
249    ) -> DWORD;
250    pub fn CreateIpNetEntry(
251        pArpEntry: PMIB_IPNETROW,
252    ) -> DWORD;
253    pub fn SetIpNetEntry(
254        pArpEntry: PMIB_IPNETROW,
255    ) -> DWORD;
256    pub fn DeleteIpNetEntry(
257        pArpEntry: PMIB_IPNETROW,
258    ) -> DWORD;
259    pub fn FlushIpNetTable(
260        dwIfIndex: DWORD,
261    ) -> DWORD;
262    pub fn CreateProxyArpEntry(
263        dwAddress: DWORD,
264        dwMask: DWORD,
265        dwIfIndex: DWORD,
266    ) -> DWORD;
267    pub fn DeleteProxyArpEntry(
268        dwAddress: DWORD,
269        dwMask: DWORD,
270        dwIfIndex: DWORD,
271    ) -> DWORD;
272    pub fn SetTcpEntry(
273        pTcpRow: PMIB_TCPROW,
274    ) -> DWORD;
275    pub fn GetInterfaceInfo(
276        pIfTable: PIP_INTERFACE_INFO,
277        dwOutBufLen: PULONG,
278    ) -> DWORD;
279    pub fn GetUniDirectionalAdapterInfo(
280        pIPIfInfo: PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS,
281        dwOutBufLen: PULONG,
282    ) -> DWORD;
283    pub fn NhpAllocateAndGetInterfaceInfoFromStack(
284        ppTable: *mut PIP_INTERFACE_NAME_INFO,
285        pdwCount: PDWORD,
286        bOrder: BOOL,
287        hHeap: HANDLE,
288        dwFlags: DWORD,
289    ) -> DWORD;
290    pub fn GetBestInterface(
291        dwDestAddr: IPAddr,
292        pdwBestIfIndex: PDWORD,
293    ) -> DWORD;
294    pub fn GetBestInterfaceEx(
295        pDestAddr: PSOCKADDR,
296        pdwBestIfIndex: PDWORD,
297    ) -> DWORD;
298    pub fn GetBestRoute(
299        dwDestAddr: DWORD,
300        dwSourceAddr: DWORD,
301        pBestRoute: PMIB_IPFORWARDROW,
302    ) -> DWORD;
303    pub fn NotifyAddrChange(
304        Handle: PHANDLE,
305        overlapped: LPOVERLAPPED,
306    ) -> DWORD;
307    pub fn NotifyRouteChange(
308        Handle: PHANDLE,
309        overlapped: LPOVERLAPPED,
310    ) -> DWORD;
311    pub fn CancelIPChangeNotify(
312        notifyOverlapped: LPOVERLAPPED
313    ) -> BOOL;
314    pub fn GetAdapterIndex(
315        AdapterName: LPWSTR,
316        IfIndex: PULONG,
317    ) -> DWORD;
318    pub fn AddIPAddress(
319        Address: IPAddr,
320        IpMask: IPMask,
321        IfIndex: DWORD,
322        NTEContext: PULONG,
323        NTEInstance: PULONG,
324    ) -> DWORD;
325    pub fn DeleteIPAddress(
326        NTEContext: ULONG,
327    ) -> DWORD;
328    pub fn GetNetworkParams(
329        pFixedInfo: PFIXED_INFO,
330        pOutBufLen: PULONG,
331    ) -> DWORD;
332    pub fn GetAdaptersInfo(
333        AdapterInfo: PIP_ADAPTER_INFO,
334        SizePointer: PULONG,
335    ) -> ULONG;
336    pub fn GetAdapterOrderMap() -> PIP_ADAPTER_ORDER_MAP;
337    pub fn GetAdaptersAddresses(
338        Family: ULONG,
339        Flags: ULONG,
340        Reserved: PVOID,
341        AdapterAddresses: PIP_ADAPTER_ADDRESSES,
342        SizePointer: PULONG,
343    ) -> ULONG;
344    pub fn GetPerAdapterInfo(
345        IfIndex: ULONG,
346        pPerAdapterInfo: PIP_PER_ADAPTER_INFO,
347        pOutBufLen: PULONG,
348    ) -> DWORD;
349}
350STRUCT!{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}}
366pub type PINTERFACE_TIMESTAMP_CAPABILITY_FLAGS = *mut INTERFACE_TIMESTAMP_CAPABILITY_FLAGS;
367STRUCT!{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}}
375pub type PINTERFACE_TIMESTAMP_CAPABILITIES = *mut INTERFACE_TIMESTAMP_CAPABILITIES;
376STRUCT!{struct INTERFACE_HARDWARE_CROSSTIMESTAMP {
377    Version: ULONG,
378    Flags: ULONG,
379    SystemTimestamp1: ULONG64,
380    HardwareClockTimestamp: ULONG64,
381    SystemTimestamp2: ULONG64,
382}}
383pub type PINTERFACE_HARDWARE_CROSSTIMESTAMP = *mut INTERFACE_HARDWARE_CROSSTIMESTAMP;
384DECLARE_HANDLE!{HIFTIMESTAMPCHANGE, HIFTIMESTAMPCHANGE__}
385extern "system" {
386    pub fn GetInterfaceCurrentTimestampCapabilities(
387        InterfaceLuid: *const NET_LUID,
388        TimestampCapabilite: PINTERFACE_TIMESTAMP_CAPABILITIES,
389    ) -> DWORD;
390    pub fn GetInterfaceHardwareTimestampCapabilities(
391        InterfaceLuid: *const NET_LUID,
392        TimestampCapabilite: PINTERFACE_TIMESTAMP_CAPABILITIES,
393    ) -> DWORD;
394    pub fn CaptureInterfaceHardwareCrossTimestamp(
395        InterfaceLuid: *const NET_LUID,
396        CrossTimestamp: PINTERFACE_HARDWARE_CROSSTIMESTAMP,
397    ) -> DWORD;
398}
399FN!{stdcall INTERFACE_TIMESTAMP_CONFIG_CHANGE_CALLBACK(
400    CallerContext: PVOID,
401) -> ()}
402pub type PINTERFACE_TIMESTAMP_CONFIG_CHANGE_CALLBACK = *mut
403    INTERFACE_TIMESTAMP_CONFIG_CHANGE_CALLBACK;
404extern "system" {
405    pub fn NotifyIfTimestampConfigChange(
406        CallerContext: PVOID,
407        Callback: PINTERFACE_TIMESTAMP_CONFIG_CHANGE_CALLBACK,
408        NotificationHandle: *mut HIFTIMESTAMPCHANGE,
409    ) -> DWORD;
410    pub fn CancelIfTimestampConfigChange(
411        NotificationHandle: HIFTIMESTAMPCHANGE,
412    );
413    pub fn IpReleaseAddress(
414        AdapterInfo: PIP_ADAPTER_INDEX_MAP,
415    ) -> DWORD;
416    pub fn IpRenewAddress(
417        AdapterInfo: PIP_ADAPTER_INDEX_MAP,
418    ) -> DWORD;
419    pub fn SendARP(
420        DestIP: IPAddr,
421        SrcIP: IPAddr,
422        pMacAddr: PVOID,
423        PhyAddrLen: PULONG,
424    ) -> DWORD;
425    pub fn GetRTTAndHopCount(
426        DestIpAddress: IPAddr,
427        HopCount: PULONG,
428        MaxHops: ULONG,
429        RTT: PULONG,
430    ) -> BOOL;
431    pub fn GetFriendlyIfIndex(
432        IfIndex: DWORD,
433    ) -> DWORD;
434    pub fn EnableRouter(
435        pHandle: *mut HANDLE,
436        pOverlapped: *mut OVERLAPPED,
437    ) -> DWORD;
438    pub fn UnenableRouter(
439        pOverlapped: *mut OVERLAPPED,
440        lpdwEnableCount: LPDWORD,
441    ) -> DWORD;
442    pub fn DisableMediaSense(
443        pHandle: *mut HANDLE,
444        pOverLapped: *mut OVERLAPPED,
445    ) -> DWORD;
446    pub fn RestoreMediaSense(
447        pOverlapped: *mut OVERLAPPED,
448        lpdwEnableCount: LPDWORD,
449    ) -> DWORD;
450    pub fn GetIpErrorString(
451        ErrorCode: IP_STATUS,
452        Buffer: PWSTR,
453        Size: PDWORD,
454    ) -> DWORD;
455    pub fn ResolveNeighbor(
456        NetworkAddress: *mut SOCKADDR,
457        PhysicalAddress: PVOID,
458        PhysicalAddressLength: PULONG,
459    ) -> ULONG;
460    pub fn CreatePersistentTcpPortReservation(
461        StartPort: USHORT,
462        NumberOfPorts: USHORT,
463        Token: PULONG64,
464    ) -> ULONG;
465    pub fn CreatePersistentUdpPortReservation(
466        StartPort: USHORT,
467        NumberOfPorts: USHORT,
468        Token: PULONG64,
469    ) -> ULONG;
470    pub fn DeletePersistentTcpPortReservation(
471        StartPort: USHORT,
472        NumberOfPorts: USHORT,
473    ) -> ULONG;
474    pub fn DeletePersistentUdpPortReservation(
475        StartPort: USHORT,
476        NumberOfPorts: USHORT,
477    ) -> ULONG;
478    pub fn LookupPersistentTcpPortReservation(
479        StartPort: USHORT,
480        NumberOfPorts: USHORT,
481        Token: PULONG64,
482    ) -> ULONG;
483    pub fn LookupPersistentUdpPortReservation(
484        StartPort: USHORT,
485        NumberOfPorts: USHORT,
486        Token: PULONG64,
487    ) -> ULONG;
488}
489ENUM!{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}}
495pub const DNS_MAX_NAME_BUFFER_LENGTH: usize = 256;
496STRUCT!{struct NET_ADDRESS_INFO_u_s {
497    Address: [WCHAR; DNS_MAX_NAME_BUFFER_LENGTH],
498    Port: [WCHAR; 6],
499}}
500UNION!{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}}
507STRUCT!{struct NET_ADDRESS_INFO {
508    Format: NET_ADDRESS_FORMAT,
509    u: NET_ADDRESS_INFO_u,
510}}
511pub type PNET_ADDRESS_INFO = *mut NET_ADDRESS_INFO;
512extern "system" {
513    // #if defined (_WS2DEF_) && defined (_WS2IPDEF_) && defined(_WINDNS_INCLUDED_)
514    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}