//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997 - 2000 // // File: H N B R G C O N . C P P // // Contents: CHNBridgedConn implementation // // Notes: // // Author: jonburs 23 June 2000 // //---------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop // // Ojbect initialization // HRESULT CHNBridgedConn::Initialize( IWbemServices *piwsNamespace, IWbemClassObject *pwcoConnection ) { return InitializeFromConnection(piwsNamespace, pwcoConnection); } // // IHNetBridgedConnection methods // STDMETHODIMP CHNBridgedConn::GetBridge( IHNetBridge **ppBridge ) { HRESULT hr; if (NULL != ppBridge) { *ppBridge = NULL; hr = GetBridgeConnection( m_piwsHomenet, ppBridge ); } else { hr = E_POINTER; } return hr; } STDMETHODIMP CHNBridgedConn::RemoveFromBridge( IN OPTIONAL INetCfg *pnetcfgExisting ) { HRESULT hr = S_OK; BSTR bstr; if (ProhibitedByPolicy(NCPERM_AllowNetBridge_NLA)) { hr = HN_E_POLICY; } if (S_OK == hr) { // // Unbind ourselves from the bridge // hr = UnbindFromBridge( pnetcfgExisting ); } if (S_OK == hr) { // // Inform netman that something changed. Error doesn't matter. // UpdateNetman(); } return hr; } HRESULT CHNBridgedConn::CopyBridgeBindings( IN INetCfgComponent *pnetcfgAdapter, IN INetCfgComponent *pnetcfgBridge ) { HRESULT hr = S_OK; INetCfgComponentBindings *pnetcfgAdapterBindings; // // Get the adapter's ComponentBindings interface // hr = pnetcfgAdapter->QueryInterface( IID_PPV_ARG(INetCfgComponentBindings, &pnetcfgAdapterBindings) ); if (S_OK == hr) { IEnumNetCfgBindingPath *penumPaths; // // Get the list of binding paths for the adapter // hr = pnetcfgAdapterBindings->EnumBindingPaths( EBP_ABOVE, &penumPaths ); if (S_OK == hr) { ULONG ulCount1, ulCount2; INetCfgBindingPath *pnetcfgPath; while( (S_OK == penumPaths->Next(1, &pnetcfgPath, &ulCount1) ) ) { INetCfgComponent *pnetcfgOwner; // // Get the owner of this path // hr = pnetcfgPath->GetOwner( &pnetcfgOwner ); if (S_OK == hr) { INetCfgComponentBindings *pnetcfgOwnerBindings; // // Need the ComponentBindings interface for the owner // hr = pnetcfgOwner->QueryInterface( IID_PPV_ARG(INetCfgComponentBindings, &pnetcfgOwnerBindings) ); if (S_OK == hr) { LPWSTR lpwstrId; // // The rule is, the binding should be disabled if it // represents the bridge protocol or something that // is not bound to the bridge that the adapter is // coming out of. // // If the binding is one that the bridge has, it is // enabled. // // This makes the adapter's bindings mirror those of // the bridge it just left. // hr = pnetcfgOwner->GetId( &lpwstrId ); if (S_OK == hr) { UINT cmp = _wcsicmp(lpwstrId, c_wszSBridgeSID); hr = pnetcfgOwnerBindings->IsBoundTo( pnetcfgBridge ); if ( (S_OK == hr) && (cmp != 0) ) { // Activate this binding path hr = pnetcfgOwnerBindings->BindTo(pnetcfgAdapter); } else { // Deactivate this path hr = pnetcfgOwnerBindings->UnbindFrom(pnetcfgAdapter); } CoTaskMemFree(lpwstrId); } pnetcfgOwnerBindings->Release(); } pnetcfgOwner->Release(); } pnetcfgPath->Release(); } penumPaths->Release(); } pnetcfgAdapterBindings->Release(); } return hr; } HRESULT CHNBridgedConn::UnbindFromBridge( IN OPTIONAL INetCfg *pnetcfgExisting ) { HRESULT hr = S_OK; GUID *pguidAdapter; INetCfg *pnetcfg = NULL; INetCfgLock *pncfglock = NULL; if( NULL == pnetcfgExisting ) { hr = InitializeNetCfgForWrite( &pnetcfg, &pncfglock ); // Bail out if we can't acquire NetCfg. if( FAILED(hr) ) { return hr; } } else { // Use the NetCfg context we were given pnetcfg = pnetcfgExisting; } // We must have a NetCfg context at this point _ASSERT( pnetcfg != NULL ); // // Get our own device GUID // hr = GetGuid (&pguidAdapter); if ( SUCCEEDED(hr) ) { IHNetBridge *pbridge; // // Get our bridge // hr = GetBridge (&pbridge); if ( SUCCEEDED(hr) ) { IHNetConnection *phnetconBridge; // // Get the bridge's IHNetConnection interface // hr = pbridge->QueryInterface( IID_PPV_ARG(IHNetConnection, &phnetconBridge) ); if ( SUCCEEDED(hr) ) { GUID *pguidBridge; // Get the bridge's device GUID hr = phnetconBridge->GetGuid (&pguidBridge); if ( SUCCEEDED(hr) ) { INetCfgComponent *pnetcfgcompAdapter; hr = FindAdapterByGUID( pnetcfg, pguidAdapter, &pnetcfgcompAdapter ); if ( SUCCEEDED(hr) ) { INetCfgComponent *pnetcfgcompBridge; hr = FindAdapterByGUID( pnetcfg, pguidBridge, &pnetcfgcompBridge ); if ( SUCCEEDED(hr) ) { hr = CopyBridgeBindings( pnetcfgcompAdapter, pnetcfgcompBridge ); pnetcfgcompBridge->Release(); } pnetcfgcompAdapter->Release(); } CoTaskMemFree(pguidBridge); } phnetconBridge->Release(); } pbridge->Release(); } CoTaskMemFree(pguidAdapter); } // If we created our own NetCfg context, shut it down now if( NULL == pnetcfgExisting ) { // Apply everything if we succeeded, back out otherwise if ( SUCCEEDED(hr) ) { hr = pnetcfg->Apply(); // Refresh the UI for this connection RefreshNetConnectionsUI(); } else { // Don't want to lose the original error code pnetcfg->Cancel(); } UninitializeNetCfgForWrite( pnetcfg, pncfglock ); } return hr; }