563 lines
15 KiB
C
563 lines
15 KiB
C
/*++
|
|
|
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
iphlpapi.h
|
|
|
|
Abstract:
|
|
Header file for functions to interact with the IP Stack for MIB-II and
|
|
related functionality
|
|
|
|
--*/
|
|
|
|
#ifndef __IPHLPAPI_H__
|
|
#define __IPHLPAPI_H__
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// IPRTRMIB.H has the definitions of the strcutures used to set and get //
|
|
// information //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include <iprtrmib.h>
|
|
#include <ipexport.h>
|
|
#include <iptypes.h>
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// The GetXXXTable APIs take a buffer and a size of buffer. If the buffer //
|
|
// is not large enough, the APIs return ERROR_INSUFFICIENT_BUFFER and //
|
|
// *pdwSize is the required buffer size //
|
|
// The bOrder is a BOOLEAN, which if TRUE sorts the table according to //
|
|
// MIB-II (RFC XXXX) //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Retrieves the number of interfaces in the system. These include LAN and //
|
|
// WAN interfaces //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetNumberOfInterfaces(
|
|
OUT PDWORD pdwNumIf
|
|
);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Gets the MIB-II ifEntry //
|
|
// The dwIndex field of the MIB_IFROW should be set to the index of the //
|
|
// interface being queried //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetIfEntry(
|
|
IN OUT PMIB_IFROW pIfRow
|
|
);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Gets the MIB-II IfTable //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetIfTable(
|
|
OUT PMIB_IFTABLE pIfTable,
|
|
IN OUT PULONG pdwSize,
|
|
IN BOOL bOrder
|
|
);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Gets the Interface to IP Address mapping //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetIpAddrTable(
|
|
OUT PMIB_IPADDRTABLE pIpAddrTable,
|
|
IN OUT PULONG pdwSize,
|
|
IN BOOL bOrder
|
|
);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Gets the current IP Address to Physical Address (ARP) mapping //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetIpNetTable(
|
|
OUT PMIB_IPNETTABLE pIpNetTable,
|
|
IN OUT PULONG pdwSize,
|
|
IN BOOL bOrder
|
|
);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Gets the IP Routing Table (RFX XXXX) //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetIpForwardTable(
|
|
OUT PMIB_IPFORWARDTABLE pIpForwardTable,
|
|
IN OUT PULONG pdwSize,
|
|
IN BOOL bOrder
|
|
);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Gets TCP Connection/UDP Listener Table //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetTcpTable(
|
|
OUT PMIB_TCPTABLE pTcpTable,
|
|
IN OUT PDWORD pdwSize,
|
|
IN BOOL bOrder
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetUdpTable(
|
|
OUT PMIB_UDPTABLE pUdpTable,
|
|
IN OUT PDWORD pdwSize,
|
|
IN BOOL bOrder
|
|
);
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Gets IP/ICMP/TCP/UDP Statistics //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetIpStatistics(
|
|
OUT PMIB_IPSTATS pStats
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetIpStatisticsEx(
|
|
OUT PMIB_IPSTATS pStats,
|
|
IN DWORD dwFamily
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetIcmpStatistics(
|
|
OUT PMIB_ICMP pStats
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetIcmpStatisticsEx(
|
|
OUT PMIB_ICMP_EX pStats,
|
|
IN DWORD dwFamily
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetTcpStatistics(
|
|
OUT PMIB_TCPSTATS pStats
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetTcpStatisticsEx(
|
|
OUT PMIB_TCPSTATS pStats,
|
|
IN DWORD dwFamily
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetUdpStatistics(
|
|
OUT PMIB_UDPSTATS pStats
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetUdpStatisticsEx(
|
|
OUT PMIB_UDPSTATS pStats,
|
|
IN DWORD dwFamily
|
|
);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Used to set the ifAdminStatus on an interface. The only fields of the //
|
|
// MIB_IFROW that are relevant are the dwIndex (index of the interface //
|
|
// whose status needs to be set) and the dwAdminStatus which can be either //
|
|
// MIB_IF_ADMIN_STATUS_UP or MIB_IF_ADMIN_STATUS_DOWN //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
SetIfEntry(
|
|
IN PMIB_IFROW pIfRow
|
|
);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Used to create, modify or delete a route. In all cases the //
|
|
// dwForwardIfIndex, dwForwardDest, dwForwardMask, dwForwardNextHop and //
|
|
// dwForwardPolicy MUST BE SPECIFIED. Currently dwForwardPolicy is unused //
|
|
// and MUST BE 0. //
|
|
// For a set, the complete MIB_IPFORWARDROW structure must be specified //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
CreateIpForwardEntry(
|
|
IN PMIB_IPFORWARDROW pRoute
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
SetIpForwardEntry(
|
|
IN PMIB_IPFORWARDROW pRoute
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
DeleteIpForwardEntry(
|
|
IN PMIB_IPFORWARDROW pRoute
|
|
);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Used to set the ipForwarding to ON or OFF (currently only ON->OFF is //
|
|
// allowed) and to set the defaultTTL. If only one of the fields needs to //
|
|
// be modified and the other needs to be the same as before the other field //
|
|
// needs to be set to MIB_USE_CURRENT_TTL or MIB_USE_CURRENT_FORWARDING as //
|
|
// the case may be //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
SetIpStatistics(
|
|
IN PMIB_IPSTATS pIpStats
|
|
);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Used to set the defaultTTL. //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
SetIpTTL(
|
|
UINT nTTL
|
|
);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Used to create, modify or delete an ARP entry. In all cases the dwIndex //
|
|
// dwAddr field MUST BE SPECIFIED. //
|
|
// For a set, the complete MIB_IPNETROW structure must be specified //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
CreateIpNetEntry(
|
|
IN PMIB_IPNETROW pArpEntry
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
SetIpNetEntry(
|
|
IN PMIB_IPNETROW pArpEntry
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
DeleteIpNetEntry(
|
|
IN PMIB_IPNETROW pArpEntry
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
FlushIpNetTable(
|
|
IN DWORD dwIfIndex
|
|
);
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Used to create or delete a Proxy ARP entry. The dwIndex is the index of //
|
|
// the interface on which to PARP for the dwAddress. If the interface is //
|
|
// of a type that doesnt support ARP, e.g. PPP, then the call will fail //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
CreateProxyArpEntry(
|
|
IN DWORD dwAddress,
|
|
IN DWORD dwMask,
|
|
IN DWORD dwIfIndex
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
DeleteProxyArpEntry(
|
|
IN DWORD dwAddress,
|
|
IN DWORD dwMask,
|
|
IN DWORD dwIfIndex
|
|
);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Used to set the state of a TCP Connection. The only state that it can be //
|
|
// set to is MIB_TCP_STATE_DELETE_TCB. The complete MIB_TCPROW structure //
|
|
// MUST BE SPECIFIED //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
SetTcpEntry(
|
|
IN PMIB_TCPROW pTcpRow
|
|
);
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetInterfaceInfo(
|
|
IN PIP_INTERFACE_INFO pIfTable,
|
|
OUT PULONG dwOutBufLen
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetUniDirectionalAdapterInfo(OUT PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS pIPIfInfo,
|
|
OUT PULONG dwOutBufLen
|
|
);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Gets the "best" outgoing interface for the specified destination address //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetBestInterface(
|
|
IN IPAddr dwDestAddr,
|
|
OUT PDWORD pdwBestIfIndex
|
|
);
|
|
|
|
#pragma warning(push)
|
|
#pragma warning(disable:4115)
|
|
DWORD
|
|
WINAPI
|
|
GetBestInterfaceEx(
|
|
IN struct sockaddr *pDestAddr,
|
|
OUT PDWORD pdwBestIfIndex
|
|
);
|
|
#pragma warning(pop)
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Gets the best (longest matching prefix) route for the given destination //
|
|
// If the source address is also specified (i.e. is not 0x00000000), and //
|
|
// there are multiple "best" routes to the given destination, the returned //
|
|
// route will be one that goes out over the interface which has an address //
|
|
// that matches the source address //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetBestRoute(
|
|
IN DWORD dwDestAddr,
|
|
IN DWORD dwSourceAddr, OPTIONAL
|
|
OUT PMIB_IPFORWARDROW pBestRoute
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
NotifyAddrChange(
|
|
OUT PHANDLE Handle,
|
|
IN LPOVERLAPPED overlapped
|
|
);
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
NotifyRouteChange(
|
|
OUT PHANDLE Handle,
|
|
IN LPOVERLAPPED overlapped
|
|
);
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetAdapterIndex(
|
|
IN LPWSTR AdapterName,
|
|
OUT 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
|
|
);
|
|
|
|
#ifdef _WINSOCK2API_
|
|
|
|
//
|
|
// The following functions require Winsock2.
|
|
//
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetAdaptersAddresses(
|
|
IN ULONG Family,
|
|
IN DWORD Flags,
|
|
IN PVOID Reserved,
|
|
OUT PIP_ADAPTER_ADDRESSES pAdapterAddresses,
|
|
IN OUT 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
|
|
);
|
|
|
|
BOOL
|
|
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 OPTIONAL
|
|
);
|
|
DWORD
|
|
WINAPI
|
|
DisableMediaSense(
|
|
HANDLE *pHandle,
|
|
OVERLAPPED *pOverLapped
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
RestoreMediaSense(
|
|
OVERLAPPED* pOverlapped,
|
|
LPDWORD lpdwEnableCount OPTIONAL
|
|
);
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetIpErrorString(
|
|
IN IP_STATUS ErrorCode,
|
|
OUT PWCHAR Buffer,
|
|
IN OUT PDWORD Size
|
|
);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif //__IPHLPAPI_H__
|