2025-04-27 07:49:33 -04:00

188 lines
6.2 KiB
C++

#ifndef __SINK_HOLDER_COMPILED_ALREADY_
#define __SINK_HOLDER_COMPILED_ALREADY_
#include <unk.h>
struct ProviderInfo
{
ProviderInfo(IUnknown *pProvider, long lFlags) :
m_pProvider(pProvider), m_lFlags(lFlags) {}
IUnknown* m_pProvider;
long m_lFlags;
};
template <class TInterface, class TObject>
class CImplSharedRef : public CImpl<TInterface, TObject>
{
public:
CImplSharedRef(long& lSharedRef, TObject* pObject) : m_lSharedRef(lSharedRef),
CImpl<TInterface, TObject>(pObject)
{}
// per-interface refcount. this way we can remove our pointer from the table
// when WinMgmt is no longer interested in our services.
STDMETHOD_(ULONG, AddRef)()
{
InterlockedIncrement(&m_lSharedRef);
return m_pObject->GetUnknown()->AddRef();
}
STDMETHOD_(ULONG, Release)()
{
long lRef = InterlockedDecrement(&m_lSharedRef);
if (lRef <= 0)
sinkManager.Remove(m_pObject);
return m_pObject->GetUnknown()->Release();
}
protected:
long& m_lSharedRef;
};
// this class is pretty much the heart of the Pseudo Provider
// it holds the sink & services pointer for the real provider
// for whenever he decides to show himself
//
// you get one of these for each namespace/provider pair
// EVEN THOUGH we support multiple providers
class CEventSinkHolder : public CUnk
{
public:
CEventSinkHolder(CLifeControl* pControl, IUnknown* pOuter = NULL) :
CUnk(pControl, NULL), m_lEventsRef(0), m_XProv(m_lEventsRef, this),
m_XInit(m_lEventsRef, this), m_XQuery(m_lEventsRef, this), m_XIdentity(m_lEventsRef, this),
m_XDecoupledProvider(this), m_strProviderName(NULL), m_strNamespace(NULL),
m_pNamespace(NULL), m_pSink(NULL), m_XSecurity(m_lEventsRef, this),
m_XProviderLocator(this)
{}
~CEventSinkHolder();
// overrides from base class
void* GetInterface(REFIID riid);
virtual BOOL OnInitialize();
// constructs name of the form namespace\class
// returns true iff both pieces have been initialized
// function new's name, caller's responsibility to delete it
bool GetMangledName(LPWSTR* mangledName);
LPCWSTR GetProviderName()
{ return m_strProviderName; }
LPCWSTR GetNamespaceName()
{ return m_strNamespace; }
protected:
/** EVENT PROVIDER INTERFACES **/
class XProv : public CImplSharedRef<IWbemEventProvider, CEventSinkHolder>
{
public:
XProv(long& lSharedRef, CEventSinkHolder* pObj) : CImplSharedRef<IWbemEventProvider, CEventSinkHolder>(lSharedRef, pObj) {}
STDMETHOD(ProvideEvents)(IWbemObjectSink* pSink, long lFlags);
} m_XProv;
friend XProv;
class XInit : public CImplSharedRef<IWbemProviderInit, CEventSinkHolder>
{
public:
XInit(long& lSharedRef, CEventSinkHolder* pObj) : CImplSharedRef<IWbemProviderInit, CEventSinkHolder>(lSharedRef, pObj){}
STDMETHOD(Initialize)(LPWSTR wszUser, LONG lFlags, LPWSTR wszNamespace,
LPWSTR wszLocale, IWbemServices* pNamespace,
IWbemContext* pContext,
IWbemProviderInitSink* pInitSink);
} m_XInit;
friend XInit;
class XQuery : public CImplSharedRef<IWbemEventProviderQuerySink, CEventSinkHolder>
{
public:
XQuery(long& lSharedRef, CEventSinkHolder* pObj) : CImplSharedRef<IWbemEventProviderQuerySink, CEventSinkHolder>(lSharedRef, pObj){}
STDMETHOD(NewQuery)(DWORD dwId, LPWSTR wszLanguage, LPWSTR wszQuery);
STDMETHOD(CancelQuery)(DWORD dwId);
} m_XQuery;
friend XQuery;
class XSecurity : public CImplSharedRef<IWbemEventProviderSecurity, CEventSinkHolder>
{
public:
XSecurity(long& lSharedRef, CEventSinkHolder* pObj) : CImplSharedRef<IWbemEventProviderSecurity, CEventSinkHolder>(lSharedRef, pObj){}
STDMETHOD(AccessCheck)(WBEM_CWSTR wszQueryLanguage, WBEM_CWSTR wszQuery,
long lSidLength, const BYTE __RPC_FAR *pSid);
} m_XSecurity;
friend XSecurity;
class XIdentity : public CImplSharedRef<IWbemProviderIdentity, CEventSinkHolder>
{
public:
XIdentity(long& lSharedRef, CEventSinkHolder* pObj) : CImplSharedRef<IWbemProviderIdentity, CEventSinkHolder>(lSharedRef, pObj){}
STDMETHOD(SetRegistrationObject)(long lFlags, IWbemClassObject* pProvReg);
} m_XIdentity;
friend XIdentity;
/** PSEUDO PROVIDER INTERFACES **/
class XDecoupledProvider : public CImpl<IWbemDecoupledEventProvider, CEventSinkHolder>
{
public:
XDecoupledProvider(CEventSinkHolder* pObj) : CImpl<IWbemDecoupledEventProvider, CEventSinkHolder>(pObj){}
STDMETHOD(Connect)(long lFlags, IUnknown* pPseudoSink,
IWbemObjectSink** ppSink, IWbemServices** ppNamespace);
STDMETHOD(SetProviderServices)(IUnknown* pProviderServices, long lFlags, DWORD* dwID);
STDMETHOD(Disconnect)(DWORD dwID);
} m_XDecoupledProvider;
friend XDecoupledProvider;
class XProviderLocator : public CImpl<IWbemDecoupledEventProviderLocator, CEventSinkHolder>
{
public:
XProviderLocator(CEventSinkHolder* pObj) : CImpl<IWbemDecoupledEventProviderLocator, CEventSinkHolder>(pObj){}
STDMETHOD(GetProvider)(IWbemDecoupledEventProvider** pDecoupledProvider);
} m_XProviderLocator;
HRESULT AccessCheck(PACL pDacl);
HRESULT GetProviderDacl(BYTE** pDacl);
// strings which identify who we are pretending to be
LPWSTR m_strProviderName;
LPWSTR m_strNamespace;
// the actual object sink to winmgmt
IWbemObjectSink* m_pSink;
// namespace pointer provided by WinMgmt
IWbemServices* m_pNamespace;
// critical section to protect our array.
CCritSec m_csArray;
// any providers which have provided us with
// cached as ProviderInfos.
CFlexArray m_providerInfos;
// refcount for the event provider interfaces
long m_lEventsRef;
private:
};
#endif