| // Licensed under the Apache License, Version 2.0 |
| // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license |
| // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option. |
| // All files in the project carrying such notice may not be copied, modified, or distributed |
| // except according to those terms. |
| // #include <iprtrmib.h> |
| // #include <ipexport.h> |
| // #include <iptypes.h> |
| // #include <tcpestats.h> |
| use shared::basetsd::{PULONG64, ULONG64}; |
| use shared::ifdef::NET_LUID; |
| use shared::ifmib::{PMIB_IFROW, PMIB_IFTABLE}; |
| use shared::ipmib::{ |
| PMIB_ICMP, PMIB_ICMP_EX, PMIB_IPADDRTABLE, PMIB_IPFORWARDROW, PMIB_IPFORWARDTABLE, |
| PMIB_IPNETROW, PMIB_IPNETTABLE, PMIB_IPSTATS |
| }; |
| use shared::iprtrmib::{TCPIP_OWNER_MODULE_INFO_CLASS, TCP_TABLE_CLASS, UDP_TABLE_CLASS}; |
| use shared::minwindef::{BOOL, BYTE, DWORD, LPDWORD, PDWORD, PUCHAR, PULONG, UINT}; |
| use shared::ntdef::{ |
| BOOLEAN, HANDLE, LPWSTR, PHANDLE, PVOID, PWSTR, ULONG, ULONGLONG, USHORT, WCHAR, |
| }; |
| use shared::tcpestats::TCP_ESTATS_TYPE; |
| use shared::tcpmib::{ |
| PMIB_TCP6ROW, PMIB_TCP6ROW_OWNER_MODULE, PMIB_TCP6TABLE, PMIB_TCP6TABLE2, PMIB_TCPROW, |
| PMIB_TCPROW_OWNER_MODULE, PMIB_TCPSTATS, PMIB_TCPSTATS2, PMIB_TCPTABLE, PMIB_TCPTABLE2 |
| }; |
| use shared::udpmib::{ |
| PMIB_UDP6ROW_OWNER_MODULE, PMIB_UDP6TABLE, PMIB_UDPROW_OWNER_MODULE, PMIB_UDPSTATS, |
| PMIB_UDPSTATS2, PMIB_UDPTABLE |
| }; |
| use shared::ws2def::{PSOCKADDR, SOCKADDR, SOCKADDR_IN}; |
| use shared::ws2ipdef::SOCKADDR_IN6; |
| use um::ipexport::{ |
| IPAddr, IPMask, IP_STATUS, PIP_ADAPTER_INDEX_MAP, PIP_ADAPTER_ORDER_MAP, PIP_INTERFACE_INFO, |
| PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS, |
| }; |
| use um::iptypes::{ |
| PFIXED_INFO, PIP_ADAPTER_ADDRESSES, PIP_ADAPTER_INFO, PIP_INTERFACE_NAME_INFO, |
| PIP_PER_ADAPTER_INFO, |
| }; |
| use um::minwinbase::{LPOVERLAPPED,OVERLAPPED}; |
| extern "system" { |
| pub fn GetNumberOfInterfaces( |
| pdwNumIf: PDWORD |
| ) -> DWORD; |
| pub fn GetIfEntry( |
| pIfRow: PMIB_IFROW, |
| ) -> DWORD; |
| pub fn GetIfTable( |
| pIfTable: PMIB_IFTABLE, |
| pdwSize: PULONG, |
| bOrder: BOOL, |
| ) -> DWORD; |
| pub fn GetIpAddrTable( |
| pIpAddrTable: PMIB_IPADDRTABLE, |
| pdwSize: PULONG, |
| bOrder: BOOL, |
| ) -> DWORD; |
| pub fn GetIpNetTable( |
| IpNetTable: PMIB_IPNETTABLE, |
| SizePointer: PULONG, |
| Order: BOOL, |
| ) -> ULONG; |
| pub fn GetIpForwardTable( |
| pIpForwardTable: PMIB_IPFORWARDTABLE, |
| pdwSize: PULONG, |
| bOrder: BOOL, |
| ) -> DWORD; |
| pub fn GetTcpTable( |
| TcpTable: PMIB_TCPTABLE, |
| SizePointer: PULONG, |
| Order: BOOL, |
| ) -> ULONG; |
| // https://msdn.microsoft.com/en-us/library/windows/desktop/aa365928(v=vs.85).aspx |
| pub fn GetExtendedTcpTable( |
| pTcpTable: PVOID, |
| pdwSize: PDWORD, |
| bOrder: BOOL, |
| ulAf: ULONG, |
| TableClass: TCP_TABLE_CLASS, |
| Reserved: ULONG, |
| ) -> DWORD; |
| pub fn GetOwnerModuleFromTcpEntry( |
| pTcpEntry: PMIB_TCPROW_OWNER_MODULE, |
| Class: TCPIP_OWNER_MODULE_INFO_CLASS, |
| pBuffer: PVOID, |
| pdwSize: PDWORD, |
| ) -> DWORD; |
| pub fn GetUdpTable( |
| UdpTable: PMIB_UDPTABLE, |
| SizePointer: PULONG, |
| Order: BOOL, |
| ) -> ULONG; |
| pub fn GetExtendedUdpTable( |
| pUdpTable: PVOID, |
| pdwSize: PDWORD, |
| bOrder: BOOL, |
| ulAf: ULONG, |
| TableClass: UDP_TABLE_CLASS, |
| Reserved: ULONG, |
| ) -> DWORD; |
| pub fn GetOwnerModuleFromUdpEntry( |
| pUdpEntry: PMIB_UDPROW_OWNER_MODULE, |
| Class: TCPIP_OWNER_MODULE_INFO_CLASS, |
| pBuffer: PVOID, |
| pdwSize: PDWORD, |
| ) -> DWORD; |
| pub fn GetTcpTable2( |
| TcpTable: PMIB_TCPTABLE2, |
| SizePointer: PULONG, |
| Order: BOOL, |
| ) -> ULONG; |
| // Deprecated APIs, Added for documentation. |
| // pub fn AllocateAndGetTcpExTableFromStack() -> DWORD; |
| // pub fn AllocateAndGetUdpExTableFromStack() -> DWORD; |
| pub fn GetTcp6Table( |
| TcpTable: PMIB_TCP6TABLE, |
| SizePointer: PULONG, |
| Order: BOOL, |
| ) -> ULONG; |
| pub fn GetTcp6Table2( |
| TcpTable: PMIB_TCP6TABLE2, |
| SizePointer: PULONG, |
| Order: BOOL, |
| ) -> ULONG; |
| pub fn 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, |
| ) -> ULONG; |
| pub fn SetPerTcpConnectionEStats( |
| Row: PMIB_TCPROW, |
| EstatsType: TCP_ESTATS_TYPE, |
| Rw: PUCHAR, |
| RwVersion: ULONG, |
| RwSize: ULONG, |
| Offset: ULONG, |
| ) -> ULONG; |
| pub fn 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, |
| ) -> ULONG; |
| pub fn SetPerTcp6ConnectionEStats( |
| Row: PMIB_TCP6ROW, |
| EstatsType: TCP_ESTATS_TYPE, |
| Rw: PUCHAR, |
| RwVersion: ULONG, |
| RwSize: ULONG, |
| Offset: ULONG, |
| ) -> ULONG; |
| pub fn GetOwnerModuleFromTcp6Entry( |
| pTcpEntry: PMIB_TCP6ROW_OWNER_MODULE, |
| Class: TCPIP_OWNER_MODULE_INFO_CLASS, |
| pBuffer: PVOID, |
| pdwSize: PDWORD, |
| ) -> DWORD; |
| pub fn GetUdp6Table( |
| Udp6Table: PMIB_UDP6TABLE, |
| SizePointer: PULONG, |
| Order: BOOL, |
| ) -> ULONG; |
| pub fn GetOwnerModuleFromUdp6Entry( |
| pUdpEntry: PMIB_UDP6ROW_OWNER_MODULE, |
| Class: TCPIP_OWNER_MODULE_INFO_CLASS, |
| pBuffer: PVOID, |
| pdwSize: PDWORD, |
| ) -> DWORD; |
| pub fn GetOwnerModuleFromPidAndInfo( |
| ulPid: ULONG, |
| pInfo: *mut ULONGLONG, |
| Class: TCPIP_OWNER_MODULE_INFO_CLASS, |
| pBuffer: PVOID, |
| pdwSize: PDWORD, |
| ) -> DWORD; |
| pub fn GetIpStatistics( |
| Statistics: PMIB_IPSTATS, |
| ) -> ULONG; |
| pub fn GetIcmpStatistics( |
| Statistics: PMIB_ICMP, |
| ) -> ULONG; |
| pub fn GetTcpStatistics( |
| Statistics: PMIB_TCPSTATS, |
| ) -> ULONG; |
| pub fn GetUdpStatistics( |
| Stats: PMIB_UDPSTATS, |
| ) -> ULONG; |
| pub fn SetIpStatisticsEx( |
| Statistics: PMIB_IPSTATS, |
| Family: ULONG, |
| ) -> ULONG; |
| pub fn GetIpStatisticsEx( |
| Statistics: PMIB_IPSTATS, |
| Family: ULONG, |
| ) -> ULONG; |
| pub fn GetIcmpStatisticsEx( |
| Statistics: PMIB_ICMP_EX, |
| Family: ULONG, |
| ) -> ULONG; |
| pub fn GetTcpStatisticsEx( |
| Statistics: PMIB_TCPSTATS, |
| Family: ULONG, |
| ) -> ULONG; |
| pub fn GetUdpStatisticsEx( |
| Statistics: PMIB_UDPSTATS, |
| Family: ULONG, |
| ) -> ULONG; |
| pub fn GetTcpStatisticsEx2( |
| Statistics: PMIB_TCPSTATS2, |
| Family: ULONG, |
| ) -> ULONG; |
| pub fn GetUdpStatisticsEx2( |
| Statistics: PMIB_UDPSTATS2, |
| Family: ULONG, |
| ) -> ULONG; |
| pub fn SetIfEntry( |
| pIfRow: PMIB_IFROW, |
| ) -> DWORD; |
| pub fn CreateIpForwardEntry( |
| pRoute: PMIB_IPFORWARDROW, |
| ) -> DWORD; |
| pub fn SetIpForwardEntry( |
| pRoute: PMIB_IPFORWARDROW, |
| ) -> DWORD; |
| pub fn DeleteIpForwardEntry( |
| pRoute: PMIB_IPFORWARDROW, |
| ) -> DWORD; |
| pub fn SetIpStatistics( |
| pIpStats: PMIB_IPSTATS, |
| ) -> DWORD; |
| pub fn SetIpTTL( |
| nTTL: UINT, |
| ) -> DWORD; |
| pub fn CreateIpNetEntry( |
| pArpEntry: PMIB_IPNETROW, |
| ) -> DWORD; |
| pub fn SetIpNetEntry( |
| pArpEntry: PMIB_IPNETROW, |
| ) -> DWORD; |
| pub fn DeleteIpNetEntry( |
| pArpEntry: PMIB_IPNETROW, |
| ) -> DWORD; |
| pub fn FlushIpNetTable( |
| dwIfIndex: DWORD, |
| ) -> DWORD; |
| pub fn CreateProxyArpEntry( |
| dwAddress: DWORD, |
| dwMask: DWORD, |
| dwIfIndex: DWORD, |
| ) -> DWORD; |
| pub fn DeleteProxyArpEntry( |
| dwAddress: DWORD, |
| dwMask: DWORD, |
| dwIfIndex: DWORD, |
| ) -> DWORD; |
| pub fn SetTcpEntry( |
| pTcpRow: PMIB_TCPROW, |
| ) -> DWORD; |
| pub fn GetInterfaceInfo( |
| pIfTable: PIP_INTERFACE_INFO, |
| dwOutBufLen: PULONG, |
| ) -> DWORD; |
| pub fn GetUniDirectionalAdapterInfo( |
| pIPIfInfo: PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS, |
| dwOutBufLen: PULONG, |
| ) -> DWORD; |
| pub fn NhpAllocateAndGetInterfaceInfoFromStack( |
| ppTable: *mut PIP_INTERFACE_NAME_INFO, |
| pdwCount: PDWORD, |
| bOrder: BOOL, |
| hHeap: HANDLE, |
| dwFlags: DWORD, |
| ) -> DWORD; |
| pub fn GetBestInterface( |
| dwDestAddr: IPAddr, |
| pdwBestIfIndex: PDWORD, |
| ) -> DWORD; |
| pub fn GetBestInterfaceEx( |
| pDestAddr: PSOCKADDR, |
| pdwBestIfIndex: PDWORD, |
| ) -> DWORD; |
| pub fn GetBestRoute( |
| dwDestAddr: DWORD, |
| dwSourceAddr: DWORD, |
| pBestRoute: PMIB_IPFORWARDROW, |
| ) -> DWORD; |
| pub fn NotifyAddrChange( |
| Handle: PHANDLE, |
| overlapped: LPOVERLAPPED, |
| ) -> DWORD; |
| pub fn NotifyRouteChange( |
| Handle: PHANDLE, |
| overlapped: LPOVERLAPPED, |
| ) -> DWORD; |
| pub fn CancelIPChangeNotify( |
| notifyOverlapped: LPOVERLAPPED |
| ) -> BOOL; |
| pub fn GetAdapterIndex( |
| AdapterName: LPWSTR, |
| IfIndex: PULONG, |
| ) -> DWORD; |
| pub fn AddIPAddress( |
| Address: IPAddr, |
| IpMask: IPMask, |
| IfIndex: DWORD, |
| NTEContext: PULONG, |
| NTEInstance: PULONG, |
| ) -> DWORD; |
| pub fn DeleteIPAddress( |
| NTEContext: ULONG, |
| ) -> DWORD; |
| pub fn GetNetworkParams( |
| pFixedInfo: PFIXED_INFO, |
| pOutBufLen: PULONG, |
| ) -> DWORD; |
| pub fn GetAdaptersInfo( |
| AdapterInfo: PIP_ADAPTER_INFO, |
| SizePointer: PULONG, |
| ) -> ULONG; |
| pub fn GetAdapterOrderMap() -> PIP_ADAPTER_ORDER_MAP; |
| pub fn GetAdaptersAddresses( |
| Family: ULONG, |
| Flags: ULONG, |
| Reserved: PVOID, |
| AdapterAddresses: PIP_ADAPTER_ADDRESSES, |
| SizePointer: PULONG, |
| ) -> ULONG; |
| pub fn GetPerAdapterInfo( |
| IfIndex: ULONG, |
| pPerAdapterInfo: PIP_PER_ADAPTER_INFO, |
| pOutBufLen: PULONG, |
| ) -> DWORD; |
| } |
| STRUCT!{struct INTERFACE_TIMESTAMP_CAPABILITY_FLAGS { |
| PtpV2OverUdpIPv4EventMsgReceiveHw: BOOLEAN, |
| PtpV2OverUdpIPv4AllMsgReceiveHw: BOOLEAN, |
| PtpV2OverUdpIPv4EventMsgTransmitHw: BOOLEAN, |
| PtpV2OverUdpIPv4AllMsgTransmitHw: BOOLEAN, |
| PtpV2OverUdpIPv6EventMsgReceiveHw: BOOLEAN, |
| PtpV2OverUdpIPv6AllMsgReceiveHw: BOOLEAN, |
| PtpV2OverUdpIPv6EventMsgTransmitHw: BOOLEAN, |
| PtpV2OverUdpIPv6AllMsgTransmitHw: BOOLEAN, |
| AllReceiveHw: BOOLEAN, |
| AllTransmitHw: BOOLEAN, |
| TaggedTransmitHw: BOOLEAN, |
| AllReceiveSw: BOOLEAN, |
| AllTransmitSw: BOOLEAN, |
| TaggedTransmitSw: BOOLEAN, |
| }} |
| pub type PINTERFACE_TIMESTAMP_CAPABILITY_FLAGS = *mut INTERFACE_TIMESTAMP_CAPABILITY_FLAGS; |
| STRUCT!{struct INTERFACE_TIMESTAMP_CAPABILITIES { |
| Version: ULONG, |
| HardwareClockFrequencyHz: ULONG64, |
| CrossTimestamp: BOOLEAN, |
| Reserved1: ULONG64, |
| Reserved2: ULONG64, |
| TimestampFlags: INTERFACE_TIMESTAMP_CAPABILITY_FLAGS, |
| }} |
| pub type PINTERFACE_TIMESTAMP_CAPABILITIES = *mut INTERFACE_TIMESTAMP_CAPABILITIES; |
| STRUCT!{struct INTERFACE_HARDWARE_CROSSTIMESTAMP { |
| Version: ULONG, |
| Flags: ULONG, |
| SystemTimestamp1: ULONG64, |
| HardwareClockTimestamp: ULONG64, |
| SystemTimestamp2: ULONG64, |
| }} |
| pub type PINTERFACE_HARDWARE_CROSSTIMESTAMP = *mut INTERFACE_HARDWARE_CROSSTIMESTAMP; |
| DECLARE_HANDLE!{HIFTIMESTAMPCHANGE, HIFTIMESTAMPCHANGE__} |
| extern "system" { |
| pub fn GetInterfaceCurrentTimestampCapabilities( |
| InterfaceLuid: *const NET_LUID, |
| TimestampCapabilite: PINTERFACE_TIMESTAMP_CAPABILITIES, |
| ) -> DWORD; |
| pub fn GetInterfaceHardwareTimestampCapabilities( |
| InterfaceLuid: *const NET_LUID, |
| TimestampCapabilite: PINTERFACE_TIMESTAMP_CAPABILITIES, |
| ) -> DWORD; |
| pub fn CaptureInterfaceHardwareCrossTimestamp( |
| InterfaceLuid: *const NET_LUID, |
| CrossTimestamp: PINTERFACE_HARDWARE_CROSSTIMESTAMP, |
| ) -> DWORD; |
| } |
| FN!{stdcall INTERFACE_TIMESTAMP_CONFIG_CHANGE_CALLBACK( |
| CallerContext: PVOID, |
| ) -> ()} |
| pub type PINTERFACE_TIMESTAMP_CONFIG_CHANGE_CALLBACK = *mut |
| INTERFACE_TIMESTAMP_CONFIG_CHANGE_CALLBACK; |
| extern "system" { |
| pub fn NotifyIfTimestampConfigChange( |
| CallerContext: PVOID, |
| Callback: PINTERFACE_TIMESTAMP_CONFIG_CHANGE_CALLBACK, |
| NotificationHandle: *mut HIFTIMESTAMPCHANGE, |
| ) -> DWORD; |
| pub fn CancelIfTimestampConfigChange( |
| NotificationHandle: HIFTIMESTAMPCHANGE, |
| ); |
| pub fn IpReleaseAddress( |
| AdapterInfo: PIP_ADAPTER_INDEX_MAP, |
| ) -> DWORD; |
| pub fn IpRenewAddress( |
| AdapterInfo: PIP_ADAPTER_INDEX_MAP, |
| ) -> DWORD; |
| pub fn SendARP( |
| DestIP: IPAddr, |
| SrcIP: IPAddr, |
| pMacAddr: PVOID, |
| PhyAddrLen: PULONG, |
| ) -> DWORD; |
| pub fn GetRTTAndHopCount( |
| DestIpAddress: IPAddr, |
| HopCount: PULONG, |
| MaxHops: ULONG, |
| RTT: PULONG, |
| ) -> BOOL; |
| pub fn GetFriendlyIfIndex( |
| IfIndex: DWORD, |
| ) -> DWORD; |
| pub fn EnableRouter( |
| pHandle: *mut HANDLE, |
| pOverlapped: *mut OVERLAPPED, |
| ) -> DWORD; |
| pub fn UnenableRouter( |
| pOverlapped: *mut OVERLAPPED, |
| lpdwEnableCount: LPDWORD, |
| ) -> DWORD; |
| pub fn DisableMediaSense( |
| pHandle: *mut HANDLE, |
| pOverLapped: *mut OVERLAPPED, |
| ) -> DWORD; |
| pub fn RestoreMediaSense( |
| pOverlapped: *mut OVERLAPPED, |
| lpdwEnableCount: LPDWORD, |
| ) -> DWORD; |
| pub fn GetIpErrorString( |
| ErrorCode: IP_STATUS, |
| Buffer: PWSTR, |
| Size: PDWORD, |
| ) -> DWORD; |
| pub fn ResolveNeighbor( |
| NetworkAddress: *mut SOCKADDR, |
| PhysicalAddress: PVOID, |
| PhysicalAddressLength: PULONG, |
| ) -> ULONG; |
| pub fn CreatePersistentTcpPortReservation( |
| StartPort: USHORT, |
| NumberOfPorts: USHORT, |
| Token: PULONG64, |
| ) -> ULONG; |
| pub fn CreatePersistentUdpPortReservation( |
| StartPort: USHORT, |
| NumberOfPorts: USHORT, |
| Token: PULONG64, |
| ) -> ULONG; |
| pub fn DeletePersistentTcpPortReservation( |
| StartPort: USHORT, |
| NumberOfPorts: USHORT, |
| ) -> ULONG; |
| pub fn DeletePersistentUdpPortReservation( |
| StartPort: USHORT, |
| NumberOfPorts: USHORT, |
| ) -> ULONG; |
| pub fn LookupPersistentTcpPortReservation( |
| StartPort: USHORT, |
| NumberOfPorts: USHORT, |
| Token: PULONG64, |
| ) -> ULONG; |
| pub fn LookupPersistentUdpPortReservation( |
| StartPort: USHORT, |
| NumberOfPorts: USHORT, |
| Token: PULONG64, |
| ) -> ULONG; |
| } |
| ENUM!{enum NET_ADDRESS_FORMAT { |
| NET_ADDRESS_FORMAT_UNSPECIFIED = 0, |
| NET_ADDRESS_DNS_NAME = 1, |
| NET_ADDRESS_IPV4 = 2, |
| NET_ADDRESS_IPV6 = 3, |
| }} |
| pub const DNS_MAX_NAME_BUFFER_LENGTH: usize = 256; |
| STRUCT!{struct NET_ADDRESS_INFO_u_s { |
| Address: [WCHAR; DNS_MAX_NAME_BUFFER_LENGTH], |
| Port: [WCHAR; 6], |
| }} |
| UNION!{union NET_ADDRESS_INFO_u { |
| [u32; 131], |
| NamedAddress NamedAddress_mut: NET_ADDRESS_INFO_u_s, |
| Ipv4Address Ipv4Address_mut: SOCKADDR_IN, |
| Ipv6Address Ipv6Address_mut: SOCKADDR_IN6, |
| IpAddress IpAddress_mut: SOCKADDR, |
| }} |
| STRUCT!{struct NET_ADDRESS_INFO { |
| Format: NET_ADDRESS_FORMAT, |
| u: NET_ADDRESS_INFO_u, |
| }} |
| pub type PNET_ADDRESS_INFO = *mut NET_ADDRESS_INFO; |
| extern "system" { |
| // #if defined (_WS2DEF_) && defined (_WS2IPDEF_) && defined(_WINDNS_INCLUDED_) |
| pub fn ParseNetworkString( |
| NetworkString: *const *mut WCHAR, |
| Types: DWORD, |
| AddressInfo: PNET_ADDRESS_INFO, |
| PortNumber: *mut USHORT, |
| PrefixLength: *mut BYTE, |
| ) -> DWORD; |
| } |