// NicName.cpp : Implementation of CNicName #include "stdafx.h" #include "MSSANic.h" #include "NicName.h" #include "Tracing.h" // // Constant data // const WCHAR REGKEY_NETWORK[] = L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}"; const DWORD MAX_REGKEY_VALUE = 1024; // // Private data structures // struct RegData { union { WCHAR wstrValue[MAX_REGKEY_VALUE]; DWORD dwValue; }Contents; }; // // Private non-member functions // static bool FindNICAdaptersRegKey(wstring& wszNicAdaptersRegKey); //+----------------------------------------------------------------------- // // Method: Constructor // // Synopsis: Construct the CNicName object // // History: JKountz 08/19/2000 Created //+----------------------------------------------------------------------- CNicName::CNicName() { // // Load the user friendly Nic information from // the registry. // LoadNicInfo(); } //+----------------------------------------------------------------------- // // Method: Get // // Synopsis: Get the user friendly name for the specified Nic card. // // Arguments: IN bstrPnpDeviceID Plug and Play Device ID for the Nic // card we are lookup up. // // OUT bstrName Receives the user friendly name for // the specified Nic. // // History: JKountz 08/19/2000 Created //+----------------------------------------------------------------------- STDMETHODIMP CNicName::Get(BSTR bstrPnpDeviceID, BSTR *pbstrName) { try { bool bFound = false; vector::iterator it; wstring wstrPNPDeviceID(bstrPnpDeviceID); // // Search the list of NIC // for(it = m_vNicInfo.begin(); it != m_vNicInfo.end(); it++) { // // Does the PnP Device ID match? // if ( 0 == lstrcmpi( wstrPNPDeviceID.c_str(), (*it).m_wstrPNPDeviceID.c_str())) { *pbstrName = ::SysAllocString((*it).m_wstrName.c_str()); bFound = true; } } // // Provide a reasonable alternative if not match was found // if ( !bFound ) { // // BUGBUG: Probably should localize this // *pbstrName = ::SysAllocString(L"Local Network Connection"); } } catch(...) { } return S_OK; } //+----------------------------------------------------------------------- // // Method: Set // // Synopsis: Set the user friendly name for the specified Nic card. // // Arguments: IN bstrPnpDeviceID Plug and Play Device ID for the Nic // card we are lookup up. // // IN bstrName The user friendly name for the // specified Nic. // // History: JKountz 08/19/2000 Created //+----------------------------------------------------------------------- STDMETHODIMP CNicName::Set(BSTR bstrPnpDeviceID, BSTR bstrName) { // // Default return code is invalid PNP Device ID // HRESULT hr = E_INVALIDARG; try { vector::iterator it; wstring wstrPNPDeviceID(bstrPnpDeviceID); // // Search the list of NIC // for(it = m_vNicInfo.begin(); it != m_vNicInfo.end(); it++) { // // Does the PnP Device ID match? // if ( 0 == lstrcmpi( wstrPNPDeviceID.c_str(), (*it).m_wstrPNPDeviceID.c_str())) { (*it).m_wstrName = bstrName; if ( ERROR_SUCCESS == Store(*it)) { hr = S_OK; } } } } catch(...) { } return hr; } //+----------------------------------------------------------------------- // // Method: LoadNicInfo // // Synopsis: Preload the Nic information. We enumerate through the // registry looking for all Nic's. For each Nic we create // an instance of CNicInfo and store it in a vector // class variable. See CNicInfo for more information. // // History: JKountz 08/19/2000 Created //+----------------------------------------------------------------------- void CNicName::LoadNicInfo() { // // Clear the list of Nic's // m_vNicInfo.clear(); // // Locate the Network Adapters REG key. All the Nic's // are listed under this key. // HKEY hkNicAdapters; wstring wstrNicAdaptersRegKey(REGKEY_NETWORK); // // Open the Network Adapters REG key // if ( ERROR_SUCCESS == RegOpenKey( HKEY_LOCAL_MACHINE, wstrNicAdaptersRegKey.c_str(), &hkNicAdapters )) { // // Enumerate all the Nic's // WCHAR wszName[1024]; DWORD dwNicAdapterIndex = 0; while ( ERROR_SUCCESS == RegEnumKey( hkNicAdapters, dwNicAdapterIndex, wszName, (sizeof wszName)/(sizeof wszName[0]))) { HKEY hkNics; DWORD dwNicIndex = 0; wstring wstrNics(wstrNicAdaptersRegKey); wstrNics.append(L"\\"); wstrNics.append(wszName); wstrNics.append(L"\\Connection"); // // Open the Connection sub key. This is where the Pnp Device ID // and user friendly name are stored. // if ( ERROR_SUCCESS == RegOpenKey( HKEY_LOCAL_MACHINE, wstrNics.c_str(), &hkNics )) { DWORD dwRegType; RegData regData; DWORD dwSizeOfRegType = sizeof(regData); DWORD dwSizeOfName = (sizeof wszName)/(sizeof wszName[0]); CNicInfo nicInfo; nicInfo.m_wstrRegKey = wstrNics; DWORD dwNicAttributes = 0; // // Enumerate all the values under Connection. // We are looking for PNPDeviceID and Name which // are both REG_SZ types. // while ( ERROR_SUCCESS == RegEnumValue( hkNics, dwNicIndex, wszName, &dwSizeOfName, 0, &dwRegType, (BYTE*)®Data, &dwSizeOfRegType)) { if ( dwRegType == REG_SZ ) { // // Found the PNP Device ID // if ( lstrcmpi(L"PnpInstanceID", wszName) == 0 ) { nicInfo.m_wstrPNPDeviceID = regData.Contents.wstrValue; dwNicAttributes++; } // // Found the user friendly name // else if ( lstrcmpi(L"Name", wszName) == 0 ) { nicInfo.m_wstrName = regData.Contents.wstrValue; dwNicAttributes++; } } dwNicIndex++; dwSizeOfRegType = sizeof(regData); } // // Did we find both the Pnp Device ID and user friendly name? // if ( dwNicAttributes >= 2 ) { // Save them m_vNicInfo.push_back(nicInfo); } RegCloseKey( hkNics ); } dwNicAdapterIndex++; } // while RegEnumKey ( hkNicAdapters..) RegCloseKey(hkNicAdapters); } return; } //+----------------------------------------------------------------------- // // Method: FindNICAdaptersRegKey // // Synopsis: Locate the Network Adapters REG key. All the Nic info // we need is stored under this key. It is located // below System\CurrentControlSet\Control\Network // // History: JKountz 08/19/2000 Created //+----------------------------------------------------------------------- static bool FindNICAdaptersRegKey(wstring& wszNicAdaptersRegKey) { HKEY hk; bool bRc = false; if ( ERROR_SUCCESS == RegOpenKey( HKEY_LOCAL_MACHINE, REGKEY_NETWORK, &hk )) { DWORD dwIndex = 0; WCHAR wszName[1024]; while ( ERROR_SUCCESS == RegEnumKey( hk, dwIndex, wszName, (sizeof wszName)/(sizeof wszName[0]))) { WCHAR wszValue[1024]; LONG lSizeOfValue = sizeof(wszValue); // // Check the value of this key, we need a value of: Network Adapters // if ( ERROR_SUCCESS == RegQueryValue( hk, wszName, wszValue, &lSizeOfValue) && lstrcmpi(L"Network Adapters", wszValue) == 0 ) { // // Found it // wstring wstrNicAdapters(REGKEY_NETWORK); wstrNicAdapters.append(L"\\"); wstrNicAdapters.append(wszName); wszNicAdaptersRegKey = wstrNicAdapters; bRc = true; } // // Next enumeration element dwIndex++; } RegCloseKey(hk); } return bRc; } //+----------------------------------------------------------------------- // // Method: Store // // Synopsis: Store changes to the user friendly Nic name. // // Arguments: IN CNicInfo which contains the changed state // that needs to be stored. We use the m_wstrRegKey // member of CNicInfo to locate the Nic card that // needs to be updated. // // History: JKountz 08/19/2000 Created //+----------------------------------------------------------------------- DWORD CNicName::Store(CNicInfo &rNicInfo) { DWORD dwRc; HKEY hkNic; dwRc = RegOpenKey( HKEY_LOCAL_MACHINE, rNicInfo.m_wstrRegKey.c_str(), &hkNic ); if ( ERROR_SUCCESS == dwRc) { DWORD dwNameLen; dwNameLen = sizeof(WCHAR)*(lstrlen(rNicInfo.m_wstrName.c_str()) + 1); dwRc = RegSetValueEx(hkNic, L"Name", 0, REG_SZ, (BYTE*)(rNicInfo.m_wstrName.c_str()), dwNameLen); RegCloseKey(hkNic); } if ( ERROR_SUCCESS != dwRc ) { SATraceFailure( "CNicName::Store", dwRc ); } return dwRc; }