/** * This file has no copyright assigned and is placed in the Public Domain. * This file is part of the mingw-w64 runtime package. * No warranty is given; refer to the file DISCLAIMER.PD within this package. */ #ifndef _INC_NETIOAPI #define _INC_NETIOAPI #include <ws2def.h> #include <iprtrmib.h> #include <ifdef.h> #include <ntddndis.h> #ifndef ANY_SIZE #define ANY_SIZE 1 #endif #if (_WIN32_WINNT >= 0x0600) #ifdef __cplusplus extern "C" { #endif #ifdef __IPHLPAPI_H__ #define NETIO_STATUS DWORD #define NETIOAPI_API_ WINAPI #else #define NETIO_STATUS NTSTATUS #define NETIOAPI_API_ NTAPI #endif #define NETIOAPI_API NETIO_STATUS NETIOAPI_API_ #define ConvertInterfaceLuidToName __MINGW_NAME_AW(ConvertInterfaceLuidToName) #define ConvertInterfaceNameToLuid __MINGW_NAME_AW(ConvertInterfaceNameToLuid) typedef enum _MIB_NOTIFICATION_TYPE { MibParameterNotification = 0, MibAddInstance = 1, MibDeleteInstance = 2, MibInitialNotification = 3 } MIB_NOTIFICATION_TYPE, *PMIB_NOTIFICATION_TYPE; typedef struct _MIB_ANYCASTIPADDRESS_ROW { SOCKADDR_INET Address; NET_LUID InterfaceLuid; NET_IFINDEX InterfaceIndex; SCOPE_ID ScopeId; } MIB_ANYCASTIPADDRESS_ROW, *PMIB_ANYCASTIPADDRESS_ROW; typedef struct _MIB_ANYCASTIPADDRESS_TABLE { ULONG NumEntries; MIB_ANYCASTIPADDRESS_ROW Table[ANY_SIZE]; } MIB_ANYCASTIPADDRESS_TABLE, *PMIB_ANYCASTIPADDRESS_TABLE; typedef struct _IP_ADDRESS_PREFIX { SOCKADDR_INET Prefix; UINT8 PrefixLength; } IP_ADDRESS_PREFIX, *PIP_ADDRESS_PREFIX; typedef struct _MIB_IPFORWARD_ROW2 { NET_LUID InterfaceLuid; NET_IFINDEX InterfaceIndex; IP_ADDRESS_PREFIX DestinationPrefix; SOCKADDR_INET NextHop; UCHAR SitePrefixLength; ULONG ValidLifetime; ULONG PreferredLifetime; ULONG Metric; NL_ROUTE_PROTOCOL Protocol; BOOLEAN Loopback; BOOLEAN AutoconfigureAddress; BOOLEAN Publish; BOOLEAN Immortal; ULONG Age; NL_ROUTE_ORIGIN Origin; } MIB_IPFORWARD_ROW2, *PMIB_IPFORWARD_ROW2; typedef struct _MIB_IPNET_ROW2 { SOCKADDR_INET Address; NET_IFINDEX InterfaceIndex; NET_LUID InterfaceLuid; UCHAR PhysicalAddress[IF_MAX_PHYS_ADDRESS_LENGTH]; ULONG PhysicalAddressLength; NL_NEIGHBOR_STATE State; __C89_NAMELESS union { __C89_NAMELESS struct { BOOLEAN IsRouter :1; BOOLEAN IsUnreachable :1; }; UCHAR Flags; }; union { ULONG LastReachable; ULONG LastUnreachable; } ReachabilityTime; } MIB_IPNET_ROW2, *PMIB_IPNET_ROW2; typedef struct _MIB_IPNET_TABLE2 { ULONG NumEntries; MIB_IPNET_ROW2 Table[ANY_SIZE]; } MIB_IPNET_TABLE2, *PMIB_IPNET_TABLE2; typedef struct _MIB_IPFORWARD_TABLE2 { ULONG NumEntries; MIB_IPFORWARD_ROW2 Table[ANY_SIZE]; } MIB_IPFORWARD_TABLE2, *PMIB_IPFORWARD_TABLE2; typedef struct _MIB_IPINTERFACE_ROW { ADDRESS_FAMILY Family; NET_LUID InterfaceLuid; NET_IFINDEX InterfaceIndex; ULONG MaxReassemblySize; ULONG64 InterfaceIdentifier; ULONG MinRouterAdvertisementInterval; ULONG MaxRouterAdvertisementInterval; BOOLEAN AdvertisingEnabled; BOOLEAN ForwardingEnabled; BOOLEAN WeakHostSend; BOOLEAN WeakHostReceive; BOOLEAN UseAutomaticMetric; BOOLEAN UseNeighborUnreachabilityDetection; BOOLEAN ManagedAddressConfigurationSupported; BOOLEAN OtherStatefulConfigurationSupported; BOOLEAN AdvertiseDefaultRoute; NL_ROUTER_DISCOVERY_BEHAVIOR RouterDiscoveryBehavior; ULONG DadTransmits; ULONG BaseReachableTime; ULONG RetransmitTime; ULONG PathMtuDiscoveryTimeout; NL_LINK_LOCAL_ADDRESS_BEHAVIOR LinkLocalAddressBehavior; ULONG LinkLocalAddressTimeout; ULONG ZoneIndices[ScopeLevelCount]; ULONG SitePrefixLength; ULONG Metric; ULONG NlMtu; BOOLEAN Connected; BOOLEAN SupportsWakeUpPatterns; BOOLEAN SupportsNeighborDiscovery; BOOLEAN SupportsRouterDiscovery; ULONG ReachableTime; NL_INTERFACE_OFFLOAD_ROD TransmitOffload; NL_INTERFACE_OFFLOAD_ROD ReceiveOffload; BOOLEAN DisableDefaultRoutes; } MIB_IPINTERFACE_ROW, *PMIB_IPINTERFACE_ROW; typedef struct _MIB_IPINTERFACE_TABLE { ULONG NumEntries; MIB_IPINTERFACE_ROW Table[ANY_SIZE]; } MIB_IPINTERFACE_TABLE, *PMIB_IPINTERFACE_TABLE; typedef struct _MIB_UNICASTIPADDRESS_ROW { SOCKADDR_INET Address; NET_LUID InterfaceLuid; NET_IFINDEX InterfaceIndex; NL_PREFIX_ORIGIN PrefixOrigin; NL_SUFFIX_ORIGIN SuffixOrigin; ULONG ValidLifetime; ULONG PreferredLifetime; UINT8 OnLinkPrefixLength; BOOLEAN SkipAsSource; NL_DAD_STATE DadState; SCOPE_ID ScopeId; LARGE_INTEGER CreationTimeStamp; } MIB_UNICASTIPADDRESS_ROW, *PMIB_UNICASTIPADDRESS_ROW; typedef struct _MIB_UNICASTIPADDRESS_TABLE { ULONG NumEntries; MIB_UNICASTIPADDRESS_ROW Table[ANY_SIZE]; } MIB_UNICASTIPADDRESS_TABLE, *PMIB_UNICASTIPADDRESS_TABLE; typedef struct _MIB_IF_ROW2 { NET_LUID InterfaceLuid; NET_IFINDEX InterfaceIndex; GUID InterfaceGuid; WCHAR Alias[IF_MAX_STRING_SIZE + 1]; WCHAR Description[IF_MAX_STRING_SIZE + 1]; ULONG PhysicalAddressLength; UCHAR PhysicalAddress[IF_MAX_PHYS_ADDRESS_LENGTH]; UCHAR PermanentPhysicalAddress[IF_MAX_PHYS_ADDRESS_LENGTH]; ULONG Mtu; IFTYPE Type; TUNNEL_TYPE TunnelType; NDIS_MEDIUM MediaType; NDIS_PHYSICAL_MEDIUM PhysicalMediumType; NET_IF_ACCESS_TYPE AccessType; NET_IF_DIRECTION_TYPE DirectionType; struct { BOOLEAN HardwareInterface :1; BOOLEAN FilterInterface :1; BOOLEAN ConnectorPresent :1; BOOLEAN NotAuthenticated :1; BOOLEAN NotMediaConnected :1; BOOLEAN Paused :1; BOOLEAN LowPower :1; BOOLEAN EndPointInterface :1; } InterfaceAndOperStatusFlags; IF_OPER_STATUS OperStatus; NET_IF_ADMIN_STATUS AdminStatus; NET_IF_MEDIA_CONNECT_STATE MediaConnectState; NET_IF_NETWORK_GUID NetworkGuid; NET_IF_CONNECTION_TYPE ConnectionType; ULONG64 TransmitLinkSpeed; ULONG64 ReceiveLinkSpeed; ULONG64 InOctets; ULONG64 InUcastPkts; ULONG64 InNUcastPkts; ULONG64 InDiscards; ULONG64 InErrors; ULONG64 InUnknownProtos; ULONG64 InUcastOctets; ULONG64 InMulticastOctets; ULONG64 InBroadcastOctets; ULONG64 OutOctets; ULONG64 OutUcastPkts; ULONG64 OutNUcastPkts; ULONG64 OutDiscards; ULONG64 OutErrors; ULONG64 OutUcastOctets; ULONG64 OutMulticastOctets; ULONG64 OutBroadcastOctets; ULONG64 OutQLen; } MIB_IF_ROW2, *PMIB_IF_ROW2; typedef struct _MIB_IF_TABLE2 { ULONG NumEntries; MIB_IF_ROW2 Table[ANY_SIZE]; } MIB_IF_TABLE2, *PMIB_IF_TABLE2; typedef struct _MIB_IFSTACK_ROW { NET_IFINDEX HigherLayerInterfaceIndex; NET_IFINDEX LowerLayerInterfaceIndex; } MIB_IFSTACK_ROW, *PMIB_IFSTACK_ROW; typedef struct _MIB_IFSTACK_TABLE { ULONG NumEntries; MIB_IFSTACK_ROW Table[ANY_SIZE]; } MIB_IFSTACK_TABLE, *PMIB_IFSTACK_TABLE; typedef struct _MIB_INVERTEDIFSTACK_ROW { NET_IFINDEX LowerLayerInterfaceIndex; NET_IFINDEX HigherLayerInterfaceIndex; } MIB_INVERTEDIFSTACK_ROW, *PMIB_INVERTEDIFSTACK_ROW; typedef struct _MIB_INVERTEDIFSTACK_TABLE { ULONG NumEntries; MIB_INVERTEDIFSTACK_ROW Table[ANY_SIZE]; } MIB_INVERTEDIFSTACK_TABLE, *PMIB_INVERTEDIFSTACK_TABLE; typedef struct _MIB_IPPATH_ROW { SOCKADDR_INET Source; SOCKADDR_INET Destination; NET_LUID InterfaceLuid; NET_IFINDEX InterfaceIndex; SOCKADDR_INET CurrentNextHop; ULONG PathMtu; ULONG RttMean; ULONG RttDeviation; __C89_NAMELESS union { ULONG LastReachable; ULONG LastUnreachable; }; BOOLEAN IsReachable; ULONG64 LinkTransmitSpeed; ULONG64 LinkReceiveSpeed; } MIB_IPPATH_ROW, *PMIB_IPPATH_ROW; typedef struct _MIB_IPPATH_TABLE { ULONG NumEntries; MIB_IPPATH_ROW Table[ANY_SIZE]; } MIB_IPPATH_TABLE, *PMIB_IPPATH_TABLE; typedef struct _MIB_MULTICASTIPADDRESS_ROW { SOCKADDR_INET Address; NET_IFINDEX InterfaceIndex; NET_LUID InterfaceLuid; SCOPE_ID ScopeId; } MIB_MULTICASTIPADDRESS_ROW, *PMIB_MULTICASTIPADDRESS_ROW; typedef struct _MIB_MULTICASTIPADDRESS_TABLE { ULONG NumEntries; MIB_MULTICASTIPADDRESS_ROW Table[ANY_SIZE]; } MIB_MULTICASTIPADDRESS_TABLE, *PMIB_MULTICASTIPADDRESS_TABLE; NETIOAPI_API CancelMibChangeNotify2( HANDLE NotificationHandle ); NETIO_STATUS WINAPI ConvertInterfaceAliasToLuid( const WCHAR *InterfaceAlias, PNET_LUID InterfaceLuid ); NETIO_STATUS WINAPI ConvertInterfaceLuidToNameA( const NET_LUID *InterfaceLuid, PSTR InterfaceName, SIZE_T Length ); NETIO_STATUS WINAPI ConvertInterfaceLuidToNameW( const NET_LUID *InterfaceLuid, PWSTR InterfaceName, SIZE_T Length ); NETIO_STATUS WINAPI ConvertInterfaceNameToLuidA( const CHAR *InterfaceName, PNET_LUID InterfaceLuid ); NETIO_STATUS WINAPI ConvertInterfaceNameToLuidW( const WCHAR *InterfaceName, PNET_LUID InterfaceLuid ); PCHAR WINAPI if_indextoname( NET_IFINDEX InterfaceIndex, PCHAR InterfaceName ); NET_IFINDEX WINAPI if_nametoindex( PCSTR InterfaceName ); NETIO_STATUS WINAPI ConvertInterfaceGuidToLuid( const GUID *InterfaceGuid, PNET_LUID InterfaceLuid ); NETIO_STATUS WINAPI ConvertInterfaceIndexToLuid( NET_IFINDEX InterfaceIndex, PNET_LUID InterfaceLuid ); NETIO_STATUS WINAPI ConvertInterfaceLuidToAlias( const NET_LUID *InterfaceLuid, PWSTR InterfaceAlias, SIZE_T Length ); NETIO_STATUS WINAPI ConvertInterfaceLuidToGuid( const NET_LUID *InterfaceLuid, GUID *InterfaceGuid ); NETIO_STATUS WINAPI ConvertInterfaceLuidToIndex( const NET_LUID *InterfaceLuid, PNET_IFINDEX InterfaceIndex ); NETIO_STATUS WINAPI ConvertIpv4MaskToLength( ULONG Mask, PUINT8 MaskLength ); NETIO_STATUS WINAPI ConvertLengthToIpv4Mask( ULONG MaskLength, PULONG Mask ); NETIOAPI_API CreateAnycastIpAddressEntry( const MIB_ANYCASTIPADDRESS_ROW *Row ); NETIOAPI_API CreateIpForwardEntry2( const MIB_IPFORWARD_ROW2 *Row ); NETIOAPI_API GetIpNetTable2( ADDRESS_FAMILY Family, PMIB_IPNET_TABLE2 *Table ); NETIOAPI_API GetIpNetEntry2( PMIB_IPNET_ROW2 Row ); NETIOAPI_API CreateIpNetEntry2( const MIB_IPNET_ROW2 *Row ); NETIOAPI_API CreateSortedAddressPairs( const PSOCKADDR_IN6 SourceAddressList, ULONG SourceAddressCount, const PSOCKADDR_IN6 DestinationAddressList, ULONG DestinationAddressCount, ULONG AddressSortOptions, PSOCKADDR_IN6_PAIR *SortedAddressPairList, ULONG *SortedAddressPairCount ); NETIOAPI_API CreateIpNetEntry2( const MIB_IPNET_ROW2 *Row ); NETIOAPI_API CreateUnicastIpAddressEntry( const MIB_UNICASTIPADDRESS_ROW *Row ); NETIOAPI_API DeleteIpForwardEntry2( const MIB_IPFORWARD_ROW2 *Row ); NETIOAPI_API GetIpForwardTable2( ADDRESS_FAMILY Family, PMIB_IPFORWARD_TABLE2 *Table ); VOID NETIOAPI_API_ FreeMibTable( PVOID Memory ); NETIOAPI_API DeleteIpNetEntry2( const MIB_IPNET_ROW2 *Row ); NETIOAPI_API GetIpNetTable2( ADDRESS_FAMILY Family, PMIB_IPNET_TABLE2 *Table ); NETIOAPI_API DeleteUnicastIpAddressEntry( const MIB_UNICASTIPADDRESS_ROW *Row ); NETIOAPI_API GetUnicastIpAddressEntry( PMIB_UNICASTIPADDRESS_ROW Row ); NETIOAPI_API DeleteAnycastIpAddressEntry( const MIB_ANYCASTIPADDRESS_ROW *Row ); NETIOAPI_API FlushIpNetTable2( ADDRESS_FAMILY Family, NET_IFINDEX InterfaceIndex ); NETIOAPI_API FlushIpPathTable( ADDRESS_FAMILY Family ); NETIOAPI_API GetAnycastIpAddressEntry( PMIB_ANYCASTIPADDRESS_ROW Row ); NETIOAPI_API GetAnycastIpAddressTable( ADDRESS_FAMILY Family, PMIB_ANYCASTIPADDRESS_TABLE *Table ); NETIOAPI_API GetBestRoute2( NET_LUID *InterfaceLuid, NET_IFINDEX InterfaceIndex, const SOCKADDR_INET *SourceAddress, const SOCKADDR_INET *DestinationAddress, ULONG AddressSortOptions, PMIB_IPFORWARD_ROW2 BestRoute, SOCKADDR_INET *BestSourceAddress ); NETIOAPI_API GetIfEntry2( PMIB_IF_ROW2 Row ); NETIOAPI_API GetIfTable2( PMIB_IF_TABLE2 *Table ); NETIOAPI_API GetIfStackTable( PMIB_IFSTACK_TABLE *Table ); typedef enum _MIB_IF_TABLE_LEVEL { MibIfTableNormal = 0, MibIfTableRaw = 1 } MIB_IF_TABLE_LEVEL, *PMIB_IF_TABLE_LEVEL; NETIOAPI_API GetIfTable2Ex( MIB_IF_TABLE_LEVEL Level, PMIB_IF_TABLE2 *Table ); NETIOAPI_API GetInvertedIfStackTable( PMIB_INVERTEDIFSTACK_TABLE *Table ); NETIOAPI_API GetIpForwardEntry2( PMIB_IPFORWARD_ROW2 Row ); NETIOAPI_API GetIpInterfaceEntry( PMIB_IPINTERFACE_ROW Row ); NETIOAPI_API GetIpInterfaceTable( ADDRESS_FAMILY Family, PMIB_IPINTERFACE_TABLE *Table ); NETIOAPI_API GetIpNetEntry2( PMIB_IPNET_ROW2 Row ); NETIOAPI_API GetIpPathEntry( PMIB_IPPATH_ROW Row ); NETIOAPI_API GetIpPathTable( ADDRESS_FAMILY Family, PMIB_IPPATH_TABLE *Table ); NETIOAPI_API GetMulticastIpAddressEntry( PMIB_MULTICASTIPADDRESS_ROW Row ); NETIOAPI_API GetMulticastIpAddressTable( ADDRESS_FAMILY Family, PMIB_MULTICASTIPADDRESS_TABLE *Table ); NETIOAPI_API GetTeredoPort( USHORT *Port ); typedef void (WINAPI *PTEREDO_PORT_CHANGE_CALLBACK)(void* callerContext, USHORT Port, MIB_NOTIFICATION_TYPE type); NETIOAPI_API NotifyTeredoPortChange( PTEREDO_PORT_CHANGE_CALLBACK Callback, PVOID CallerContext, BOOLEAN InitialNotification, HANDLE *NotificationHandle ); typedef void (WINAPI *PSTABLE_UNICAST_IPADDRESS_TABLE_CALLBACK)(void* callerContext, MIB_UNICASTIPADDRESS_TABLE *AddressTable); NETIOAPI_API NotifyStableUnicastIpAddressTable( ADDRESS_FAMILY Family, PMIB_UNICASTIPADDRESS_TABLE *Table, PSTABLE_UNICAST_IPADDRESS_TABLE_CALLBACK CallerCallback, PVOID CallerContext, HANDLE *NotificationHandle ); typedef void (WINAPI *PUNICAST_IPADDRESS_CHANGE_CALLBACK)(void* callerContext, PMIB_UNICASTIPADDRESS_ROW row, MIB_NOTIFICATION_TYPE type); NETIOAPI_API NotifyUnicastIpAddressChange( ADDRESS_FAMILY Family, PUNICAST_IPADDRESS_CHANGE_CALLBACK Callback, PVOID CallerContext, BOOLEAN InitialNotification, HANDLE *NotificationHandle ); NETIOAPI_API GetUnicastIpAddressTable( ADDRESS_FAMILY Family, PMIB_UNICASTIPADDRESS_TABLE *Table ); typedef VOID (*PIPINTERFACE_CHANGE_CALLBACK) ( PVOID CallerContext, PMIB_IPINTERFACE_ROW Row, MIB_NOTIFICATION_TYPE NotificationType ); NETIOAPI_API NotifyIpInterfaceChange( ADDRESS_FAMILY Family, PIPINTERFACE_CHANGE_CALLBACK Callback, PVOID CallerContext, BOOLEAN InitialNotification, HANDLE *NotificationHandle ); typedef LPVOID PIPFORWARD_CHANGE_CALLBACK; NETIOAPI_API NotifyRouteChange2( ADDRESS_FAMILY Family, PIPFORWARD_CHANGE_CALLBACK Callback, PVOID CallerContext, BOOLEAN InitialNotification, HANDLE *NotificationHandle ); NETIOAPI_API ResolveIpNetEntry2( PMIB_IPNET_ROW2 Row, const SOCKADDR_INET *SourceAddress ); NETIOAPI_API SetIpForwardEntry2( const MIB_IPFORWARD_ROW2 *Route ); NETIOAPI_API SetIpInterfaceEntry( PMIB_IPINTERFACE_ROW Row ); NETIOAPI_API SetIpNetEntry2( PMIB_IPNET_ROW2 Row ); NETIOAPI_API SetUnicastIpAddressEntry( const MIB_UNICASTIPADDRESS_ROW *Row ); #ifdef __cplusplus } #endif #endif /*(_WIN32_WINNT >= 0x0600)*/ #endif /*_INC_NETIOAPI*/