341 lines
7.4 KiB
C
341 lines
7.4 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1999 Microsoft Corporation
|
||
|
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
iphlpwrp.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module contains all of the code to wrap
|
||
|
the ip public help apis for getting the list of
|
||
|
active interfaces on a machine.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
krishnaG
|
||
|
|
||
|
Environment
|
||
|
|
||
|
User Level: Win32
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
abhisheV 30-September-1999
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
PaPNPGetIfTable(
|
||
|
OUT PMIB_IFTABLE * ppMibIfTable
|
||
|
)
|
||
|
{
|
||
|
DWORD dwStatus = 0;
|
||
|
PMIB_IFTABLE pIfTable = NULL;
|
||
|
PMIB_IFTABLE pMibIfTable = NULL;
|
||
|
PIP_INTERFACE_INFO pInterfaceInfo = NULL;
|
||
|
DWORD i = 0;
|
||
|
DWORD j = 0;
|
||
|
DWORD dwNameLen = 0;
|
||
|
|
||
|
dwStatus = AllocateAndGetIfTableFromStack(
|
||
|
&pIfTable,
|
||
|
TRUE,
|
||
|
GetProcessHeap(),
|
||
|
0,
|
||
|
TRUE
|
||
|
);
|
||
|
BAIL_ON_WIN32_ERROR(dwStatus);
|
||
|
|
||
|
pMibIfTable = (PMIB_IFTABLE) LocalAlloc(
|
||
|
LPTR,
|
||
|
sizeof(DWORD)+
|
||
|
sizeof(MIB_IFROW) *
|
||
|
pIfTable->dwNumEntries
|
||
|
);
|
||
|
|
||
|
if (!pMibIfTable) {
|
||
|
dwStatus = ERROR_OUTOFMEMORY;
|
||
|
BAIL_ON_WIN32_ERROR(dwStatus);
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < pIfTable->dwNumEntries; i++) {
|
||
|
memcpy(&(pMibIfTable->table[i]), &(pIfTable->table[i]), sizeof(MIB_IFROW));
|
||
|
}
|
||
|
pMibIfTable->dwNumEntries = pIfTable->dwNumEntries;
|
||
|
|
||
|
// Get the corresponding Interface Information structure here.
|
||
|
|
||
|
dwStatus = PaPNPGetInterfaceInformation(
|
||
|
&pInterfaceInfo
|
||
|
);
|
||
|
BAIL_ON_WIN32_ERROR(dwStatus);
|
||
|
|
||
|
if (!pInterfaceInfo) {
|
||
|
dwStatus = ERROR_OUTOFMEMORY;
|
||
|
BAIL_ON_WIN32_ERROR(dwStatus);
|
||
|
}
|
||
|
|
||
|
for (j = 0; j < pMibIfTable->dwNumEntries; j++) {
|
||
|
for (i = 0; i < (DWORD) pInterfaceInfo->NumAdapters; i++) {
|
||
|
if (pInterfaceInfo->Adapter[i].Index == pMibIfTable->table[j].dwIndex) {
|
||
|
dwNameLen = wcslen((LPTSTR) &pInterfaceInfo->Adapter[i].Name);
|
||
|
wcsncpy(
|
||
|
(LPTSTR)&(pMibIfTable->table[j].wszName),
|
||
|
(LPTSTR)&(pInterfaceInfo->Adapter[i].Name),
|
||
|
dwNameLen
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*ppMibIfTable = pMibIfTable;
|
||
|
|
||
|
cleanup:
|
||
|
|
||
|
if (pIfTable) {
|
||
|
HeapFree(GetProcessHeap(), 0, pIfTable);
|
||
|
}
|
||
|
|
||
|
if (pInterfaceInfo) {
|
||
|
LocalFree(pInterfaceInfo);
|
||
|
}
|
||
|
|
||
|
return (dwStatus);
|
||
|
|
||
|
error:
|
||
|
|
||
|
if (pMibIfTable) {
|
||
|
LocalFree(pMibIfTable);
|
||
|
}
|
||
|
|
||
|
*ppMibIfTable = NULL;
|
||
|
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
PaPNPGetInterfaceInformation(
|
||
|
OUT PIP_INTERFACE_INFO * ppInterfaceInfo
|
||
|
)
|
||
|
{
|
||
|
|
||
|
LPBYTE pBuffer = NULL;
|
||
|
DWORD dwBufferSize = 2048;
|
||
|
DWORD dwStatus = 0;
|
||
|
|
||
|
pBuffer = (LPBYTE) LocalAlloc(
|
||
|
LPTR,
|
||
|
dwBufferSize
|
||
|
);
|
||
|
|
||
|
if (!pBuffer) {
|
||
|
return (ERROR_OUTOFMEMORY);
|
||
|
}
|
||
|
|
||
|
dwStatus = GetInterfaceInfo(
|
||
|
(PIP_INTERFACE_INFO) pBuffer,
|
||
|
&dwBufferSize
|
||
|
);
|
||
|
|
||
|
if (dwStatus == ERROR_INSUFFICIENT_BUFFER) {
|
||
|
|
||
|
if (pBuffer) {
|
||
|
LocalFree(pBuffer);
|
||
|
pBuffer = NULL;
|
||
|
}
|
||
|
|
||
|
pBuffer = (LPBYTE) LocalAlloc(
|
||
|
LPTR,
|
||
|
dwBufferSize
|
||
|
);
|
||
|
|
||
|
if (!pBuffer) {
|
||
|
return (ERROR_OUTOFMEMORY);
|
||
|
}
|
||
|
|
||
|
dwStatus = GetInterfaceInfo(
|
||
|
(PIP_INTERFACE_INFO) pBuffer,
|
||
|
&dwBufferSize
|
||
|
);
|
||
|
|
||
|
if (dwStatus) {
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else if (dwStatus) {
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
*ppInterfaceInfo = (PIP_INTERFACE_INFO) pBuffer;
|
||
|
|
||
|
return (dwStatus);
|
||
|
|
||
|
error:
|
||
|
|
||
|
if (pBuffer) {
|
||
|
LocalFree(pBuffer);
|
||
|
}
|
||
|
|
||
|
return (dwStatus);
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
PrintMibIfTable(
|
||
|
IN PMIB_IFTABLE pMibIfTable
|
||
|
)
|
||
|
{
|
||
|
DWORD dwNumEntries = 0;
|
||
|
DWORD i = 0;
|
||
|
PMIB_IFROW pMibIfRow = NULL;
|
||
|
PMIB_IFROW pCurrentMibIfRow = NULL;
|
||
|
|
||
|
dwNumEntries = pMibIfTable->dwNumEntries;
|
||
|
pMibIfRow = &(pMibIfTable->table[0]);
|
||
|
|
||
|
for (i = 0; i < dwNumEntries; i++) {
|
||
|
|
||
|
pCurrentMibIfRow = pMibIfRow + i;
|
||
|
|
||
|
wprintf(L"Name = %s\n", pCurrentMibIfRow->wszName);
|
||
|
wprintf(L"dwIndex = %d\n", pCurrentMibIfRow->dwIndex);
|
||
|
printf("Description = %s\n", (pCurrentMibIfRow->bDescr));
|
||
|
|
||
|
}
|
||
|
|
||
|
wprintf(L"\n\n");
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
VOID
|
||
|
PrintInterfaceInfo(
|
||
|
IN PIP_INTERFACE_INFO pInterfaceInfo
|
||
|
)
|
||
|
{
|
||
|
DWORD dwNumAdapters = 0;
|
||
|
DWORD i = 0;
|
||
|
PIP_ADAPTER_INDEX_MAP pAdapterIndexMap = NULL;
|
||
|
PIP_ADAPTER_INDEX_MAP pCurrentAdapter = NULL;
|
||
|
|
||
|
dwNumAdapters = pInterfaceInfo->NumAdapters;
|
||
|
pAdapterIndexMap = &(pInterfaceInfo->Adapter[0]);
|
||
|
|
||
|
for (i = 0; i < dwNumAdapters; i++) {
|
||
|
|
||
|
pCurrentAdapter = pAdapterIndexMap + i;
|
||
|
wprintf(
|
||
|
L"Adapter %d Index %d Name %s\n",
|
||
|
i,
|
||
|
pCurrentAdapter->Index,
|
||
|
pCurrentAdapter->Name
|
||
|
);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
PrintMibAddrTable(
|
||
|
IN PMIB_IPADDRTABLE pMibAddrTable
|
||
|
)
|
||
|
{
|
||
|
DWORD dwNumEntries = 0;
|
||
|
DWORD i = 0;
|
||
|
PMIB_IPADDRROW pMibAddrRow = NULL;
|
||
|
PMIB_IPADDRROW pCurrentMibAddrRow = NULL;
|
||
|
|
||
|
dwNumEntries = pMibAddrTable->dwNumEntries;
|
||
|
pMibAddrRow = &(pMibAddrTable->table[0]);
|
||
|
|
||
|
for (i = 0; i < dwNumEntries; i++) {
|
||
|
|
||
|
pCurrentMibAddrRow = pMibAddrRow + i;
|
||
|
|
||
|
wprintf(L"Address = %s\n", pCurrentMibAddrRow->dwAddr);
|
||
|
wprintf(L"dwIndex = %d\n", pCurrentMibAddrRow->dwIndex);
|
||
|
wprintf(L"dwMask = %s\n", pCurrentMibAddrRow->dwMask);
|
||
|
|
||
|
}
|
||
|
wprintf(L"\n\n");
|
||
|
}
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
PaPNPGetIpAddrTable(
|
||
|
OUT PMIB_IPADDRTABLE * ppMibIpAddrTable
|
||
|
)
|
||
|
{
|
||
|
PMIB_IPADDRTABLE pMibIpAddrTable = NULL;
|
||
|
DWORD dwBufferSize = 2048;
|
||
|
DWORD dwStatus = 0;
|
||
|
DWORD dwNameLen = 0;
|
||
|
|
||
|
pMibIpAddrTable = (PMIB_IPADDRTABLE) LocalAlloc(
|
||
|
LPTR,
|
||
|
dwBufferSize
|
||
|
);
|
||
|
if (!pMibIpAddrTable) {
|
||
|
return (ERROR_OUTOFMEMORY);
|
||
|
}
|
||
|
|
||
|
dwStatus = GetIpAddrTable(
|
||
|
(PMIB_IPADDRTABLE) pMibIpAddrTable,
|
||
|
&dwBufferSize,
|
||
|
TRUE
|
||
|
);
|
||
|
|
||
|
if (dwStatus == ERROR_INSUFFICIENT_BUFFER) {
|
||
|
|
||
|
if (pMibIpAddrTable) {
|
||
|
LocalFree(pMibIpAddrTable);
|
||
|
pMibIpAddrTable = NULL;
|
||
|
}
|
||
|
|
||
|
pMibIpAddrTable = (PMIB_IPADDRTABLE) LocalAlloc(
|
||
|
LPTR,
|
||
|
dwBufferSize
|
||
|
);
|
||
|
if (!pMibIpAddrTable) {
|
||
|
return (ERROR_OUTOFMEMORY);
|
||
|
}
|
||
|
|
||
|
dwStatus = GetIpAddrTable(
|
||
|
(PMIB_IPADDRTABLE) pMibIpAddrTable,
|
||
|
&dwBufferSize,
|
||
|
TRUE
|
||
|
);
|
||
|
if (dwStatus) {
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else if (dwStatus) {
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
*ppMibIpAddrTable = pMibIpAddrTable;
|
||
|
|
||
|
return (dwStatus);
|
||
|
|
||
|
error:
|
||
|
|
||
|
*ppMibIpAddrTable = NULL;
|
||
|
|
||
|
if (pMibIpAddrTable) {
|
||
|
LocalFree(pMibIpAddrTable);
|
||
|
}
|
||
|
|
||
|
return (dwStatus);
|
||
|
}
|
||
|
|