//============================================================================= // Copyright (c) Microsoft Corporation // Abstract: // This module implements ifindex-name conversion functions. //============================================================================= #include "precomp.h" #pragma hdrstop #define MAX_FRIENDLY_NAME_LENGTH 2000 HANDLE g_hMprConfig = INVALID_HANDLE_VALUE; DWORD Connect() { return MprConfigServerConnect(NULL, &g_hMprConfig); } VOID Disconnect() { MprConfigServerDisconnect(g_hMprConfig); g_hMprConfig = INVALID_HANDLE_VALUE; } DWORD MapAdapterNameToFriendlyName( IN PWCHAR pwszMachine, IN LPSTR AdapterName, IN PIP_ADAPTER_ADDRESSES pAdapterInfo, OUT PWCHAR *ppwszFriendlyName ) /*++ Routine Description: Maps an adapter GUID to an interface friendly name. This is IPv4/IPv6 agnostic. Arguments: AdapterName - Supplies an adapter GUID. ppwszFriendlyName - Receives a pointer to a static buffer containing the interface friendly name. --*/ { PIP_ADAPTER_ADDRESSES pIf; for (pIf = pAdapterInfo; pIf; pIf = pIf->Next) { if (!strcmp(AdapterName, pIf->AdapterName)) { *ppwszFriendlyName = pIf->FriendlyName; return NO_ERROR; } } return ERROR_NOT_FOUND; } #define GUID_FORMAT_A "{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}" VOID ConvertGuidToStringA( IN GUID *pGuid, OUT PCHAR pszBuffer ) { sprintf(pszBuffer, GUID_FORMAT_A, pGuid->Data1, pGuid->Data2, pGuid->Data3, pGuid->Data4[0], pGuid->Data4[1], pGuid->Data4[2], pGuid->Data4[3], pGuid->Data4[4], pGuid->Data4[5], pGuid->Data4[6], pGuid->Data4[7]); } DWORD MapGuidToFriendlyName( IN PWCHAR pwszMachine, IN GUID *pGuid, IN PIP_ADAPTER_ADDRESSES pAdapterInfo, OUT PWCHAR *ppwszFriendlyName ) { CHAR szBuffer[80]; ConvertGuidToStringA(pGuid, szBuffer); return MapAdapterNameToFriendlyName(pwszMachine, szBuffer, pAdapterInfo, ppwszFriendlyName); } DWORD MapFriendlyNameToAdapterName( IN PWCHAR pwszMachine, IN PWCHAR pwszFriendlyName, IN PIP_ADAPTER_ADDRESSES pAdapterInfo, OUT LPSTR *AdapterName ) /*++ Routine Description: Maps an interface friendly name to an adapter GUID. This is IPv4/IPv6 agnostic. Arguments: pwszFriendlyName - Supplies an interface friendly name. pAdapterInfo - Supplies info obtained from GetAdaptersAddresses(). AdapterName - Receives a pointer to a static buffer containing the adapter GUID. --*/ { PIP_ADAPTER_ADDRESSES pIf; // // First look for an exact match. // for (pIf = pAdapterInfo; pIf; pIf = pIf->Next) { if (!_wcsicmp(pwszFriendlyName, pIf->FriendlyName)) { *AdapterName = pIf->AdapterName; return NO_ERROR; } } // // Then look for a partial match. // for (pIf = pAdapterInfo; pIf; pIf = pIf->Next) { if (!_wcsnicmp(pwszFriendlyName, pIf->FriendlyName, wcslen(pwszFriendlyName))) { *AdapterName = pIf->AdapterName; return NO_ERROR; } } return ERROR_NOT_FOUND; } DWORD MapAdapterNameToIfIndex( IN LPSTR AdapterName, IN PIP_ADAPTER_ADDRESSES pAdapterInfo, IN DWORD dwFamily, OUT DWORD *pdwIfIndex ) /*++ Routine Description: Maps an adapter GUID to an interface index. This is IPv4/IPv6 specific, since each has a separate ifindex. Arguments: AdapterName - Supplies an adapter GUID. pAdapterInfo - Supplies info obtained from GetAdaptersAddresses(). dwFamily - Supplies the protocol for which an ifindex is needed. pdwIfIndex - Receives the ifindex value. --*/ { PIP_ADAPTER_ADDRESSES pIf; for (pIf=pAdapterInfo; pIf; pIf=pIf->Next) { if (!strcmp(pIf->AdapterName, AdapterName)) { break; } } if (!pIf) { *pdwIfIndex = 0; return ERROR_NOT_FOUND; } *pdwIfIndex = (dwFamily == AF_INET6)? pIf->Ipv6IfIndex : pIf->IfIndex; return NO_ERROR; } PIP_ADAPTER_ADDRESSES MapIfIndexToAdapter( IN DWORD dwFamily, IN DWORD dwIfIndex, IN PIP_ADAPTER_ADDRESSES pAdapterInfo ) /*++ Routine Description: Maps an interface index to an adapter entry. This is IPv4/IPv6 specific, since each has a separate ifindex. Arguments: dwFamily - Supplies the protocol. dwIfIndex - Supplies the interface index to map. pAdapterInfo - Supplies info obtained from GetAdaptersAddresses(). Returns: Adapter entry if found, NULL if not. --*/ { PIP_ADAPTER_ADDRESSES pIf; for (pIf=pAdapterInfo; pIf; pIf=pIf->Next) { if ((dwFamily == AF_INET) && (pIf->IfIndex == dwIfIndex)) { break; } if ((dwFamily == AF_INET6) && (pIf->Ipv6IfIndex == dwIfIndex)) { break; } } if (!pIf) { return NULL; } return pIf; } LPSTR MapIfIndexToAdapterName( IN DWORD dwFamily, IN DWORD dwIfIndex, IN IP_ADAPTER_ADDRESSES *pAdapterInfo ) /*++ Routine Description: Maps an interface index to an adapter GUID. This is IPv4/IPv6 specific, since each has a separate ifindex. Arguments: dwFamily - Supplies the protocol. dwIfIndex - Supplies the interface index to map. pAdapterInfo - Supplies info obtained from GetAdaptersAddresses(). Returns: Adapter name if found, NULL if not. --*/ { PIP_ADAPTER_ADDRESSES pIf; pIf = MapIfIndexToAdapter(dwFamily, dwIfIndex, pAdapterInfo); return (pIf)? pIf->AdapterName : NULL; } DWORD MapFriendlyNameToIpv6IfIndex( IN PWCHAR pwszFriendlyName, IN PIP_ADAPTER_ADDRESSES pAdapterInfo, OUT DWORD *pdwIfIndex ) /*++ Routine Description: Maps an interface friendly name to an interface index. This is IPv6 specific, since IPv4 and IPv6 have separate ifindexes. Arguments: pwszFriendlyName - Supplies the friendly name to map. pAdapterInfo - Supplies info obtained from GetAdaptersAddresses(). pdwIfIndex - Receives the ifindex value. --*/ { DWORD dwErr, i; LPSTR AdapterName; PWCHAR pwszTemp; // // If string only contains digits, treat it as an IfIndex // if (wcsspn(pwszFriendlyName, L"1234567890") == wcslen(pwszFriendlyName)) { *pdwIfIndex = wcstoul(pwszFriendlyName, NULL, 10); return NO_ERROR; } dwErr = MapFriendlyNameToAdapterName(NULL, pwszFriendlyName, pAdapterInfo, &AdapterName); if (dwErr != NO_ERROR) { return dwErr; } return MapAdapterNameToIfIndex(AdapterName, pAdapterInfo, AF_INET6, pdwIfIndex); } DWORD MapIpv6IfIndexToFriendlyName( IN DWORD dwIfIndex, IN IP_ADAPTER_ADDRESSES *pAdapterInfo, OUT PWCHAR *ppwszFriendlyName ) /*++ Routine Description: Maps an interface index to a friendly name. This is IPv6 specific, since IPv4 and IPv6 have separate ifindexes. Arguments: dwIfIndex - Supplies the ifindex value. pAdapterInfo - Supplies info obtained from GetAdaptersAddresses(). ppwszFriendlyName - Receives a pointer to a static buffer containing the interface friendly name. --*/ { IP_ADAPTER_ADDRESSES *If; for (If=pAdapterInfo; If; If=If->Next) { if (If->Ipv6IfIndex == dwIfIndex) { *ppwszFriendlyName = If->FriendlyName; return NO_ERROR; } } return ERROR_NOT_FOUND; }