334 lines
7.6 KiB
C
334 lines
7.6 KiB
C
//=============================================================================
|
|
// 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;
|
|
}
|