Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

503 lines
17 KiB

//******************************************************************************
//
// PROVREG.H
//
// Copyright (C) 1996-1999 Microsoft Corporation
//
//******************************************************************************
#ifndef __EVENTPROV_REG__H_
#define __EVENTPROV_REG__H_
#include <time.h>
#include <wbemidl.h>
#include <arrtempl.h>
#include <analyser.h>
#include <evaltree.h>
#include <sync.h>
#include <filtprox.h>
#include <unload.h>
#include <postpone.h>
#include <mtgtpckt.h>
#include <newobj.h>
class CEventProviderCache;
class CEventProviderWatchInstruction : public CBasicUnloadInstruction
{
protected:
CEventProviderCache* m_pCache;
static CWbemInterval mstatic_Interval;
public:
CEventProviderWatchInstruction(CEventProviderCache* pCache);
static void staticInitialize(IWbemServices* pRoot);
HRESULT Fire(long lNumTimes, CWbemTime NextFiringTime);
};
class CProviderSinkServer;
class CFilterStub : public IWbemFilterStub, public IWbemMultiTarget,
public IWbemFetchSmartMultiTarget, public IWbemSmartMultiTarget,
public IWbemEventProviderRequirements
{
protected:
CProviderSinkServer* m_pSink;
CWbemClassCache m_ClassCache;
public:
CFilterStub(CProviderSinkServer* pSink) : m_pSink(pSink){}
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv);
HRESULT STDMETHODCALLTYPE RegisterProxy(IWbemFilterProxy* pProxy);
HRESULT STDMETHODCALLTYPE UnregisterProxy(IWbemFilterProxy* pProxy);
HRESULT STDMETHODCALLTYPE DeliverEvent(DWORD dwNumEvents,
IWbemClassObject** apEvents,
WBEM_REM_TARGETS* aTargets,
long lSDLength, BYTE* pSD);
HRESULT STDMETHODCALLTYPE DeliverStatus(long lFlags, HRESULT hresStatus,
LPCWSTR wszStatus, IWbemClassObject* pErrorObj,
WBEM_REM_TARGETS* aTargets,
long lSDLength, BYTE* pSD);
HRESULT STDMETHODCALLTYPE GetSmartMultiTarget(
IWbemSmartMultiTarget** ppSmartMultiTarget );
HRESULT STDMETHODCALLTYPE DeliverEvent(DWORD dwNumEvents, DWORD dwBuffSize,
BYTE* pBuffer,
WBEM_REM_TARGETS* aTargets,
long lSDLength, BYTE* pSD);
HRESULT STDMETHODCALLTYPE DeliverProviderRequest(long lFlags);
};
class CEssMetaData;
class CProviderSinkServer : public IUnknown
{
public:
struct CEventDestination
{
WBEM_REMOTE_TARGET_ID_TYPE m_id;
CAbstractEventSink* m_pSink;
CEventDestination(WBEM_REMOTE_TARGET_ID_TYPE Id,
CAbstractEventSink* pSink);
CEventDestination(const CEventDestination& Other);
~CEventDestination();
};
typedef CUniquePointerArray<CEventDestination> TDestinationArray;
protected:
long m_lRef;
CRefedPointerArray<IWbemFilterProxy> m_apProxies;
TDestinationArray m_apDestinations;
TDestinationArray m_apPreviousDestinations;
WBEM_REMOTE_TARGET_ID_TYPE m_idNext;
CWStringArray m_awsDefinitionQueries;
IWbemLocalFilterProxy* m_pPseudoProxy;
IWbemEventSink* m_pPseudoSink;
CEssMetaData* m_pMetaData;
CEssNamespace* m_pNamespace;
IWbemEventProviderRequirements* m_pReqSink;
CCritSec m_cs;
long m_lLocks;
protected:
CFilterStub m_Stub;
CInstanceManager m_InstanceManager;
public:
CProviderSinkServer();
HRESULT Initialize(CEssNamespace* pNamespace,
IWbemEventProviderRequirements* pReqSink);
~CProviderSinkServer();
void Clear();
HRESULT GetMainProxy(IWbemEventSink** ppSink);
void GetStatistics(long* plProxies, long* plDestinations,
long* plFilters, long* plTargetLists, long* plTargets,
long* plPostponed);
HRESULT GetDestinations(
TDestinationArray& apDestinations);
INTERNAL CEssNamespace* GetNamespace() {return m_pNamespace;}
protected:
HRESULT AddDestination(CAbstractEventSink* pDest,
WBEM_REMOTE_TARGET_ID_TYPE* pID);
BOOL GetProxies(CRefedPointerArray<IWbemFilterProxy>& apProxies);
HRESULT FindDestinations(long lNum,
IN WBEM_REMOTE_TARGET_ID_TYPE* aidTargets,
RELEASE_ME CAbstractEventSink** apSinks);
public:
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv);
HRESULT AddFilter(LPCWSTR wszQuery, QL_LEVEL_1_RPN_EXPRESSION* pExp,
CAbstractEventSink* pDest,
WBEM_REMOTE_TARGET_ID_TYPE* pidRequest = NULL);
HRESULT RemoveFilter(CAbstractEventSink* pDest,
WBEM_REMOTE_TARGET_ID_TYPE* pidRequest = NULL);
void RemoveAllFilters();
HRESULT AddDefinitionQuery(LPCWSTR wszQuery);
HRESULT AllowUtilizeGuarantee();
void RemoveAllDefinitionQueries();
HRESULT Lock();
void Unlock();
public: // IWbemMultiTarget (forwarded)
HRESULT STDMETHODCALLTYPE DeliverEvent(DWORD dwNumEvents,
IWbemClassObject** apEvents,
WBEM_REM_TARGETS* aTargets,
CEventContext* pContext);
HRESULT DeliverOneEvent(IWbemClassObject* pEvent,
WBEM_REM_TARGETS* pTargets,
CEventContext* pContext);
HRESULT STDMETHODCALLTYPE DeliverStatus(long lFlags, HRESULT hresStatus,
LPCWSTR wszStatus, IWbemClassObject* pErrorObj,
WBEM_REM_TARGETS* aTargets,
CEventContext* pContext);
HRESULT MultiTargetDeliver(IWbemEvent* pEvent, WBEM_REM_TARGETS* pTargets,
CEventContext* pContext);
public: // IWbemFilterStub (forwarded)
HRESULT STDMETHODCALLTYPE RegisterProxy(IWbemFilterProxy* pProxy);
HRESULT STDMETHODCALLTYPE UnregisterProxy(IWbemFilterProxy* pProxy);
public: // IWbemEventProviderRequirements (forwarded)
HRESULT STDMETHODCALLTYPE DeliverProviderRequest(long lFlags);
};
class CEventProviderCache
{
class CRequest
{
private:
CAbstractEventSink* m_pDest;
LPWSTR m_wszQuery;
QL_LEVEL_1_RPN_EXPRESSION* m_pExpr;
IWbemClassObject* m_pEventClass;
DWORD m_dwEventMask;
CClassInfoArray* m_papInstanceClasses;
public:
CRequest(IN CAbstractEventSink* pDest, LPWSTR wszQuery,
QL_LEVEL_1_RPN_EXPRESSION* pExp);
~CRequest();
INTERNAL LPWSTR GetQuery() {return m_wszQuery;}
INTERNAL CAbstractEventSink* GetDest() {return m_pDest;}
INTERNAL QL_LEVEL_1_RPN_EXPRESSION* GetQueryExpr();
DWORD GetEventMask();
HRESULT GetInstanceClasses(CEssNamespace* pNamespace,
INTERNAL CClassInfoArray** ppClasses);
INTERNAL IWbemClassObject* GetEventClass(CEssNamespace* pNamespace);
HRESULT CheckValidity(CEssNamespace* pNamespace);
};
class CRecord : IWbemEventProviderRequirements
{
class CQueryRecord
{
BSTR m_strQuery;
IWbemClassObject* m_pEventClass;
DWORD m_dwEventMask;
CClassInfoArray* m_paInstanceClasses;
QL_LEVEL_1_RPN_EXPRESSION* m_pExpr;
public:
CQueryRecord();
HRESULT Initialize( COPY LPCWSTR wszQuery,
LPCWSTR wszProvName,
CEssNamespace* pNamespace,
bool bSystem);
~CQueryRecord();
HRESULT Update(LPCWSTR wszClassName, IWbemClassObject* pClass);
HRESULT DoesIntersectWithQuery(CRequest& Request,
CEssNamespace* pNamespace);
DWORD GetProvidedEventMask(IWbemClassObject* pClass,
BSTR strClassName);
LPCWSTR GetQuery() {return m_strQuery;}
HRESULT EnsureClasses( CEssNamespace* pNamespace );
void ReleaseClasses();
};
friend class CEventProviderCache;
public:
long m_lRef;
BSTR m_strNamespace;
BSTR m_strName;
BOOL m_bProviderSet;
CUniquePointerArray<CQueryRecord> m_apQueries;
long m_lUsageCount;
long m_lPermUsageCount;
BOOL m_bRecorded;
BOOL m_bNeedsResync;
CWbemTime m_LastUse;
IWbemEventProvider* m_pProvider;
IWbemEventProviderQuerySink* m_pQuerySink;
IWbemEventProviderSecurity* m_pSecurity;
CExecLine m_Line;
bool m_bStarted;
CEssNamespace* m_pNamespace;
CProviderSinkServer* m_pMainSink;
public:
CRecord();
HRESULT Initialize( LPCWSTR wszName, CEssNamespace* pNamespace );
HRESULT SetProvider(IWbemClassObject* pWin32Prov);
HRESULT SetProviderPointer(CEssNamespace* pNamespace,
IWbemEventProvider* pProvider);
HRESULT ResetProvider();
HRESULT SetQueries(CEssNamespace* pNamespace,
IWbemClassObject* pRegistration);
HRESULT SetQueries(CEssNamespace* pNamespace, long lNumQueries,
LPCWSTR* awszQueries);
HRESULT ResetQueries();
HRESULT Load(CEssNamespace* pNamespace);
HRESULT DeactivateFilter(CAbstractEventSink* pDest);
HRESULT CancelAllQueries();
HRESULT STDMETHODCALLTYPE DeliverProviderRequest(long lFlags);
static HRESULT GetProviderInfo(IWbemClassObject* pWin32Prov,
BSTR& strName);
static HRESULT GetRegistrationInfo(IWbemClassObject* pRegistration,
BSTR& strName);
HRESULT ActivateIfNeeded(IN CRequest& Request,
IN CEssNamespace* pNamespace);
BOOL NeedsResync() { return m_bNeedsResync; }
void ResetNeedsResync() { m_bNeedsResync = FALSE; }
BOOL IsEmpty();
void ResetUsage();
void CheckPermanentUsage();
virtual bool DeactivateIfNotUsed();
virtual bool IsUnloadable();
HRESULT Update(LPCWSTR wszClassName, IWbemClassObject* pClass);
DWORD GetProvidedEventMask(IWbemClassObject* pClass, BSTR strClassName);
INTERNAL CProviderSinkServer* GetMainSink() {return m_pMainSink;}
void Lock() {m_pMainSink->Lock();}
void Unlock() {m_pMainSink->Unlock();}
BOOL IsActive() {return (m_pProvider != NULL);}
long GetUsageCount() {return m_lUsageCount;}
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
STDMETHOD(QueryInterface)(REFIID riid, void** ppv) {return E_FAIL;}
~CRecord();
protected:
HRESULT Activate(CEssNamespace* pNamespace, CRequest* pRequest,
WBEM_REMOTE_TARGET_ID_TYPE idRequest);
HRESULT Deactivate( CAbstractEventSink* pDest,
WBEM_REMOTE_TARGET_ID_TYPE idRequest);
HRESULT AddActiveProviderEntryToRegistry();
HRESULT RemoveActiveProviderEntryFromRegistry();
HRESULT AddDefinitionQuery(CEssNamespace* pNamespace, LPCWSTR wszQuery);
HRESULT Exec_LoadProvider(CEssNamespace* pNamespace);
HRESULT Exec_StartProvider(CEssNamespace* pNamespace);
HRESULT Exec_NewQuery(CEssNamespace* pNamespace,
CExecLine::CTurn* pTurn, DWORD dwID,
LPCWSTR wszLanguage, LPCWSTR wszQuery,
CAbstractEventSink* pDest);
HRESULT ActualExecNewQuery(CEssNamespace* pNamespace,
DWORD dwID, LPCWSTR wszLanguage, LPCWSTR wszQuery,
CAbstractEventSink* pDest);
HRESULT Exec_CancelQuery(CEssNamespace* pNamespace,
CExecLine::CTurn* pTurn, DWORD dwId);
CExecLine::CTurn* GetInLine();
void DiscardTurn(CExecLine::CTurn* pTurn);
virtual HRESULT PostponeNewQuery(CExecLine::CTurn* pTurn, DWORD dwId,
LPCWSTR wszQueryLanguage, LPCWSTR wszQuery,
CAbstractEventSink* pDest);
virtual HRESULT PostponeCancelQuery(CExecLine::CTurn* pTurn,
DWORD dwId);
void UnloadProvider();
virtual bool IsSystem() {return false;}
friend class CPostponedNewQuery;
friend class CPostponedCancelQuery;
friend class CPostponedProvideEvents;
protected:
};
class CSystemRecord : public CRecord
{
public:
virtual bool DeactivateIfNotUsed();
virtual bool IsUnloadable();
/* HRESULT PostponeNewQuery(CExecLine::CTurn* pTurn, DWORD dwId,
LPCWSTR wszQueryLanguage, LPCWSTR wszQuery,
CAbstractEventSink* pDest);
HRESULT PostponeCancelQuery(CExecLine::CTurn* pTurn, DWORD dwId); */
virtual bool IsSystem() {return true;}
};
friend class CPostponedNewQuery;
friend class CPostponedCancelQuery;
friend class CEventProviderWatchInstruction;
friend class CPostponedProvideEvents;
CCritSec m_cs;
CRefedPointerArray<CRecord> m_aRecords;
CEssNamespace* m_pNamespace;
CEventProviderWatchInstruction* m_pInstruction;
BOOL m_bInResync;
protected:
long FindRecord(LPCWSTR wszName);
public:
CEventProviderCache(CEssNamespace* pNamespace);
~CEventProviderCache();
HRESULT Shutdown();
HRESULT AddProvider(IWbemClassObject* pWin32Prov);
HRESULT AddSystemProvider(IWbemEventProvider* pProvider, LPCWSTR wszName,
long lNumQueries, LPCWSTR* awszQueries);
HRESULT RemoveProvider(IWbemClassObject* pWin32Prov);
HRESULT CheckProviderRegistration(IWbemClassObject* pRegistration);
HRESULT AddProviderRegistration(IWbemClassObject* pRegistration);
HRESULT RemoveProviderRegistration(IWbemClassObject* pRegistration);
HRESULT LoadProvidersForQuery(LPWSTR wszQuery,
QL_LEVEL_1_RPN_EXPRESSION* pExp,
CAbstractEventSink* pDest);
HRESULT ReleaseProvidersForQuery(CAbstractEventSink* pDest);
DWORD GetProvidedEventMask(IWbemClassObject* pClass);
HRESULT VirtuallyReleaseProviders();
HRESULT CommitProviderUsage();
HRESULT UnloadUnusedProviders(CWbemInterval Interval);
void EnsureUnloadInstruction();
void DumpStatistics(FILE* f, long lFlags);
};
class CPostponedNewQuery : public CPostponedRequest
{
protected:
CEventProviderCache::CRecord* m_pRecord;
DWORD m_dwId;
CCompressedString* m_pcsQuery;
CExecLine::CTurn* m_pTurn;
CAbstractEventSink* m_pDest;
public:
CPostponedNewQuery(CEventProviderCache::CRecord* pRecord, DWORD dwId,
LPCWSTR wszQueryLanguage, LPCWSTR wszQuery,
CExecLine::CTurn* pTurn, CAbstractEventSink* pDest);
~CPostponedNewQuery();
HRESULT Execute(CEssNamespace* pNamespace);
BOOL DoesHoldTurn() { return TRUE; }
void* operator new(size_t nSize);
void operator delete(void* p);
};
class CPostponedCancelQuery : public CPostponedRequest
{
protected:
DWORD m_dwId;
CEventProviderCache::CRecord* m_pRecord;
CExecLine::CTurn* m_pTurn;
public:
CPostponedCancelQuery(CEventProviderCache::CRecord* pRecord,
CExecLine::CTurn* pTurn, DWORD dwId)
: m_pRecord(pRecord), m_dwId(dwId), m_pTurn(pTurn)
{
m_pRecord->AddRef();
}
~CPostponedCancelQuery()
{
if(m_pTurn)
m_pRecord->DiscardTurn(m_pTurn);
m_pRecord->Release();
}
HRESULT Execute(CEssNamespace* pNamespace)
{
HRESULT hres = m_pRecord->Exec_CancelQuery(pNamespace, m_pTurn, m_dwId);
m_pTurn = NULL;
return hres;
}
BOOL DoesHoldTurn() { return TRUE; }
};
class CPostponedProvideEvents : public CPostponedRequest
{
protected:
DWORD m_dwId;
CEventProviderCache::CRecord* m_pRecord;
CExecLine::CTurn* m_pTurn;
public:
CPostponedProvideEvents(CEventProviderCache::CRecord* pRecord)
: m_pRecord(pRecord)
{
m_pRecord->AddRef();
}
~CPostponedProvideEvents()
{
m_pRecord->Release();
}
HRESULT Execute(CEssNamespace* pNamespace)
{
HRESULT hres = m_pRecord->Exec_StartProvider(pNamespace);
return hres;
}
BOOL DoesHoldTurn() { return TRUE; }
};
class CPostponedSinkServerShutdown : public CPostponedRequest
{
protected:
CWbemPtr<CProviderSinkServer> m_pSinkServer;
public:
CPostponedSinkServerShutdown( CProviderSinkServer* pSinkServer )
: m_pSinkServer( pSinkServer ) { }
HRESULT Execute( CEssNamespace* pNamespace )
{
m_pSinkServer->Clear();
return WBEM_S_NO_ERROR;
}
};
#endif