220 lines
5.5 KiB
C
220 lines
5.5 KiB
C
|
/*
|
||
|
File GuidMap.c
|
||
|
|
||
|
Defines function to map a guid interface name to an unique descriptive
|
||
|
name describing that interface and vice versa.
|
||
|
|
||
|
Paul Mayfield, 8/25/97
|
||
|
|
||
|
Copyright 1997, Microsoft Corporation.
|
||
|
*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
DWORD
|
||
|
NsGetFriendlyNameFromIfName(
|
||
|
IN HANDLE hMprConfig,
|
||
|
IN LPCWSTR pwszName,
|
||
|
OUT LPWSTR pwszBuffer,
|
||
|
IN PDWORD pdwBufSize
|
||
|
)
|
||
|
/*++
|
||
|
Arguments:
|
||
|
|
||
|
hMprConfig - Handle to the MprConfig
|
||
|
pwszName - Buffer holding the Guid Interface Name
|
||
|
pwszBuffer - Buffer to hold the Friendly Interface Name
|
||
|
pdwBufSize - pointer to, size (in Bytes) of the pwszBuffer buffer
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
DWORD dwErr;
|
||
|
|
||
|
if ((pdwBufSize == NULL) || (*pdwBufSize == 0) || (pwszName == NULL))
|
||
|
{
|
||
|
return ERROR_CAN_NOT_COMPLETE;
|
||
|
}
|
||
|
|
||
|
if (g_pwszRouterName is NULL)
|
||
|
{
|
||
|
GUID Guid;
|
||
|
UNICODE_STRING us;
|
||
|
NTSTATUS ntStatus;
|
||
|
|
||
|
//
|
||
|
// If we're operating on the local machine, just use IPHLPAPI
|
||
|
// which works for some ras client interfaces too. The Mpr
|
||
|
// API will fail for all ras client interfaces, but it's
|
||
|
// remotable whereas IPHLPAPI is not.
|
||
|
//
|
||
|
|
||
|
RtlInitUnicodeString(&us, pwszName);
|
||
|
ntStatus = RtlGUIDFromString(&us, &Guid);
|
||
|
if (ntStatus == STATUS_SUCCESS)
|
||
|
{
|
||
|
dwErr = NhGetInterfaceNameFromGuid(
|
||
|
&Guid,
|
||
|
pwszBuffer,
|
||
|
pdwBufSize,
|
||
|
FALSE,
|
||
|
FALSE);
|
||
|
if (dwErr == NO_ERROR)
|
||
|
{
|
||
|
return dwErr;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (hMprConfig == NULL)
|
||
|
{
|
||
|
return ERROR_CAN_NOT_COMPLETE;
|
||
|
}
|
||
|
|
||
|
dwErr = MprConfigGetFriendlyName(hMprConfig,
|
||
|
(LPWSTR)pwszName,
|
||
|
pwszBuffer,
|
||
|
*pdwBufSize);
|
||
|
|
||
|
if(dwErr isnot NO_ERROR)
|
||
|
{
|
||
|
HANDLE hIfHandle;
|
||
|
|
||
|
dwErr = MprConfigInterfaceGetHandle(hMprConfig,
|
||
|
(LPWSTR)pwszName,
|
||
|
&hIfHandle);
|
||
|
|
||
|
if (dwErr is NO_ERROR)
|
||
|
{
|
||
|
wcsncpy(pwszBuffer,
|
||
|
pwszName,
|
||
|
(*pdwBufSize)/sizeof(WCHAR));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
dwErr = ERROR_NO_SUCH_INTERFACE ;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return dwErr;
|
||
|
}
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
NsGetIfNameFromFriendlyName(
|
||
|
IN HANDLE hMprConfig,
|
||
|
IN LPCWSTR pwszName,
|
||
|
OUT LPWSTR pwszBuffer,
|
||
|
IN PDWORD pdwBufSize
|
||
|
)
|
||
|
/*++
|
||
|
Arguments:
|
||
|
|
||
|
hMprConfig - Handle to the MprConfig
|
||
|
pwszName - Buffer holding the Friendly Interface Name
|
||
|
pwszBuffer - Buffer to hold the Guid Interface Name
|
||
|
pdwBufSize - pointer to, size (in Bytes) of the pwszBuffer buffer
|
||
|
|
||
|
Return:
|
||
|
NO_ERROR, ERROR_NO_SUCH_INTERFACE
|
||
|
--*/
|
||
|
{
|
||
|
DWORD dwErr, i, dwCount, dwTotal, dwSize;
|
||
|
HANDLE hIfHandle;
|
||
|
PMPR_INTERFACE_0 pmi0;
|
||
|
WCHAR wszFriendlyName[MAX_INTERFACE_NAME_LEN+1];
|
||
|
|
||
|
if((hMprConfig == NULL) ||
|
||
|
(pdwBufSize == NULL) ||
|
||
|
(*pdwBufSize == 0))
|
||
|
{
|
||
|
return ERROR_CAN_NOT_COMPLETE;
|
||
|
}
|
||
|
|
||
|
// First try to map a friendly name to a GUID name
|
||
|
|
||
|
dwErr = MprConfigGetGuidName(hMprConfig,
|
||
|
(LPWSTR)pwszName,
|
||
|
pwszBuffer,
|
||
|
*pdwBufSize);
|
||
|
|
||
|
if (dwErr isnot ERROR_NOT_FOUND)
|
||
|
{
|
||
|
return dwErr;
|
||
|
}
|
||
|
|
||
|
// Next see if the friendly name is the same as an interface name
|
||
|
|
||
|
dwErr = MprConfigInterfaceGetHandle(hMprConfig,
|
||
|
(LPWSTR)pwszName,
|
||
|
&hIfHandle);
|
||
|
|
||
|
if (dwErr is NO_ERROR)
|
||
|
{
|
||
|
wcsncpy(pwszBuffer,
|
||
|
pwszName,
|
||
|
(*pdwBufSize)/sizeof(WCHAR));
|
||
|
}
|
||
|
|
||
|
if (dwErr isnot ERROR_NO_SUCH_INTERFACE)
|
||
|
{
|
||
|
return dwErr;
|
||
|
}
|
||
|
|
||
|
// Exact match failed, try a longest match by enumerating
|
||
|
// all interfaces and comparing friendly names (yes this
|
||
|
// can be slow, but I can't think of any other way offhand
|
||
|
// to allow interface names to be abbreviated)
|
||
|
|
||
|
dwErr = MprConfigInterfaceEnum( hMprConfig,
|
||
|
0,
|
||
|
(LPBYTE*) &pmi0,
|
||
|
(DWORD) -1,
|
||
|
&dwCount,
|
||
|
&dwTotal,
|
||
|
NULL );
|
||
|
|
||
|
if (dwErr isnot NO_ERROR)
|
||
|
{
|
||
|
return dwErr;
|
||
|
}
|
||
|
|
||
|
dwErr = ERROR_NO_SUCH_INTERFACE;
|
||
|
|
||
|
for (i=0; i<dwCount; i++)
|
||
|
{
|
||
|
DWORD dwRet;
|
||
|
|
||
|
// Get interface friendly name
|
||
|
|
||
|
dwSize = sizeof(wszFriendlyName);
|
||
|
|
||
|
dwRet = NsGetFriendlyNameFromIfName( hMprConfig,
|
||
|
pmi0[i].wszInterfaceName,
|
||
|
wszFriendlyName,
|
||
|
&dwSize );
|
||
|
|
||
|
if(dwRet is NO_ERROR)
|
||
|
{
|
||
|
//
|
||
|
// Check for substring match
|
||
|
//
|
||
|
|
||
|
if (MatchToken( pwszName, wszFriendlyName))
|
||
|
{
|
||
|
wcsncpy(pwszBuffer,
|
||
|
pmi0[i].wszInterfaceName,
|
||
|
(*pdwBufSize)/sizeof(WCHAR));
|
||
|
|
||
|
dwErr = NO_ERROR;
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
MprConfigBufferFree(pmi0);
|
||
|
|
||
|
return dwErr;
|
||
|
}
|