// File: NetworkAdapterConfig.h // // 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" #define CYS_WBEM_NETWORK_ADAPTER_CLASS L"Win32_NetworkAdapterConfiguration" #define CYS_WBEM_ADAPTER_QUERY \ L"Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE" NetworkAdapterConfig::NetworkAdapterConfig() : initialized(false), nicCount(0) { LOG_CTOR(NetworkAdapterConfig); } NetworkAdapterConfig::~NetworkAdapterConfig() { LOG_DTOR(NetworkAdapterConfig); // Free all the NIC info from the vector and reset the count networkInterfaceVector.erase( networkInterfaceVector.begin(), networkInterfaceVector.end()); nicCount = 0; } HRESULT NetworkAdapterConfig::Initialize() { LOG_FUNCTION(NetworkAdapterConfig::Initialize); HRESULT hr = S_OK; do { // Execute the query to retrieve the Adapter information SmartInterface adapterEnum; hr = ExecQuery( CYS_WBEM_NETWORK_ADAPTER_CLASS, adapterEnum); if (FAILED(hr)) { LOG(String::format( L"Failed to run query: hr = %1!x!", hr)); break; } // Loop through all the adapters retrieving data ULONG itemsReturned = 0; do { itemsReturned = 0; // Get the next adapter from the query IWbemClassObject* tempAdapterObject = 0; SmartInterface adapterObject; hr = adapterEnum->Next( WBEM_INFINITE, 1, &tempAdapterObject, &itemsReturned); if (FAILED(hr)) { LOG(String::format( L"Failed to get the next adapter: hr = %1!x!", hr)); break; } adapterObject.Acquire(tempAdapterObject); if (hr == S_FALSE || itemsReturned == 0) { // No more items break; } // Create a new network interface based on the query results NetworkInterface* newInterface = new NetworkInterface(); if (!newInterface) { LOG( L"Failed to create new interface object from WMI adapter object"); continue; } hr = newInterface->Initialize(adapterObject); if (FAILED(hr)) { LOG(String::format( L"Failed to initialize network interface: hr = 0x%1!x!", hr)); delete newInterface; continue; } // Add the new interface to the embedded container AddInterface(newInterface); } while (itemsReturned > 0); } while (false); 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 vector and increment the count networkInterfaceVector.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()); ASSERT(nicIndex < GetNICCount()); NetworkInterface* nic = networkInterfaceVector[nicIndex]; ASSERT(nic); return *nic; } HRESULT NetworkAdapterConfig::ExecQuery( const String& classType, SmartInterface& enumClassObject) { LOG_FUNCTION2( NetworkAdapterConfig::ExecQuery, classType); HRESULT hr = S_OK; do { // Run the query and get the enumerator SmartInterface spWbemServices; hr = GetWbemServices(spWbemServices); if (FAILED(hr)) { LOG(String::format( L"Failed to get WMI COM object: hr = 0x%1!x!", hr)); break; } IEnumWbemClassObject* tempEnumClassObject = 0; hr = spWbemServices->ExecQuery( AutoBstr(L"WQL"), AutoBstr(CYS_WBEM_ADAPTER_QUERY), WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, 0, &tempEnumClassObject); if (FAILED(hr)) { LOG(String::format( L"Failed to run query: hr = %1!x!", hr)); break; } enumClassObject.Acquire(tempEnumClassObject); } while(false); LOG_HRESULT(hr); return hr; } HRESULT NetworkAdapterConfig::GetWbemServices(SmartInterface& spWbemServices) { LOG_FUNCTION(NetworkAdapterConfig::GetWbemServices); HRESULT hr = S_OK; if (!wbemService) { do { // First we have to initialize the security (this may be // a bug in WMI but we will do it anyway just to be safe) CoInitializeSecurity( 0, -1, 0, 0, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, 0, 0, 0); SmartInterface wbemLocator; hr = wbemLocator.AcquireViaCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER); if (FAILED(hr)) { ASSERT(SUCCEEDED(hr)); LOG(String::format( L"Failed to CoCreate the Wbem Locator: hr = %1!x!", hr)); break; } IWbemServices* tempWbemServices = 0; hr = wbemLocator->ConnectServer( L"root\\CIMV2", 0, // user name 0, // password 0, // locale 0, // security flags, must be zero 0, // authority 0, // wbem context &tempWbemServices); if (FAILED(hr)) { ASSERT(SUCCEEDED(hr)); LOG(String::format( L"Failed to connect to server to get wbemService: hr = %1!x!", hr)); break; } wbemService.Acquire(tempWbemServices); ASSERT(wbemService); } while(false); } spWbemServices = wbemService; LOG_HRESULT(hr); return hr; }