/* File inetcfgp.h Private helper functions for dealing with inetcfg. Paul Mayfield, 1/5/98 (implementation by shaunco) */ #include "inetcfgp.h" //+--------------------------------------------------------------------------- // // Function: HrCreateAndInitializeINetCfg // // Purpose: Cocreate and initialize the root INetCfg object. This will // optionally initialize COM for the caller too. // // Arguments: // fInitCom [in out] TRUE to call CoInitialize before creating. // ppnc [out] The returned INetCfg object. // fGetWriteLock [in] TRUE if a writable INetCfg is needed // cmsTimeout [in] See INetCfg::AcquireWriteLock // szwClientDesc [in] See INetCfg::AcquireWriteLock // ppszwClientDesc [out] See INetCfg::AcquireWriteLock // // Returns: S_OK or an error code. // // Author: shaunco 7 May 1997 // // Notes: // HRESULT APIENTRY HrCreateAndInitializeINetCfg ( BOOL* pfInitCom, INetCfg** ppnc, BOOL fGetWriteLock, DWORD cmsTimeout, LPCWSTR szwClientDesc, LPWSTR* ppszwClientDesc) { HRESULT hr = S_OK; BOOL fCoUninitialize = *pfInitCom; // Initialize the output parameters. *ppnc = NULL; if (ppszwClientDesc) { *ppszwClientDesc = NULL; } // Initialize COM if the caller requested. if (*pfInitCom) { //For whistler bug 398715 gangz // hr = CoInitializeEx (NULL, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE); if( RPC_E_CHANGED_MODE == hr ) { hr = CoInitializeEx (NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED); } if ( SUCCEEDED(hr) ) { hr = S_OK; *pfInitCom = TRUE; fCoUninitialize = TRUE; } else { *pfInitCom = FALSE; fCoUninitialize = FALSE; } } if (SUCCEEDED(hr)) { // Create the object implementing INetCfg. // INetCfg* pnc; hr = CoCreateInstance (&CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, &IID_INetCfg, (void**)&pnc); if (SUCCEEDED(hr)) { INetCfgLock* pnclock = NULL; if (fGetWriteLock) { // Get the locking interface hr = INetCfg_QueryInterface(pnc, &IID_INetCfgLock, (void**)&pnclock); if (SUCCEEDED(hr)) { // Attempt to lock the INetCfg for read/write hr = INetCfgLock_AcquireWriteLock(pnclock, cmsTimeout, szwClientDesc, ppszwClientDesc); if (S_FALSE == hr) { // Couldn't acquire the lock hr = NETCFG_E_NO_WRITE_LOCK; } } } if (SUCCEEDED(hr)) { // Initialize the INetCfg object. // hr = INetCfg_Initialize (pnc, NULL); if (SUCCEEDED(hr)) { *ppnc = pnc; IUnknown_AddRef (pnc); } else { if (pnclock) { INetCfgLock_ReleaseWriteLock(pnclock); } } // 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) && fCoUninitialize) { CoUninitialize (); } } 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 APIENTRY HrUninitializeAndUnlockINetCfg( INetCfg* pnc) { HRESULT hr = INetCfg_Uninitialize (pnc); if (SUCCEEDED(hr)) { INetCfgLock* pnclock; // Get the locking interface hr = INetCfg_QueryInterface (pnc, &IID_INetCfgLock, (void**)&pnclock); if (SUCCEEDED(hr)) { // Attempt to lock the INetCfg for read/write hr = INetCfgLock_ReleaseWriteLock (pnclock); ReleaseObj (pnclock); } } 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 APIENTRY HrUninitializeAndReleaseINetCfg ( BOOL fUninitCom, INetCfg* pnc, BOOL fHasLock) { HRESULT hr = S_OK; if (fHasLock) { hr = HrUninitializeAndUnlockINetCfg (pnc); } else { hr = INetCfg_Uninitialize (pnc); } ReleaseObj (pnc); if (fUninitCom) { CoUninitialize (); } return hr; } //+--------------------------------------------------------------------------- // // Function: HrEnumComponentsInClasses // // Purpose: Given an array of class guids, return all of the components // from INetCfg that belong to those classes in one, unified, // array. // // Arguments: // pNetCfg [in] // cpguidClass [in] // apguidClass [in] // celt [in] // rgelt [out] // pceltFetched [out] // // Returns: S_OK or an error. // // Author: shaunco 12 Dec 1997 // // Notes: // HRESULT APIENTRY HrEnumComponentsInClasses ( INetCfg* pNetCfg, ULONG cpguidClass, GUID** apguidClass, ULONG celt, INetCfgComponent** rgelt, ULONG* pceltFetched) { ULONG iGuid; HRESULT hr = S_OK; // Initialize the output paramters // *pceltFetched = 0; for (iGuid = 0; iGuid < cpguidClass; iGuid++) { // Get the INetCfgClass object this guid represents. // INetCfgClass* pClass; hr = INetCfg_QueryNetCfgClass (pNetCfg, apguidClass[iGuid], &IID_INetCfgClass, (void**)&pClass); if (SUCCEEDED(hr)) { // Get the component enumerator for this class. // IEnumNetCfgComponent* pEnum; hr = INetCfgClass_EnumComponents (pClass, &pEnum); if (SUCCEEDED(hr)) { // Enumerate the components. // ULONG celtFetched; hr = IEnumNetCfgComponent_Next (pEnum, celt, rgelt, &celtFetched); if (SUCCEEDED(hr)) { celt -= celtFetched; rgelt += celtFetched; *pceltFetched += celtFetched; } ReleaseObj (pEnum); } ReleaseObj (pClass); } } return hr; } //+--------------------------------------------------------------------------- // // Function: ReleaseObj // // Purpose: Makes it easier to call punk->Release. Also allows NULL // input. // // Arguments: // punk [in] IUnknown pointer to release. // // Returns: punk->Release if punk is non-NULL, zero otherwise. // // Author: shaunco 13 Dec 1997 // // Notes: // ULONG APIENTRY ReleaseObj ( void* punk) { return (punk) ? IUnknown_Release ((IUnknown*)punk) : 0; } //+--------------------------------------------------------------------------- // // Function: HrCreateNetConnectionUtilities // // Purpose: Retrieve an interface to the Net Connection Ui Utilities // // Arguments: // ppncuu [out] The returned INetConnectionUiUtilities interface. // // Returns: S_OK and SUCCESS, a HRESULT error on failure // // Author: scottbri 15 Oct 1998 // // Notes: // HRESULT APIENTRY HrCreateNetConnectionUtilities(INetConnectionUiUtilities ** ppncuu) { HRESULT hr; hr = CoCreateInstance (&CLSID_NetConnectionUiUtilities, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionUiUtilities, (void**)ppncuu); return hr; } //To get the firewall's group policy value for bug 342810 328673 // BOOL IsGPAEnableFirewall( void) { BOOL fEnableFirewall = FALSE; BOOL fComInitialized = FALSE; BOOL fCleanupOle = TRUE; HRESULT hr; INetConnectionUiUtilities * pNetConUtilities = NULL; hr = CoInitializeEx(NULL, COINIT_MULTITHREADED|COINIT_DISABLE_OLE1DDE); if ( RPC_E_CHANGED_MODE == hr ) { hr = CoInitializeEx (NULL, COINIT_APARTMENTTHREADED |COINIT_DISABLE_OLE1DDE); } if (FAILED(hr)) { fCleanupOle = FALSE; fComInitialized = FALSE; } else { fCleanupOle = TRUE; fComInitialized = TRUE; } if ( fComInitialized ) { hr = HrCreateNetConnectionUtilities(&pNetConUtilities); if ( SUCCEEDED(hr)) { fEnableFirewall = INetConnectionUiUtilities_UserHasPermission( pNetConUtilities, NCPERM_PersonalFirewallConfig ); INetConnectionUiUtilities_Release(pNetConUtilities); } if (fCleanupOle) { CoUninitialize(); } } return fEnableFirewall; }