mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
319 lines
8.1 KiB
319 lines
8.1 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1999.
|
|
//
|
|
// File: I N E T C F G . H
|
|
//
|
|
// Contents: Implements the COM interfaces on the top-level NetCfg object.
|
|
// These interfaces are: INetCfg and INetCfgLock. Also
|
|
// implements a base C++ class inherited by sub-level NetCfg
|
|
// objects which hold a reference to the top-level object.
|
|
//
|
|
// Notes:
|
|
//
|
|
// Author: shaunco 15 Jan 1999
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
#include "iatl.h"
|
|
#include "compdefs.h"
|
|
#include "nccom.h"
|
|
#include "ncres.h"
|
|
#include "netcfgp.h"
|
|
#include "netcfgn.h"
|
|
#include "wrlock.h"
|
|
|
|
// Flags for HrIsValidInterface.
|
|
//
|
|
enum IF_FLAGS
|
|
{
|
|
IF_DEFAULT = 0x00000000,
|
|
IF_NEED_UNINITIALIZED = 0x00000001,
|
|
IF_NEED_WRITE_LOCK = 0x00000002,
|
|
IF_NEED_COMPONENT_DATA = 0x00000004,
|
|
IF_REFUSE_REENTRANCY = 0x00000010,
|
|
IF_ALLOW_INSTALL_OR_REMOVE = 0x00000020,
|
|
IF_UNINITIALIZING = 0x00000040,
|
|
IF_DONT_PREPARE_MODIFY_CONTEXT = 0x00000080,
|
|
};
|
|
|
|
enum RPL_FLAGS
|
|
{
|
|
RPL_ALLOW_INSTALL_REMOVE,
|
|
RPL_DISALLOW,
|
|
};
|
|
|
|
class CNetConfig;
|
|
|
|
class ATL_NO_VTABLE CImplINetCfg :
|
|
public CComObjectRootEx <CComMultiThreadModel>,
|
|
public CComCoClass<CImplINetCfg, &CLSID_CNetCfg>,
|
|
public INetCfg,
|
|
public INetCfgLock,
|
|
public INetCfgInternalSetup,
|
|
public INetCfgSpecialCase,
|
|
public INetCfgPnpReconfigCallback
|
|
{
|
|
friend class CGlobalNotifyInterface;
|
|
friend class CImplIEnumNetCfgBindingPath;
|
|
friend class CImplIEnumNetCfgComponent;
|
|
friend class CImplINetCfgBindingPath;
|
|
friend class CImplINetCfgClass;
|
|
friend class CImplINetCfgComponent;
|
|
friend class CModifyContext;
|
|
friend class CNetCfgInternalDiagnostic;
|
|
friend class CNetConfig;
|
|
friend class CNotifyObjectInterface;
|
|
|
|
private:
|
|
// This is our data. We own it (i.e. we created it) if Initialize is
|
|
// called. We will delete it when Unintialize is called. We won't own
|
|
// it if we were created by CNetConfig.
|
|
//
|
|
CNetConfig* m_pNetConfig;
|
|
|
|
// m_apINetCfgClass is an array of cached INetCfgClass pointers.
|
|
// These are created in QueryNetCfgClass (if needed) and released
|
|
// during Uninitialize.
|
|
//
|
|
INetCfgClass* m_apINetCfgClass [NC_CELEMS];
|
|
|
|
// This controls the write lock.
|
|
//
|
|
CWriteLock m_WriteLock;
|
|
|
|
// Reentrancy Protection Levels. General reentrancy is prevented when
|
|
// m_CurrentRpl is non-zero. Reentrancy for setup calls (Install or
|
|
// Remove) is allowed when m_LastAllowedSetupRpl equals m_CurrentRpl.
|
|
// Both are incremented when we call a notify object and we want to
|
|
// prevent general reentrancy but allow Install or Remove. Only
|
|
// m_CurrentRpl is incremented when we want to prevent all reentrancy.
|
|
// See LowerRpl() and RaiseRpl().
|
|
//
|
|
ULONG m_CurrentRpl;
|
|
ULONG m_LastAllowedSetupRpl;
|
|
|
|
BOOLEAN m_fOwnNetConfig;
|
|
|
|
private:
|
|
HRESULT
|
|
HrCheckForReentrancy (
|
|
IN DWORD dwFlags);
|
|
|
|
HRESULT
|
|
HrLockAndTestForValidInterface (
|
|
IN DWORD dwFlags);
|
|
|
|
VOID
|
|
LowerRpl (
|
|
IN RPL_FLAGS Flags);
|
|
|
|
VOID
|
|
RaiseRpl (
|
|
IN RPL_FLAGS Flags);
|
|
|
|
public:
|
|
CImplINetCfg ()
|
|
{
|
|
m_pNetConfig = NULL;
|
|
m_CurrentRpl = 0;
|
|
m_LastAllowedSetupRpl = 0;
|
|
m_fOwnNetConfig = FALSE;
|
|
ZeroMemory (m_apINetCfgClass, sizeof(m_apINetCfgClass));
|
|
}
|
|
|
|
VOID FinalRelease ()
|
|
{
|
|
// Should be NULL because we either delete it during Uninitialize,
|
|
// or it is NULL'd for us via CGlobalNotifyInterface::ReleaseINetCfg
|
|
// before they release us.
|
|
//
|
|
AssertH (!m_pNetConfig);
|
|
|
|
// Release our cache of INetCfgClass pointers.
|
|
//
|
|
ReleaseIUnknownArray (celems(m_apINetCfgClass), (IUnknown**)m_apINetCfgClass);
|
|
|
|
}
|
|
|
|
HRESULT HrCoCreateWrapper (
|
|
IN REFCLSID rclsid,
|
|
IN LPUNKNOWN pUnkOuter,
|
|
IN DWORD dwClsContext,
|
|
IN REFIID riid,
|
|
OUT LPVOID FAR* ppv);
|
|
|
|
HRESULT HrIsValidInterface (
|
|
DWORD dwFlags);
|
|
|
|
BEGIN_COM_MAP(CImplINetCfg)
|
|
COM_INTERFACE_ENTRY(INetCfg)
|
|
COM_INTERFACE_ENTRY(INetCfgLock)
|
|
COM_INTERFACE_ENTRY(INetCfgInternalSetup)
|
|
COM_INTERFACE_ENTRY(INetCfgSpecialCase)
|
|
COM_INTERFACE_ENTRY(INetCfgPnpReconfigCallback)
|
|
END_COM_MAP()
|
|
|
|
DECLARE_REGISTRY_RESOURCEID(IDR_REG_NETCFG)
|
|
|
|
// INetCfg
|
|
//
|
|
STDMETHOD (Initialize) (
|
|
IN PVOID pvReserved);
|
|
|
|
STDMETHOD (Uninitialize) ();
|
|
|
|
STDMETHOD (Validate) ();
|
|
|
|
STDMETHOD (Cancel) ();
|
|
|
|
STDMETHOD (Apply) ();
|
|
|
|
STDMETHOD (EnumComponents) (
|
|
IN const GUID* pguidClass OPTIONAL,
|
|
OUT IEnumNetCfgComponent** ppIEnum);
|
|
|
|
STDMETHOD (FindComponent) (
|
|
IN PCWSTR pszInfId,
|
|
OUT INetCfgComponent** ppIComp);
|
|
|
|
STDMETHOD (QueryNetCfgClass) (
|
|
IN const GUID* pguidClass,
|
|
IN REFIID riid,
|
|
OUT VOID** ppv);
|
|
|
|
// INetCfgLock
|
|
//
|
|
STDMETHOD (AcquireWriteLock) (
|
|
IN DWORD cmsTimeout,
|
|
IN PCWSTR pszClientDescription,
|
|
OUT PWSTR* ppszClientDescription);
|
|
|
|
STDMETHOD (ReleaseWriteLock) ();
|
|
|
|
STDMETHOD (IsWriteLocked) (
|
|
OUT PWSTR* ppszClientDescription);
|
|
|
|
// INetCfgInternalSetup
|
|
//
|
|
STDMETHOD (BeginBatchOperation) ();
|
|
STDMETHOD (CommitBatchOperation) ();
|
|
|
|
STDMETHOD (SelectWithFilterAndInstall) (
|
|
IN HWND hwndParent,
|
|
IN const GUID* pClassGuid,
|
|
IN OBO_TOKEN* pOboToken,
|
|
IN const CI_FILTER_INFO* pcfi,
|
|
OUT INetCfgComponent** ppnccItem);
|
|
|
|
STDMETHOD (EnumeratedComponentInstalled) (
|
|
IN PVOID pComponent /* type of CComponent */);
|
|
|
|
STDMETHOD (EnumeratedComponentUpdated) (
|
|
IN PCWSTR pszPnpId);
|
|
|
|
STDMETHOD (UpdateNonEnumeratedComponent) (
|
|
IN INetCfgComponent* pIComp,
|
|
IN DWORD dwSetupFlags,
|
|
IN DWORD dwUpgradeFromBuildNo);
|
|
|
|
STDMETHOD (EnumeratedComponentRemoved) (
|
|
IN PCWSTR pszPnpId);
|
|
|
|
// INetCfgSpecialCase
|
|
//
|
|
STDMETHOD (GetAdapterOrder) (
|
|
OUT DWORD* pcAdapters,
|
|
OUT INetCfgComponent*** papAdapters,
|
|
OUT BOOL* pfWanAdaptersFirst);
|
|
|
|
STDMETHOD (SetAdapterOrder) (
|
|
IN DWORD cAdapters,
|
|
IN INetCfgComponent** apAdapters,
|
|
IN BOOL fWanAdaptersFirst);
|
|
|
|
STDMETHOD (GetWanAdaptersFirst) (
|
|
OUT BOOL* pfWanAdaptersFirst);
|
|
|
|
STDMETHOD (SetWanAdaptersFirst) (
|
|
IN BOOL fWanAdaptersFirst);
|
|
|
|
// INetCfgPnpReconfigCallback
|
|
//
|
|
STDMETHOD (SendPnpReconfig) (
|
|
IN NCPNP_RECONFIG_LAYER Layer,
|
|
IN PCWSTR pszUpper,
|
|
IN PCWSTR pszLower,
|
|
IN PVOID pvData,
|
|
IN DWORD dwSizeOfData);
|
|
|
|
static HRESULT
|
|
HrCreateInstance (
|
|
CNetConfig* pNetConfig,
|
|
CImplINetCfg** ppINetCfg);
|
|
};
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
// CImplINetCfgHolder -
|
|
//
|
|
// No need for a critical section for these objects because they
|
|
// use the lock provided by CImplINetCfg. i.e. use CComMultiThreadModelNoCS
|
|
// instead of CComMultiThreadModel.
|
|
//
|
|
class ATL_NO_VTABLE CImplINetCfgHolder :
|
|
public CComObjectRootEx <CComMultiThreadModelNoCS>
|
|
{
|
|
protected:
|
|
CImplINetCfg* m_pINetCfg;
|
|
|
|
protected:
|
|
VOID HoldINetCfg (
|
|
CImplINetCfg* pINetCfg);
|
|
|
|
HRESULT HrLockAndTestForValidInterface (
|
|
DWORD dwFlags);
|
|
|
|
public:
|
|
CImplINetCfgHolder ()
|
|
{
|
|
m_pINetCfg = NULL;
|
|
}
|
|
|
|
#if DBG
|
|
~CImplINetCfgHolder ()
|
|
{
|
|
AssertH (!m_pINetCfg);
|
|
}
|
|
#endif // DBG
|
|
|
|
VOID FinalRelease ()
|
|
{
|
|
AssertH (m_pINetCfg);
|
|
ReleaseObj (m_pINetCfg->GetUnknown());
|
|
|
|
#if DBG
|
|
m_pINetCfg = NULL;
|
|
#endif // DBG
|
|
|
|
CComObjectRootEx <CComMultiThreadModelNoCS>::FinalRelease();
|
|
}
|
|
|
|
VOID Lock ()
|
|
{
|
|
CComObjectRootEx <CComMultiThreadModelNoCS>::Lock();
|
|
|
|
AssertH(m_pINetCfg);
|
|
m_pINetCfg->Lock ();
|
|
}
|
|
VOID Unlock ()
|
|
{
|
|
AssertH(m_pINetCfg);
|
|
m_pINetCfg->Unlock ();
|
|
|
|
CComObjectRootEx <CComMultiThreadModelNoCS>::Unlock();
|
|
}
|
|
};
|
|
|