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.
351 lines
7.2 KiB
351 lines
7.2 KiB
// Copyright (c) 2001 Microsoft Corporation
|
|
//
|
|
// File: NetworkAdapterConfig.cpp
|
|
//
|
|
// Synopsis: Defines a NetworkAdapterConfig
|
|
// This object has the knowledge for installing
|
|
// using WMI to retrieve network adapter information
|
|
//
|
|
// History: 02/16/2001 JeffJon Created
|
|
|
|
|
|
#include "pch.h"
|
|
|
|
#include "NetworkAdapterConfig.h"
|
|
#include "NetworkInterface.h"
|
|
|
|
|
|
NetworkAdapterConfig::NetworkAdapterConfig() :
|
|
initialized(false),
|
|
nicCount(0),
|
|
localNICIndex(-1)
|
|
{
|
|
LOG_CTOR(NetworkAdapterConfig);
|
|
}
|
|
|
|
|
|
NetworkAdapterConfig::~NetworkAdapterConfig()
|
|
{
|
|
LOG_DTOR(NetworkAdapterConfig);
|
|
|
|
// Free all the NIC info from the vector and reset the count
|
|
|
|
for (NetworkInterfaceContainer::iterator itr = networkInterfaceContainer.begin();
|
|
itr != networkInterfaceContainer.end();
|
|
++itr)
|
|
{
|
|
if (*itr)
|
|
{
|
|
delete *itr;
|
|
}
|
|
}
|
|
networkInterfaceContainer.erase(
|
|
networkInterfaceContainer.begin(),
|
|
networkInterfaceContainer.end());
|
|
|
|
nicCount = 0;
|
|
localNICIndex = 0;
|
|
}
|
|
|
|
|
|
HRESULT
|
|
NetworkAdapterConfig::Initialize()
|
|
{
|
|
LOG_FUNCTION(NetworkAdapterConfig::Initialize);
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
PIP_ADAPTER_INFO pInfo = 0;
|
|
do
|
|
{
|
|
DWORD status = 0;
|
|
ULONG size = 0;
|
|
|
|
while (1)
|
|
{
|
|
status = ::GetAdaptersInfo(pInfo, &size);
|
|
if (ERROR_BUFFER_OVERFLOW != status)
|
|
{
|
|
hr = HRESULT_FROM_WIN32(status);
|
|
break;
|
|
}
|
|
|
|
if (pInfo)
|
|
{
|
|
Win::LocalFree(pInfo);
|
|
pInfo = 0;
|
|
}
|
|
if (0 == size)
|
|
{
|
|
hr = E_FAIL;
|
|
LOG_HRESULT(hr);
|
|
return hr;
|
|
}
|
|
|
|
pInfo = (PIP_ADAPTER_INFO) ::LocalAlloc(LPTR, size);
|
|
if ( NULL == pInfo )
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
LOG_HRESULT(hr);
|
|
return hr;
|
|
}
|
|
}
|
|
|
|
PIP_ADAPTER_INFO current = pInfo;
|
|
while (current)
|
|
{
|
|
|
|
// Create a new network interface based on the adapter info
|
|
|
|
NetworkInterface* newInterface = new NetworkInterface();
|
|
if (!newInterface)
|
|
{
|
|
LOG(L"Failed to create new interface object");
|
|
|
|
current = current->Next;
|
|
continue;
|
|
}
|
|
|
|
hr = newInterface->Initialize(*current);
|
|
if (FAILED(hr))
|
|
{
|
|
LOG(String::format(
|
|
L"Failed to initialize network interface: hr = 0x%1!x!",
|
|
hr));
|
|
|
|
delete newInterface;
|
|
|
|
current = current->Next;
|
|
continue;
|
|
}
|
|
|
|
// Add the new interface to the embedded container
|
|
|
|
AddInterface(newInterface);
|
|
|
|
current = current->Next;
|
|
}
|
|
|
|
} while (false);
|
|
|
|
if (pInfo)
|
|
{
|
|
HRESULT unused = Win::LocalFree(pInfo);
|
|
ASSERT(SUCCEEDED(unused));
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
initialized = true;
|
|
}
|
|
|
|
LOG_HRESULT(hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
void
|
|
NetworkAdapterConfig::AddInterface(NetworkInterface* newInterface)
|
|
{
|
|
LOG_FUNCTION(NetworkAdapterConfig::AddInterface);
|
|
|
|
do
|
|
{
|
|
// verify parameters
|
|
|
|
if (!newInterface)
|
|
{
|
|
ASSERT(newInterface);
|
|
break;
|
|
}
|
|
|
|
// Add the new NIC to the container and increment the count
|
|
|
|
networkInterfaceContainer.push_back(newInterface);
|
|
++nicCount;
|
|
|
|
} while (false);
|
|
}
|
|
|
|
|
|
unsigned int
|
|
NetworkAdapterConfig::GetNICCount() const
|
|
{
|
|
LOG_FUNCTION(NetworkAdapterConfig::GetNICCount);
|
|
|
|
ASSERT(IsInitialized());
|
|
|
|
LOG(String::format(
|
|
L"nicCount = %1!d!",
|
|
nicCount));
|
|
|
|
return nicCount;
|
|
}
|
|
|
|
NetworkInterface*
|
|
NetworkAdapterConfig::GetNIC(unsigned int nicIndex)
|
|
{
|
|
LOG_FUNCTION2(
|
|
NetworkAdapterConfig::GetNIC,
|
|
String::format(
|
|
L"%1!d!",
|
|
nicIndex));
|
|
|
|
ASSERT(IsInitialized());
|
|
|
|
NetworkInterface* nic = 0;
|
|
|
|
if (nicIndex < GetNICCount())
|
|
{
|
|
nic = networkInterfaceContainer[nicIndex];
|
|
}
|
|
|
|
if (!nic)
|
|
{
|
|
LOG(L"Unable to find NIC");
|
|
}
|
|
|
|
return nic;
|
|
}
|
|
|
|
unsigned int
|
|
NetworkAdapterConfig::FindNIC(const String& guid, bool& found) const
|
|
{
|
|
LOG_FUNCTION2(
|
|
NetworkAdapterConfig::FindNIC,
|
|
guid.c_str());
|
|
|
|
unsigned int result = 0;
|
|
found = false;
|
|
|
|
for (unsigned int index = 0;
|
|
index < networkInterfaceContainer.size();
|
|
++index)
|
|
{
|
|
String name = networkInterfaceContainer[index]->GetName();
|
|
if (name.icompare(guid) == 0)
|
|
{
|
|
found = true;
|
|
result = index;
|
|
break;
|
|
}
|
|
}
|
|
|
|
LOG(String::format(
|
|
L"result = %1!d!",
|
|
result));
|
|
return result;
|
|
}
|
|
|
|
NetworkInterface*
|
|
NetworkAdapterConfig::GetNICFromName(const String& name, bool& found)
|
|
{
|
|
LOG_FUNCTION2(
|
|
NetworkAdapterConfig::GetNICFromName,
|
|
name.c_str());
|
|
|
|
found = false;
|
|
|
|
// Default to the first NIC if a match is not found
|
|
|
|
NetworkInterface* nic = networkInterfaceContainer[FindNIC(name, found)];
|
|
|
|
if (!nic ||
|
|
!found)
|
|
{
|
|
LOG(L"NIC not found");
|
|
}
|
|
return nic;
|
|
}
|
|
|
|
void
|
|
NetworkAdapterConfig::SetLocalNIC(
|
|
const NetworkInterface& nic,
|
|
bool setInRegistry)
|
|
{
|
|
LOG_FUNCTION(NetworkAdapterConfig::SetLocalNIC);
|
|
LOG_BOOL(setInRegistry);
|
|
|
|
SetLocalNIC(nic.GetName(), setInRegistry);
|
|
}
|
|
|
|
void
|
|
NetworkAdapterConfig::SetLocalNIC(
|
|
String guid,
|
|
bool setInRegistry)
|
|
{
|
|
LOG_FUNCTION2(
|
|
NetworkAdapterConfig::SetLocalNIC,
|
|
guid.c_str());
|
|
LOG_BOOL(setInRegistry);
|
|
|
|
bool found = false;
|
|
localNICIndex = FindNIC(guid, found);
|
|
|
|
if (found && setInRegistry)
|
|
{
|
|
ASSERT(networkInterfaceContainer[localNICIndex]);
|
|
SetLocalNICInRegistry(*networkInterfaceContainer[localNICIndex]);
|
|
}
|
|
}
|
|
|
|
void
|
|
NetworkAdapterConfig::SetLocalNICInRegistry(const NetworkInterface& nic)
|
|
{
|
|
LOG_FUNCTION2(
|
|
NetworkAdapterConfig::SetLocalNICInRegistry,
|
|
nic.GetName());
|
|
|
|
// Write the GUID into a regkey so that it can be retrieved
|
|
// after reboot
|
|
|
|
if (!SetRegKeyValue(
|
|
CYS_FIRST_DC_REGKEY,
|
|
CYS_FIRST_DC_LOCAL_NIC,
|
|
nic.GetName(),
|
|
HKEY_LOCAL_MACHINE,
|
|
true))
|
|
{
|
|
LOG(L"Failed to set local NIC regkey");
|
|
}
|
|
}
|
|
|
|
NetworkInterface*
|
|
NetworkAdapterConfig::GetLocalNIC()
|
|
{
|
|
LOG_FUNCTION(NetworkAdapterConfig::GetLocalNIC);
|
|
|
|
NetworkInterface* nic = 0;
|
|
|
|
if (localNICIndex >= 0)
|
|
{
|
|
nic = networkInterfaceContainer[localNICIndex];
|
|
}
|
|
else
|
|
{
|
|
// Since the local NIC hasn't been set, we will
|
|
// use the first connected NIC in the list for which
|
|
// we failed to obtain an IP lease
|
|
|
|
for (unsigned int index = 0;
|
|
index < networkInterfaceContainer.size();
|
|
++index)
|
|
{
|
|
nic = networkInterfaceContainer[index];
|
|
if (nic &&
|
|
nic->IsConnected() &&
|
|
!nic->IsDHCPAvailable())
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (nic)
|
|
{
|
|
SetLocalNIC(*nic, true);
|
|
}
|
|
}
|
|
|
|
return nic;
|
|
}
|