//+--------------------------------------------------------------------------- // // 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 #include 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(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; }