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.
277 lines
6.8 KiB
277 lines
6.8 KiB
/*++
|
|
|
|
Copyright (c) 1996-2002 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
lananame.c
|
|
|
|
Abstract:
|
|
|
|
This module contains routines for discovering the Connectoid name
|
|
associated with a netbios LANA number.
|
|
|
|
Author:
|
|
|
|
Charlie Wickham (charlwi) 07-May-2002
|
|
|
|
--*/
|
|
|
|
#define UNICODE 1
|
|
#define _UNICODE 1
|
|
|
|
#include <windows.h>
|
|
|
|
#include <lmcons.h>
|
|
#include <nb30.h>
|
|
#include <msgrutil.h>
|
|
#include <iphlpapi.h>
|
|
#include <objbase.h>
|
|
|
|
#include "clusrtl.h"
|
|
|
|
#define clearncb(x) memset((char *)x,'\0',sizeof(NCB))
|
|
|
|
DWORD
|
|
ClRtlpGetConnectoidNameFromAdapterIndex(
|
|
IN PCLRTL_NET_ADAPTER_ENUM ClusAdapterEnum,
|
|
IN DWORD AdapterIndex,
|
|
OUT LPWSTR * ConnectoidName
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Look through the adapter enum struct for the matching adapter index. If
|
|
found, create a new buffer and copy the connetoid name into it.
|
|
|
|
Arguments:
|
|
|
|
ClusAdapterEnum - pointer to struct describing adapters on the node
|
|
|
|
AdapterIndex - IP's (?) adapter index value
|
|
|
|
ConnectoidName - address of pointer to receive address of new buffer
|
|
|
|
Return Value:
|
|
|
|
appropriate Win32 error code
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD status = ERROR_NOT_FOUND;
|
|
DWORD index;
|
|
LPWSTR cName;
|
|
|
|
PCLRTL_NET_ADAPTER_INFO adapterInfo = ClusAdapterEnum->AdapterList;
|
|
|
|
for ( index = 0; index < ClusAdapterEnum->AdapterCount; ++index ) {
|
|
if ( adapterInfo->Index == AdapterIndex ) {
|
|
//
|
|
// dup the string into a new buffer since we're going to clobber
|
|
// the adapter info at some point.
|
|
//
|
|
cName = LocalAlloc( 0, ( wcslen( adapterInfo->ConnectoidName ) + 1 ) * sizeof(WCHAR) );
|
|
if ( cName == NULL ) {
|
|
return GetLastError();
|
|
}
|
|
|
|
wcscpy( cName, adapterInfo->ConnectoidName );
|
|
*ConnectoidName = cName;
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
adapterInfo = adapterInfo->Next;
|
|
}
|
|
|
|
return status;
|
|
} // ClRtlpGetConnectoidNameFromAdapterIndex
|
|
|
|
DWORD
|
|
ClRtlpGetAdapterIndexFromMacAddress(
|
|
PUCHAR MacAddress,
|
|
DWORD MacAddrLength,
|
|
PIP_ADAPTER_INFO IpAdapterInfo,
|
|
DWORD * AdapterIndex
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
For the specified MAC address, look through IP helper's Adatper Info
|
|
struct and find the matching adapter. Copy its index into AdapterIndex.
|
|
|
|
Arguments:
|
|
|
|
MacAddress - pointer to buffer holding MAC address of NIC.
|
|
|
|
MacAddrLength - length, in bytes, of address in MacAddress
|
|
|
|
IpAdapterInfo - pointer to data returned from IP helper GetAdaptersInfo()
|
|
|
|
AdapterIndex - pointer to DWORD that receives the index (if found)
|
|
|
|
Return Value:
|
|
|
|
appropriate Win32 error code
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD status = ERROR_NOT_FOUND;
|
|
|
|
while ( IpAdapterInfo != NULL ) {
|
|
if ( IpAdapterInfo->AddressLength == MacAddrLength ) {
|
|
if ( memcmp( MacAddress, IpAdapterInfo->Address, MacAddrLength ) == 0 ) {
|
|
*AdapterIndex = IpAdapterInfo->Index;
|
|
return ERROR_SUCCESS;
|
|
}
|
|
}
|
|
|
|
IpAdapterInfo = IpAdapterInfo->Next;
|
|
}
|
|
|
|
return status;
|
|
} // ClRtlpGetAdapterIndexFromMacAddress
|
|
|
|
DWORD
|
|
ClRtlpGetConnectoidNameFromMacAddress(
|
|
PUCHAR MacAddress,
|
|
DWORD MacAddrLength,
|
|
LPWSTR * ConnectoidName,
|
|
PCLRTL_NET_ADAPTER_ENUM ClusAdapterEnum,
|
|
PIP_ADAPTER_INFO IpAdapterInfo
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD status;
|
|
DWORD adapterIndex;
|
|
|
|
//
|
|
// get index from IP helper using MAC address
|
|
//
|
|
status = ClRtlpGetAdapterIndexFromMacAddress(MacAddress,
|
|
MacAddrLength,
|
|
IpAdapterInfo,
|
|
&adapterIndex );
|
|
|
|
if ( status == ERROR_SUCCESS ) {
|
|
status = ClRtlpGetConnectoidNameFromAdapterIndex( ClusAdapterEnum, adapterIndex, ConnectoidName );
|
|
}
|
|
|
|
return status;
|
|
|
|
} // ClRtlpGetConnectoidNameFromMacAddress
|
|
|
|
DWORD
|
|
ClRtlGetConnectoidNameFromLANA(
|
|
IN UCHAR LanaNumber,
|
|
OUT LPWSTR * ConnectoidName
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD status = ERROR_NOT_FOUND;
|
|
NCB ncb;
|
|
|
|
UCHAR nbStatus;
|
|
WORD aStatBufferSize = (WORD)(sizeof(ADAPTER_STATUS));
|
|
UCHAR astatBuffer[ sizeof(ADAPTER_STATUS) ];
|
|
PADAPTER_STATUS adapterStatus = (PADAPTER_STATUS)astatBuffer;
|
|
|
|
PCLRTL_NET_ADAPTER_ENUM clusAdapterEnum = NULL;
|
|
|
|
PIP_ADAPTER_INFO ipAdapterInfo = NULL;
|
|
DWORD ipAdapterInfoSize = 0;
|
|
|
|
//
|
|
// get our home grown list of adapter info. The connectoid name is in here
|
|
// but we can't match it directly to a MAC address. The adapter index is
|
|
// in here which we can match to a structure in IP helper API.
|
|
//
|
|
clusAdapterEnum = ClRtlEnumNetAdapters();
|
|
if ( clusAdapterEnum == NULL ) {
|
|
status = GetLastError();
|
|
goto cleanup;
|
|
}
|
|
|
|
retry_ip_info:
|
|
status = GetAdaptersInfo( ipAdapterInfo, &ipAdapterInfoSize );
|
|
if ( status == ERROR_BUFFER_OVERFLOW ) {
|
|
ipAdapterInfo = LocalAlloc( 0, ipAdapterInfoSize );
|
|
if ( ipAdapterInfo == NULL ) {
|
|
status = GetLastError();
|
|
goto cleanup;
|
|
}
|
|
|
|
goto retry_ip_info;
|
|
}
|
|
else if ( status != ERROR_SUCCESS ) {
|
|
goto cleanup;
|
|
}
|
|
|
|
//
|
|
// clear the NCB and format the remote name appropriately.
|
|
//
|
|
clearncb(&ncb);
|
|
ncb.ncb_callname[0] = '*';
|
|
|
|
NetpNetBiosReset( LanaNumber );
|
|
|
|
ncb.ncb_command = NCBASTAT;
|
|
ncb.ncb_buffer = astatBuffer;
|
|
ncb.ncb_length = aStatBufferSize;
|
|
ncb.ncb_lana_num = LanaNumber;
|
|
nbStatus = Netbios( &ncb );
|
|
|
|
if ( nbStatus == NRC_GOODRET ) {
|
|
status = ClRtlpGetConnectoidNameFromMacAddress(adapterStatus->adapter_address,
|
|
sizeof( adapterStatus->adapter_address ),
|
|
ConnectoidName,
|
|
clusAdapterEnum,
|
|
ipAdapterInfo );
|
|
}
|
|
else {
|
|
status = NetpNetBiosStatusToApiStatus( nbStatus );
|
|
}
|
|
|
|
cleanup:
|
|
if ( clusAdapterEnum != NULL ) {
|
|
ClRtlFreeNetAdapterEnum( clusAdapterEnum );
|
|
}
|
|
|
|
if ( ipAdapterInfo != NULL ) {
|
|
LocalFree( ipAdapterInfo );
|
|
}
|
|
|
|
return status;
|
|
|
|
} // ClRtlGetConnectoidNameFromLANA
|