1use 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 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 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 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}