BOOL CNetConnectionPropertyUi::GetINetCfgComponent(INetCfg *pNCfg, INetCfgComponent ** pOut) { LPWSTR pName; HRESULT hr; INetCfgComponent * pNCg; ULONG Fetched; IEnumNetCfgComponent * pEnumCfg; hr = pNCfg->EnumComponents(&GUID_DEVCLASS_NET, &pEnumCfg); if (FAILED(hr)) { return FALSE; } while (pEnumCfg->Next(1, &pNCg, &Fetched) == S_OK) { hr = pNCg->GetDisplayName(&pName); if (SUCCEEDED(hr)) { if (!_wcsicmp(pName, pProperties->pszwDeviceName)) { *pOut = pNCg; pEnumCfg->Release(); return TRUE; } CoTaskMemFree(pName); } pNCg->Release(); } pEnumCfg->Release(); return FALSE; }
HRESULT HrFindInstance (INetCfg *pnc, GUID &guidInstance, INetCfgComponent **ppnccMiniport) { IEnumNetCfgComponent *pencc; INetCfgComponent *pncc; GUID guid; WCHAR szGuid[MAX_PATH+1]; ULONG ulCount; BOOL found; HRESULT hr; TraceMsg( L"-->HrFindInstance.\n" ); hr = pnc->EnumComponents( &GUID_DEVCLASS_NET, &pencc ); if ( hr == S_OK ) { StringFromGUID2( guidInstance, szGuid, MAX_PATH+1 ); TraceMsg( L" Looking for component with InstanceGuid %s\n", szGuid ); hr = pencc->Next( 1, &pncc, &ulCount ); for ( found=FALSE; (hr == S_OK) && (found == FALSE); ) { hr = pncc->GetInstanceGuid( &guid ); if ( hr == S_OK ) { StringFromGUID2( guid, szGuid, MAX_PATH+1 ); TraceMsg( L" Found component with InstanceGuid %s\n", szGuid ); found = IsEqualGUID( guid, guidInstance ); if ( found == FALSE ) { ReleaseObj( pncc ); hr = pencc->Next( 1, &pncc, &ulCount ); } else { *ppnccMiniport = pncc; } } } ReleaseObj( pencc ); } else { TraceMsg( L" EnumComponents failed(HRESULT = %x).\n", hr ); } TraceMsg( L"<--HrFindInstance(HRESULT = %x).\n", hr ); return hr; }
//+--------------------------------------------------------------------------- // // Function: HrShowNetComponents // // Purpose: Display the list of installed components of the // specified class. // // Arguments: // pnc [in] pointer to INetCfg object // pguidClass [in] pointer to class GUID // // Returns: S_OK on success, otherwise an error code // // Notes: // HRESULT HrShowNetComponents(IN INetCfg* pnc, IN const GUID* pguidClass) { HRESULT hr=S_OK; PWSTR szInfId; PWSTR szDisplayName; DWORD dwcc; INetCfgComponent* pncc; INetCfgClass* pncclass; IEnumNetCfgComponent* pencc; ULONG celtFetched; hr = pnc->QueryNetCfgClass(pguidClass, IID_INetCfgClass, (void**)&pncclass); if (SUCCEEDED(hr)) { // get IEnumNetCfgComponent so that we can enumerate hr = pncclass->EnumComponents(&pencc); ReleaseObj(pncclass); while (SUCCEEDED(hr) && (S_OK == (hr = pencc->Next(1, &pncc, &celtFetched)))) { if (pguidClass == &GUID_DEVCLASS_NET) { // we are interested only in physical netcards // hr = pncc->GetCharacteristics(&dwcc); if (FAILED(hr) || !(dwcc & NCF_PHYSICAL)) { hr = S_OK; ReleaseObj(pncc); continue; } } hr = pncc->GetId(&szInfId); if (S_OK == hr) { hr = pncc->GetDisplayName(&szDisplayName); if (SUCCEEDED(hr)) { LogPrintf(_T("%-26s %s\n"), szInfId, szDisplayName); CoTaskMemFree(szDisplayName); } CoTaskMemFree(szInfId); } // we dont want to stop enumeration just because 1 component // failed either GetId or GetDisplayName, therefore reset hr to S_OK hr = S_OK; ReleaseObj(pncc); } ReleaseObj(pencc); } if (S_FALSE == hr) { hr = S_OK; } return hr; }
VOID CNetConnectionPropertyUi::EnumComponents(HWND hDlgCtrl, INetCfg *pNCfg, const GUID *CompGuid, UINT Type) { HRESULT hr; IEnumNetCfgComponent * pENetCfg; INetCfgComponent *pNCfgComp, *pAdapterCfgComp; INetCfgComponentBindings * pCompBind; ULONG Num; DWORD dwCharacteristics; LPOLESTR pDisplayName, pHelpText; PNET_ITEM pItem; BOOL bChecked; hr = pNCfg->EnumComponents(CompGuid, &pENetCfg); if (FAILED(hr)) { pNCfg->Release(); return; } while(pENetCfg->Next(1, &pNCfgComp, &Num) == S_OK) { hr = pNCfgComp->GetCharacteristics(&dwCharacteristics); if (SUCCEEDED(hr) && (dwCharacteristics & NCF_HIDDEN)) { pNCfgComp->Release(); continue; } pDisplayName = NULL; pHelpText = NULL; hr = pNCfgComp->GetDisplayName(&pDisplayName); hr = pNCfgComp->GetHelpText(&pHelpText); bChecked = TRUE; //ReactOS hack hr = pNCfgComp->QueryInterface(IID_INetCfgComponentBindings, (LPVOID*)&pCompBind); if (SUCCEEDED(hr)) { if (GetINetCfgComponent(pNCfg, &pAdapterCfgComp)) { hr = pCompBind->IsBoundTo(pAdapterCfgComp); if (hr == S_OK) bChecked = TRUE; else bChecked = FALSE; pAdapterCfgComp->Release(); pCompBind->Release(); } } pItem = (NET_ITEM*)CoTaskMemAlloc(sizeof(NET_ITEM)); if (!pItem) continue; pItem->dwCharacteristics = dwCharacteristics; pItem->szHelp = pHelpText; pItem->Type = (NET_TYPE)Type; pItem->pNCfgComp = pNCfgComp; pItem->NumPropDialogOpen = 0; AddItemToListView(hDlgCtrl, pItem, pDisplayName, bChecked); CoTaskMemFree(pDisplayName); } pENetCfg->Release(); }