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