📄 iphlpapi_main.c
字号:
DWORD WINAPI GetTcpTable(PMIB_TCPTABLE pTcpTable, PDWORD pdwSize, BOOL bOrder)
{
DWORD ret;
TRACE("pTcpTable %p, pdwSize %p, bOrder %ld\n", pTcpTable, pdwSize,
(DWORD)bOrder);
if (!pdwSize)
ret = ERROR_INVALID_PARAMETER;
else {
DWORD numEntries = getNumTcpEntries();
ULONG size = sizeof(MIB_TCPTABLE) + (numEntries - 1) * sizeof(MIB_TCPROW);
if (!pTcpTable || *pdwSize < size) {
*pdwSize = size;
ret = ERROR_INSUFFICIENT_BUFFER;
}
else {
PMIB_TCPTABLE table = getTcpTable();
if (table) {
size = sizeof(MIB_TCPTABLE) + (table->dwNumEntries - 1) *
sizeof(MIB_TCPROW);
if (*pdwSize < size) {
*pdwSize = size;
ret = ERROR_INSUFFICIENT_BUFFER;
}
else {
memcpy(pTcpTable, table, size);
if (bOrder)
qsort(pTcpTable->table, pTcpTable->dwNumEntries,
sizeof(MIB_TCPROW), TcpTableSorter);
ret = NO_ERROR;
}
free(table);
}
else
ret = ERROR_OUTOFMEMORY;
}
}
TRACE("returning %ld\n", ret);
return ret;
}
/******************************************************************
* GetUdpStatisticsEx (IPHLPAPI.@)
*
*
* PARAMS
*
* pStats [In/Out]
* dwFamily [In]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI GetUdpStatisticsEx(PMIB_UDPSTATS pStats, DWORD dwFamily)
{
DWORD ret;
TRACE("pStats %p\n", pStats);
ret = getUDPStats(pStats, dwFamily);
TRACE("returning %ld\n", ret);
return ret;
}
/******************************************************************
* GetUdpStatistics (IPHLPAPI.@)
*
*
* PARAMS
*
* pStats [In/Out]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI GetUdpStatistics(PMIB_UDPSTATS pStats)
{
return GetUdpStatisticsEx(pStats, PF_INET);
}
static int UdpTableSorter(const void *a, const void *b)
{
int ret;
if (a && b) {
PMIB_UDPROW rowA = (PMIB_UDPROW)a, rowB = (PMIB_UDPROW)b;
ret = rowA->dwLocalAddr - rowB->dwLocalAddr;
if (ret == 0)
ret = rowA->dwLocalPort - rowB->dwLocalPort;
}
else
ret = 0;
return ret;
}
/******************************************************************
* GetUdpTable (IPHLPAPI.@)
*
*
* PARAMS
*
* pUdpTable [In/Out]
* pdwSize [In/Out]
* bOrder [In]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI GetUdpTable(PMIB_UDPTABLE pUdpTable, PDWORD pdwSize, BOOL bOrder)
{
DWORD ret;
TRACE("pUdpTable %p, pdwSize %p, bOrder %ld\n", pUdpTable, pdwSize,
(DWORD)bOrder);
if (!pdwSize)
ret = ERROR_INVALID_PARAMETER;
else {
DWORD numEntries = getNumUdpEntries();
ULONG size = sizeof(MIB_UDPTABLE) + (numEntries - 1) * sizeof(MIB_UDPROW);
if (!pUdpTable || *pdwSize < size) {
*pdwSize = size;
ret = ERROR_INSUFFICIENT_BUFFER;
}
else {
PMIB_UDPTABLE table = getUdpTable();
if (table) {
size = sizeof(MIB_UDPTABLE) + (table->dwNumEntries - 1) *
sizeof(MIB_UDPROW);
if (*pdwSize < size) {
*pdwSize = size;
ret = ERROR_INSUFFICIENT_BUFFER;
}
else {
memcpy(pUdpTable, table, size);
if (bOrder)
qsort(pUdpTable->table, pUdpTable->dwNumEntries,
sizeof(MIB_UDPROW), UdpTableSorter);
ret = NO_ERROR;
}
free(table);
}
else
ret = ERROR_OUTOFMEMORY;
}
}
TRACE("returning %ld\n", ret);
return ret;
}
/******************************************************************
* GetUniDirectionalAdapterInfo (IPHLPAPI.@)
*
*
* PARAMS
*
* pIPIfInfo [In/Out]
* dwOutBufLen [In/Out]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI GetUniDirectionalAdapterInfo(PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS pIPIfInfo, PULONG dwOutBufLen)
{
TRACE("pIPIfInfo %p, dwOutBufLen %p\n", pIPIfInfo, dwOutBufLen);
/* a unidirectional adapter?? not bloody likely! */
return ERROR_NOT_SUPPORTED;
}
/******************************************************************
* IpReleaseAddress (IPHLPAPI.@)
*
*
* PARAMS
*
* AdapterInfo [In/Out]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI IpReleaseAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo)
{
TRACE("AdapterInfo %p\n", AdapterInfo);
/* not a stub, never going to support this (and I never mark an adapter as
DHCP enabled, see GetAdaptersInfo, so this should never get called) */
return ERROR_NOT_SUPPORTED;
}
/******************************************************************
* IpRenewAddress (IPHLPAPI.@)
*
*
* PARAMS
*
* AdapterInfo [In/Out]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI IpRenewAddress(PIP_ADAPTER_INDEX_MAP AdapterInfo)
{
TRACE("AdapterInfo %p\n", AdapterInfo);
/* not a stub, never going to support this (and I never mark an adapter as
DHCP enabled, see GetAdaptersInfo, so this should never get called) */
return ERROR_NOT_SUPPORTED;
}
/******************************************************************
* NotifyAddrChange (IPHLPAPI.@)
*
*
* PARAMS
*
* Handle [In/Out]
* overlapped [In/Out]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI NotifyAddrChange(PHANDLE Handle, LPOVERLAPPED overlapped)
{
TRACE("Handle %p, overlapped %p\n", Handle, overlapped);
FIXME(":stub\n");
/* marking Win2K+ functions not supported */
return ERROR_NOT_SUPPORTED;
}
/******************************************************************
* NotifyRouteChange (IPHLPAPI.@)
*
*
* PARAMS
*
* Handle [In/Out]
* overlapped [In/Out]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI NotifyRouteChange(PHANDLE Handle, LPOVERLAPPED overlapped)
{
TRACE("Handle %p, overlapped %p\n", Handle, overlapped);
FIXME(":stub\n");
/* marking Win2K+ functions not supported */
return ERROR_NOT_SUPPORTED;
}
/******************************************************************
* SendARP (IPHLPAPI.@)
*
*
* PARAMS
*
* DestIP [In]
* SrcIP [In]
* pMacAddr [In/Out]
* PhyAddrLen [In/Out]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI SendARP(IPAddr DestIP, IPAddr SrcIP, PULONG pMacAddr, PULONG PhyAddrLen)
{
TRACE("DestIP 0x%08lx, SrcIP 0x%08lx, pMacAddr %p, PhyAddrLen %p\n", DestIP,
SrcIP, pMacAddr, PhyAddrLen);
FIXME(":stub\n");
/* marking Win2K+ functions not supported */
return ERROR_NOT_SUPPORTED;
}
/******************************************************************
* SetIfEntry (IPHLPAPI.@)
*
*
* PARAMS
*
* pIfRow [In/Out]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI SetIfEntry(PMIB_IFROW pIfRow)
{
TRACE("pIfRow %p\n", pIfRow);
/* this is supposed to set an administratively interface up or down.
Could do SIOCSIFFLAGS and set/clear IFF_UP, but, not sure I want to, and
this sort of down is indistinguishable from other sorts of down (e.g. no
link). */
FIXME(":stub\n");
return ERROR_NOT_SUPPORTED;
}
/******************************************************************
* SetIpForwardEntry (IPHLPAPI.@)
*
*
* PARAMS
*
* pRoute [In/Out]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI SetIpForwardEntry(PMIB_IPFORWARDROW pRoute)
{
return setIpForwardEntry( pRoute );
}
/******************************************************************
* SetIpNetEntry (IPHLPAPI.@)
*
*
* PARAMS
*
* pArpEntry [In/Out]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI SetIpNetEntry(PMIB_IPNETROW pArpEntry)
{
TRACE("pArpEntry %p\n", pArpEntry);
/* same as CreateIpNetEntry here, could use SIOCSARP, not sure I want to */
FIXME(":stub\n");
return (DWORD) 0;
}
/******************************************************************
* SetIpStatistics (IPHLPAPI.@)
*
*
* PARAMS
*
* pIpStats [In/Out]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI SetIpStatistics(PMIB_IPSTATS pIpStats)
{
TRACE("pIpStats %p\n", pIpStats);
FIXME(":stub\n");
return (DWORD) 0;
}
/******************************************************************
* SetIpTTL (IPHLPAPI.@)
*
*
* PARAMS
*
* nTTL [In]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI SetIpTTL(UINT nTTL)
{
TRACE("nTTL %d\n", nTTL);
/* could echo nTTL > /proc/net/sys/net/ipv4/ip_default_ttl, not sure I
want to. Could map EACCESS to ERROR_ACCESS_DENIED, I suppose */
FIXME(":stub\n");
return (DWORD) 0;
}
/******************************************************************
* SetTcpEntry (IPHLPAPI.@)
*
*
* PARAMS
*
* pTcpRow [In/Out]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI SetTcpEntry(PMIB_TCPROW pTcpRow)
{
TRACE("pTcpRow %p\n", pTcpRow);
FIXME(":stub\n");
return (DWORD) 0;
}
/******************************************************************
* UnenableRouter (IPHLPAPI.@)
*
*
* PARAMS
*
* pOverlapped [In/Out]
* lpdwEnableCount [In/Out]
*
* RETURNS
*
* DWORD
*
*/
DWORD WINAPI UnenableRouter(OVERLAPPED * pOverlapped, LPDWORD lpdwEnableCount)
{
TRACE("pOverlapped %p, lpdwEnableCount %p\n", pOverlapped, lpdwEnableCount);
FIXME(":stub\n");
/* could echo "0" > /proc/net/sys/net/ipv4/ip_forward, not sure I want to
could map EACCESS to ERROR_ACCESS_DENIED, I suppose
marking Win2K+ functions not supported */
return ERROR_NOT_SUPPORTED;
}
/*
* @unimplemented
*/
DWORD WINAPI GetIpErrorString(IP_STATUS ErrorCode,PWCHAR Buffer,PDWORD Size)
{
FIXME(":stub\n");
return 0L;
}
/*
* @unimplemented
*/
PIP_ADAPTER_ORDER_MAP WINAPI GetAdapterOrderMap(VOID)
{
FIXME(":stub\n");
return 0L;
}
/*
* @unimplemented
*/
DWORD WINAPI GetAdaptersAddresses(ULONG Family,DWORD Flags,PVOID Reserved,PIP_ADAPTER_ADDRESSES pAdapterAddresses,PULONG pOutBufLen)
{
FIXME(":stub\n");
return 0L;
}
/*
* @unimplemented
*/
BOOL WINAPI CancelIPChangeNotify(LPOVERLAPPED notifyOverlapped)
{
FIXME(":stub\n");
return 0L;
}
/*
* @unimplemented
*/
DWORD WINAPI GetBestInterfaceEx(struct sockaddr *pDestAddr,PDWORD pdwBestIfIndex)
{
FIXME(":stub\n");
return 0L;
}
/*
* @unimplemented
*/
DWORD WINAPI NhpAllocateAndGetInterfaceInfoFromStack(IP_INTERFACE_NAME_INFO **ppTable,PDWORD pdwCount,BOOL bOrder,HANDLE hHeap,DWORD dwFlags)
{
FIXME(":stub\n");
return 0L;
}
/*
* @unimplemented
*/
DWORD WINAPI GetIcmpStatisticsEx(PMIB_ICMP_EX pStats,DWORD dwFamily)
{
FIXME(":stub\n");
return 0L;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -