//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: N C N E T C F G . C P P // // Contents: Common routines for dealing with INetCfg interfaces. // // Notes: // // Author: shaunco 24 Mar 1997 // //---------------------------------------------------------------------------- #include #pragma hdrstop #include "ncbase.h" #include "ncdebug.h" #include "ncnetcfg.h" #include "netcfgx.h" //+--------------------------------------------------------------------------- // // Function: HrCreateAndInitializeINetCfg // // Purpose: Cocreate and initialize the root INetCfg object. This will // optionally initialize COM for the caller too. // // Arguments: // pfInitCom [in,out] TRUE to call CoInitialize before creating. // returns TRUE if COM was successfully // initialized FALSE if not. If NULL, means // don't initialize COM. // ppnc [out] The returned INetCfg object. // fGetWriteLock [in] TRUE if a writable INetCfg is needed // cmsTimeout [in] See INetCfg::AcquireWriteLock // pszClientDesc [in] See INetCfg::AcquireWriteLock // ppszClientDesc [out] See INetCfg::AcquireWriteLock // // Returns: S_OK or an error code. // // Author: shaunco 7 May 1997 // // Notes: // HRESULT HrCreateAndInitializeINetCfg ( BOOL* pfInitCom, INetCfg** ppnc, BOOL fGetWriteLock, DWORD cmsTimeout, PCWSTR pszClientDesc, PWSTR* ppszClientDesc) { Assert (ppnc); // Initialize the output parameters. *ppnc = NULL; if (ppszClientDesc) { *ppszClientDesc = NULL; } // Initialize COM if the caller requested. HRESULT hr = S_OK; if (pfInitCom && *pfInitCom) { hr = CoInitializeEx( NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED ); if (RPC_E_CHANGED_MODE == hr) { hr = S_OK; *pfInitCom = FALSE; } } if (SUCCEEDED(hr)) { // Create the object implementing INetCfg. // INetCfg* pnc; hr = CoCreateInstance( CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER | CLSCTX_NO_CODE_DOWNLOAD, IID_INetCfg, reinterpret_cast(&pnc)); if (SUCCEEDED(hr)) { INetCfgLock * pnclock = NULL; if (fGetWriteLock) { // Get the locking interface hr = pnc->QueryInterface(IID_INetCfgLock, reinterpret_cast(&pnclock)); if (SUCCEEDED(hr)) { // Attempt to lock the INetCfg for read/write hr = pnclock->AcquireWriteLock(cmsTimeout, pszClientDesc, ppszClientDesc); if (S_FALSE == hr) { // Couldn't acquire the lock hr = NETCFG_E_NO_WRITE_LOCK; } } } if (SUCCEEDED(hr)) { // Initialize the INetCfg object. // hr = pnc->Initialize (NULL); if (SUCCEEDED(hr)) { *ppnc = pnc; AddRefObj (pnc); } else { if (pnclock) { pnclock->ReleaseWriteLock(); } } // Transfer reference to caller. } ReleaseObj(pnclock); ReleaseObj(pnc); } // If we failed anything above, and we've initialized COM, // be sure an uninitialize it. // if (FAILED(hr) && pfInitCom && *pfInitCom) { CoUninitialize (); } } TraceError("HrCreateAndInitializeINetCfg", hr); return hr; } //+--------------------------------------------------------------------------- // // Function: HrUninitializeAndReleaseINetCfg // // Purpose: Unintialize and release an INetCfg object. This will // optionally uninitialize COM for the caller too. // // Arguments: // fUninitCom [in] TRUE to uninitialize COM after the INetCfg is // uninitialized and released. // pnc [in] The INetCfg object. // fHasLock [in] TRUE if the INetCfg was locked for write and // must be unlocked. // // Returns: S_OK or an error code. // // Author: shaunco 7 May 1997 // // Notes: The return value is the value returned from // INetCfg::Uninitialize. Even if this fails, the INetCfg // is still released. Therefore, the return value is for // informational purposes only. You can't touch the INetCfg // object after this call returns. // HRESULT HrUninitializeAndReleaseINetCfg ( BOOL fUninitCom, INetCfg* pnc, BOOL fHasLock) { Assert (pnc); HRESULT hr = S_OK; if (fHasLock) { hr = HrUninitializeAndUnlockINetCfg(pnc); } else { hr = pnc->Uninitialize (); } ReleaseObj (pnc); if (fUninitCom) { CoUninitialize (); } TraceError("HrUninitializeAndReleaseINetCfg", hr); return hr; } //+--------------------------------------------------------------------------- // // Function: HrUninitializeAndUnlockINetCfg // // Purpose: Uninitializes and unlocks the INetCfg object // // Arguments: // pnc [in] INetCfg to uninitialize and unlock // // Returns: S_OK if success, OLE or Win32 error otherwise // // Author: danielwe 13 Nov 1997 // // Notes: // HRESULT HrUninitializeAndUnlockINetCfg ( INetCfg* pnc) { HRESULT hr = S_OK; hr = pnc->Uninitialize(); if (SUCCEEDED(hr)) { INetCfgLock * pnclock; // Get the locking interface hr = pnc->QueryInterface(IID_INetCfgLock, reinterpret_cast(&pnclock)); if (SUCCEEDED(hr)) { // Attempt to lock the INetCfg for read/write hr = pnclock->ReleaseWriteLock(); ReleaseObj(pnclock); } } TraceError("HrUninitializeAndUnlockINetCfg", hr); return hr; } //+--------------------------------------------------------------------------- // // Function: HrIsLanCapableAdapter // // Purpose: Returns whether the given component (adapter) is capable of // being associated with a LAN connection // // Arguments: // pncc [in] Component to test // // Returns: S_OK if it is capable, S_FALSE if not, OLE or Win32 error code // otherwise // // Author: danielwe 13 Nov 1997 // // Notes: // HRESULT HrIsLanCapableAdapter ( INetCfgComponent* pncc) { Assert(pncc); INetCfgComponentBindings* pnccb; HRESULT hr = pncc->QueryInterface(IID_INetCfgComponentBindings, reinterpret_cast(&pnccb)); if (S_OK == hr) { // Does it have ndis4?... extern const WCHAR c_szBiNdis4[]; hr = pnccb->SupportsBindingInterface(NCF_UPPER, c_szBiNdis4); if (S_FALSE == hr) { // ... no.. how about ndisatm? extern const WCHAR c_szBiNdisAtm[]; hr = pnccb->SupportsBindingInterface(NCF_UPPER, c_szBiNdisAtm); if (S_FALSE == hr) { // .. let's try ndis5 then extern const WCHAR c_szBiNdis5[]; hr = pnccb->SupportsBindingInterface(NCF_UPPER, c_szBiNdis5); if (S_FALSE == hr) { // .. let's try ndis5_ip then extern const WCHAR c_szBiNdis5Ip[]; hr = pnccb->SupportsBindingInterface(NCF_UPPER, c_szBiNdis5Ip); if (S_FALSE == hr) { // .. let's try LocalTalk then (this is an adapters lower interface) extern const WCHAR c_szBiLocalTalk[]; hr = pnccb->SupportsBindingInterface(NCF_LOWER, c_szBiLocalTalk); // ... no.. how about ndis1394? if (S_FALSE == hr) { extern const WCHAR c_szBiNdis1394[]; hr = pnccb->SupportsBindingInterface(NCF_UPPER, c_szBiNdis1394); } } } } } ReleaseObj(pnccb); } TraceError("HrIsLanCapableAdapter", (hr == S_FALSE) ? S_OK : hr); return hr; } //+--------------------------------------------------------------------------- // // Function: HrIsLanCapableProtocol // // Purpose: Returns whether the given component (protocol) is capable of // being associated with a LAN connection // // Arguments: // pncc [in] Component to test // // Returns: S_OK if it is capable, S_FALSE if not, OLE or Win32 error code // otherwise // // Author: danielwe 13 Nov 1997 // // Notes: // HRESULT HrIsLanCapableProtocol ( INetCfgComponent* pncc) { Assert(pncc); INetCfgComponentBindings* pnccb; HRESULT hr = pncc->QueryInterface(IID_INetCfgComponentBindings, reinterpret_cast(&pnccb)); if (S_OK == hr) { // Does it have ndis4?... extern const WCHAR c_szBiNdis4[]; hr = pnccb->SupportsBindingInterface(NCF_LOWER, c_szBiNdis4); if (S_FALSE == hr) { // ... no.. how about ndisatm? extern const WCHAR c_szBiNdisAtm[]; hr = pnccb->SupportsBindingInterface(NCF_LOWER, c_szBiNdisAtm); if (S_FALSE == hr) { // .. let's try ndis5 then extern const WCHAR c_szBiNdis5[]; hr = pnccb->SupportsBindingInterface(NCF_LOWER, c_szBiNdis5); if (S_FALSE == hr) { // .. let's try ndis5_ip then extern const WCHAR c_szBiNdis5Ip[]; hr = pnccb->SupportsBindingInterface(NCF_LOWER, c_szBiNdis5Ip); } } } ReleaseObj(pnccb); } // Raid 147474 : NDISUIO: No warning when you uninstall all the protocols. // mbend 7/20/2000 // // Don't consider a hidden protocol a valid Lanui protocol. if(S_OK == hr) { DWORD dwChar = 0; hr = pncc->GetCharacteristics(&dwChar); if(SUCCEEDED(hr)) { if(NCF_HIDDEN & dwChar) { hr = S_FALSE; } } } TraceError("HrIsLanCapableAdapter", (hr == S_FALSE) ? S_OK : hr); return hr; }