/**
 * 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 __IPHLPAPI_H__
#define __IPHLPAPI_H__

#ifdef __cplusplus
extern "C" {
#endif

#include <iprtrmib.h>
#include <ipexport.h>
#include <iptypes.h>
#include <netioapi.h>
#include <tcpmib.h>
#include <udpmib.h>
#include <tcpestats.h>

  DWORD WINAPI GetNumberOfInterfaces(PDWORD pdwNumIf);
  DWORD WINAPI GetIfEntry(PMIB_IFROW pIfRow);
  DWORD WINAPI GetIfTable(PMIB_IFTABLE pIfTable,PULONG pdwSize,WINBOOL bOrder);
  DWORD WINAPI GetIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable,PULONG pdwSize,WINBOOL bOrder);
  DWORD WINAPI GetIpNetTable(PMIB_IPNETTABLE pIpNetTable,PULONG pdwSize,WINBOOL bOrder);
  DWORD WINAPI GetIpForwardTable(PMIB_IPFORWARDTABLE pIpForwardTable,PULONG pdwSize,WINBOOL bOrder);
  DWORD WINAPI GetTcpTable(PMIB_TCPTABLE pTcpTable,PDWORD pdwSize,WINBOOL bOrder);
  DWORD WINAPI GetUdpTable(PMIB_UDPTABLE pUdpTable,PDWORD pdwSize,WINBOOL bOrder);
  DWORD WINAPI GetIpStatistics(PMIB_IPSTATS pStats);
  DWORD WINAPI GetIpStatisticsEx(PMIB_IPSTATS pStats,DWORD dwFamily);
  DWORD WINAPI GetIcmpStatistics(PMIB_ICMP pStats);
  DWORD WINAPI GetIcmpStatisticsEx(PMIB_ICMP_EX pStats,DWORD dwFamily);
  DWORD WINAPI GetTcpStatistics(PMIB_TCPSTATS pStats);
  DWORD WINAPI GetTcpStatisticsEx(PMIB_TCPSTATS pStats,DWORD dwFamily);
  DWORD WINAPI GetUdpStatistics(PMIB_UDPSTATS pStats);
  DWORD WINAPI GetUdpStatisticsEx(PMIB_UDPSTATS pStats,DWORD dwFamily);
  DWORD WINAPI SetIfEntry(PMIB_IFROW pIfRow);
  DWORD WINAPI CreateIpForwardEntry(PMIB_IPFORWARDROW pRoute);
  DWORD WINAPI SetIpForwardEntry(PMIB_IPFORWARDROW pRoute);
  DWORD WINAPI DeleteIpForwardEntry(PMIB_IPFORWARDROW pRoute);
  DWORD WINAPI SetIpStatistics(PMIB_IPSTATS pIpStats);
  DWORD WINAPI SetIpTTL(UINT nTTL);
  DWORD WINAPI CreateIpNetEntry(PMIB_IPNETROW pArpEntry);
  DWORD WINAPI SetIpNetEntry(PMIB_IPNETROW pArpEntry);
  DWORD WINAPI DeleteIpNetEntry(PMIB_IPNETROW pArpEntry);
  DWORD WINAPI FlushIpNetTable(DWORD dwIfIndex);
  DWORD WINAPI CreateProxyArpEntry(DWORD dwAddress,DWORD dwMask,DWORD dwIfIndex);
  DWORD WINAPI DeleteProxyArpEntry(DWORD dwAddress,DWORD dwMask,DWORD dwIfIndex);
  DWORD WINAPI SetTcpEntry(PMIB_TCPROW pTcpRow);
  DWORD WINAPI GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable,PULONG dwOutBufLen);
  DWORD WINAPI GetUniDirectionalAdapterInfo(PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS pIPIfInfo,PULONG dwOutBufLen);

#ifndef NhpAllocateAndGetInterfaceInfoFromStack_DEFINED
#define NhpAllocateAndGetInterfaceInfoFromStack_DEFINED
  DWORD WINAPI NhpAllocateAndGetInterfaceInfoFromStack(IP_INTERFACE_NAME_INFO **ppTable,PDWORD pdwCount,WINBOOL bOrder,HANDLE hHeap,DWORD dwFlags);
#endif

  DWORD WINAPI GetBestInterface(IPAddr dwDestAddr,PDWORD pdwBestIfIndex);
  DWORD WINAPI GetBestInterfaceEx(struct sockaddr *pDestAddr,PDWORD pdwBestIfIndex);
  DWORD WINAPI GetBestRoute(DWORD dwDestAddr,DWORD dwSourceAddr,PMIB_IPFORWARDROW pBestRoute);
  DWORD WINAPI GetExtendedTcpTable (PVOID pTcpTable,PDWORD pdwSize,BOOL bOrder,ULONG ulAf,TCP_TABLE_CLASS TableClass,ULONG Reserved);
  DWORD WINAPI NotifyAddrChange(PHANDLE Handle,LPOVERLAPPED overlapped);
  DWORD WINAPI NotifyRouteChange(PHANDLE Handle,LPOVERLAPPED overlapped);
  WINBOOL WINAPI CancelIPChangeNotify(LPOVERLAPPED notifyOverlapped);
  DWORD WINAPI GetAdapterIndex(LPWSTR AdapterName,PULONG IfIndex);
  DWORD WINAPI AddIPAddress(IPAddr Address,IPMask IpMask,DWORD IfIndex,PULONG NTEContext,PULONG NTEInstance);
  DWORD WINAPI DeleteIPAddress(ULONG NTEContext);
  DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo,PULONG pOutBufLen);
  DWORD WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo,PULONG pOutBufLen);
  PIP_ADAPTER_ORDER_MAP WINAPI GetAdapterOrderMap(VOID);

#ifdef _WINSOCK2API_
  DWORD WINAPI GetAdaptersAddresses(ULONG Family,DWORD Flags,PVOID Reserved,PIP_ADAPTER_ADDRESSES pAdapterAddresses,PULONG pOutBufLen);
#endif

  DWORD WINAPI GetPerAdapterInfo(ULONG IfIndex,PIP_PER_ADAPTER_INFO pPerAdapterInfo,PULONG pOutBufLen);
  DWORD WINAPI IpReleaseAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo);
  DWORD WINAPI IpRenewAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo);
  DWORD WINAPI SendARP(IPAddr DestIP,IPAddr SrcIP,PULONG pMacAddr,PULONG PhyAddrLen);
  WINBOOL WINAPI GetRTTAndHopCount(IPAddr DestIpAddress,PULONG HopCount,ULONG MaxHops,PULONG RTT);
  DWORD WINAPI GetFriendlyIfIndex(DWORD IfIndex);
  DWORD WINAPI EnableRouter(HANDLE *pHandle,OVERLAPPED *pOverlapped);
  DWORD WINAPI UnenableRouter(OVERLAPPED *pOverlapped,LPDWORD lpdwEnableCount);
  DWORD WINAPI DisableMediaSense(HANDLE *pHandle,OVERLAPPED *pOverLapped);
  DWORD WINAPI RestoreMediaSense(OVERLAPPED *pOverlapped,LPDWORD lpdwEnableCount);
  DWORD WINAPI GetIpErrorString(IP_STATUS ErrorCode,PWCHAR Buffer,PDWORD Size);

DWORD WINAPI GetExtendedUdpTable(
  PVOID pUdpTable,
  PDWORD pdwSize,
  WINBOOL bOrder,
  ULONG ulAf,
  UDP_TABLE_CLASS TableClass,
  ULONG Reserved
);

DWORD WINAPI GetOwnerModuleFromTcp6Entry(
  PMIB_TCP6ROW_OWNER_MODULE pTcpEntry,
  TCPIP_OWNER_MODULE_INFO_CLASS Class,
  PVOID Buffer,
  PDWORD pdwSize
);

DWORD WINAPI GetOwnerModuleFromTcpEntry(
  PMIB_TCPROW_OWNER_MODULE pTcpEntry,
  TCPIP_OWNER_MODULE_INFO_CLASS Class,
  PVOID Buffer,
  PDWORD pdwSize
);

DWORD WINAPI GetOwnerModuleFromUdp6Entry(
  PMIB_UDP6ROW_OWNER_MODULE pUdpEntry,
  TCPIP_OWNER_MODULE_INFO_CLASS Class,
  PVOID Buffer,
  PDWORD pdwSize
);

DWORD WINAPI GetOwnerModuleFromUdpEntry(
  PMIB_UDPROW_OWNER_MODULE pUdpEntry,
  TCPIP_OWNER_MODULE_INFO_CLASS Class,
  PVOID Buffer,
  PDWORD pdwSize
);

#if (_WIN32_WINNT == 0x0502) /* Only with Win2003 SP1 and SP2 */
  WINBOOL WINAPI CancelSecurityHealthChangeNotify(LPOVERLAPPED notifyOverlapped);
#endif /*(_WIN32_WINNT == 0x0502)*/

#if (_WIN32_WINNT >= 0x0600)
#include <windns.h>

typedef enum _NET_ADDRESS_FORMAT {
  NET_ADDRESS_FORMAT_UNSPECIFIED   = 0,
  NET_ADDRESS_DNS_NAME,
  NET_ADDRESS_IPV4,
  NET_ADDRESS_IPV6
} NET_ADDRESS_FORMAT;

typedef struct _NET_ADDRESS_INFO {
  NET_ADDRESS_FORMAT Format;
  __C89_NAMELESS union {
    struct {
      WCHAR Address[DNS_MAX_NAME_BUFFER_LENGTH];
      WCHAR Port[6];
    } NamedAddress;
    SOCKADDR_IN  Ipv4Address;
    SOCKADDR_IN6 Ipv6Address;
    SOCKADDR     IpAddress;
  };
} NET_ADDRESS_INFO, *PNET_ADDRESS_INFO;

ULONG WINAPI GetPerTcp6ConnectionEStats(
  PMIB_TCP6ROW Row,
  TCP_ESTATS_TYPE EstatsType,
  PUCHAR Rw,
  ULONG RwVersion,
  ULONG RwSize,
  PUCHAR Ros,
  ULONG RosVersion,
  ULONG RosSize,
  PUCHAR Rod,
  ULONG RodVersion,
  ULONG RodSize
);

ULONG WINAPI SetPerTcp6ConnectionEStats(
  PMIB_TCP6ROW Row,
  TCP_ESTATS_TYPE EstatsType,
  PUCHAR Rw,
  ULONG RwVersion,
  ULONG RwSize,
  ULONG Offset
);

ULONG WINAPI SetPerTcpConnectionEStats(
    PMIB_TCPROW Row,
    TCP_ESTATS_TYPE EstatsType,
    PUCHAR Rw,
    ULONG RwVersion,
    ULONG RwSize,
    ULONG Offset
);

ULONG WINAPI GetTcp6Table(
  PMIB_TCP6TABLE TcpTable,
  PULONG SizePointer,
  WINBOOL Order
);

ULONG WINAPI GetPerTcpConnectionEStats(
  PMIB_TCPROW Row,
  TCP_ESTATS_TYPE EstatsType,
  PUCHAR Rw,
  ULONG RwVersion,
  ULONG RwSize,
  PUCHAR Ros,
  ULONG RosVersion,
  ULONG RosSize,
  PUCHAR Rod,
  ULONG RodVersion,
  ULONG RodSize
);

ULONG WINAPI GetTcp6Table2(
  PMIB_TCP6TABLE2 TcpTable,
  PULONG SizePointer,
  WINBOOL Order
);

ULONG WINAPI GetTcpTable2(
  PMIB_TCPTABLE2 TcpTable,
  PULONG SizePointer,
  WINBOOL Order
);

ULONG WINAPI GetUdp6Table(
  PMIB_UDP6TABLE Udp6Table,
  PULONG SizePointer,
  WINBOOL Order
);

DWORD WINAPI NotifySecurityHealthChange(
  PHANDLE pHandle,
  LPOVERLAPPED pOverLapped,
  PULONG SecurityHealthFlags
);

ULONG WINAPI ResolveNeighbor(
  SOCKADDR *NetworkAddress,
  PVOID PhysicalAddress,
  PULONG PhysicalAddressLength
);

DWORD WINAPI SetIpStatisticsEx(
  PMIB_IPSTATS pIpStats,
  ULONG Family
);

#endif /*(_WIN32_WINNT >= 0x0600)*/

#ifdef __cplusplus
}
#endif
#endif