Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

132 lines
3.7 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000.
//
// File: I N T E R F A C E T A B L E . C P P
//
// Contents: Builds a mapping from IP addresses to interface guids
//
// Notes:
//
// Author: mbend 7 Feb 2001
//
//----------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "InterfaceTable.h"
#include <winsock2.h>
#include <iphlpapi.h>
CInterfaceTable::CInterfaceTable()
{
}
CInterfaceTable::~CInterfaceTable()
{
}
HRESULT CInterfaceTable::HrInitialize()
{
HRESULT hr = S_OK;
PIP_ADAPTER_INFO pip = NULL;
ULONG ulSize = 0;
GetAdaptersInfo(NULL, &ulSize);
if(ulSize)
{
pip = reinterpret_cast<PIP_ADAPTER_INFO>(malloc(ulSize));
DWORD dwRet = GetAdaptersInfo(pip, &ulSize);
hr = HRESULT_FROM_WIN32(dwRet);
if(SUCCEEDED(hr))
{
PIP_ADAPTER_INFO pipIter = pip;
while(pipIter && SUCCEEDED(hr))
{
wchar_t szAdapter[MAX_ADAPTER_NAME_LENGTH + 4];
wchar_t * pchAdapter = szAdapter;
wchar_t * pchAdapterEnd = szAdapter;
MultiByteToWideChar(CP_ACP, 0, pipIter->AdapterName, -1, szAdapter, MAX_ADAPTER_NAME_LENGTH + 4);
// Make sure it's not an empty string first
if (*pchAdapter)
{
// skip over the '{'
pchAdapter++;
// chop off the '}'
pchAdapterEnd = wcschr(szAdapter, '\0');
if (pchAdapterEnd)
{
pchAdapterEnd--;
*pchAdapterEnd = 0;
}
}
GUID guidInterface;
if (RPC_S_OK == UuidFromString(pchAdapter, &guidInterface))
{
hr = S_OK;
}
else
{
hr = E_FAIL;
}
PIP_ADDR_STRING pipaddr = &pipIter->IpAddressList;
while(pipaddr && SUCCEEDED(hr))
{
InterfaceMapping interfaceMapping;
interfaceMapping.m_guidInterface = guidInterface;
interfaceMapping.m_dwIpAddress = inet_addr(pipaddr->IpAddress.String);
interfaceMapping.m_dwIndex = htonl(pipIter->Index);
if(interfaceMapping.m_dwIpAddress)
{
hr = m_interfaceMappingList.HrPushBack(interfaceMapping);
}
pipaddr = pipaddr->Next;
}
pipIter = pipIter->Next;
}
}
free(pip);
}
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceTable::HrInitialize");
return hr;
}
HRESULT CInterfaceTable::HrMapIpAddressToGuid(DWORD dwIpAddress, GUID & guidInterface)
{
HRESULT hr = S_OK;
ZeroMemory(&guidInterface, sizeof(GUID));
long nCount = m_interfaceMappingList.GetCount();
for(long n = 0; n < nCount; ++n)
{
if(m_interfaceMappingList[n].m_dwIpAddress == dwIpAddress)
{
guidInterface = m_interfaceMappingList[n].m_guidInterface;
break;
}
}
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceTable::HrMapIpAddressToGuid");
return hr;
}
HRESULT CInterfaceTable::HrGetMappingList(InterfaceMappingList & interfaceMappingList)
{
HRESULT hr = S_OK;
interfaceMappingList.Swap(m_interfaceMappingList);
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceTable::HrGetMappingList");
return hr;
}