Leaked source code of windows server 2003
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

// 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;
}