//============================================================================= // // Copyright (c) 1996-1999, Microsoft Corporation, All rights reserved // // ESS.H // // Implements the class that contains all the fuctionality of the ESS by // virtue of containing all the necessary components. // // Classes defined: // // CEss // // History: // // 11/27/96 a-levn Compiles. // 1/6/97 a-levn Updated to initialize TSS. // //============================================================================= #ifndef __ESS__H_ #define __ESS__H_ #include "pragmas.h" #include "nsrep.h" #include "equeue.h" #include "wbemtss.h" #include "essself.h" #include #include #include #include //***************************************************************************** // // class CEss // // This class is the central "collection point" for the ESS. It contains the // list of namespace objects and some shared components. // //***************************************************************************** class CInitActiveNamespacesRequest; class CInitNamespaceRequest; class CEss { protected: typedef std::map > TNamespaceMap; typedef TNamespaceMap::iterator TNamespaceIterator; TNamespaceMap m_mapNamespaces; CWinMgmtTimerGenerator m_TimerGenerator; CEventQueue m_Queue; IWbemLocator* m_pLocator; _IWmiCoreServices* m_pCoreServices; _IWmiProvSS* m_pProvSS; _IWmiProvSSSink* m_pProvSSSink; LPWSTR m_wszServerName; IWbemDecorator* m_pDecorator; IWbemLifeControl* m_pLifeControl; long m_lObjectCount; long m_lNumActiveNamespaces; CEventLog m_EventLog; CRegistryMinMaxLimitControl m_LimitControl; IWbemTokenCache* m_pTokenCache; HANDLE m_hReadyEvent; BOOL m_bLastCallForCoreCalled; CCritSec m_cs; // // the number of namespaces that were active on startup by are still // initializating. // long m_lOutstandingActiveNamespaceInit; // // we use a background thread to perform recovery of guaranteed // event deliveries. // HANDLE m_hRecoveryThread; HRESULT InitiateRecovery(); static ULONG WINAPI PerformRecovery( void* pCtx ); HANDLE m_hExitBootPhaseTimer; static void CALLBACK ExitBootPhaseCallback( LPVOID, BOOLEAN ); void ExecuteDeferredNSInitRequests(); // // If we are in the boot phase, then we will queue up the ns init events // until we're out of the boot phase. // CPointerArray m_aDeferredNSInitRequests; BOOL m_bMSMQDisabled; public: CEss(); ~CEss(); void TriggerDeferredInitialization(); HRESULT Initialize( LPCWSTR wszServer, long lFlags, _IWmiCoreServices* pCoreServices, IWbemDecorator* pDecorator ); HRESULT Shutdown(BOOL bIsSystemShutdown); HRESULT LastCallForCore(LONG lSystemShutDown); HRESULT GetNamespaceObject( LPCWSTR wszNamespace, BOOL bEnsureActivation, RELEASE_ME CEssNamespace** ppNamespace ); HRESULT GetNamespacePointer( LPCWSTR wszNamespace, BOOL bRepositoryOnly, RELEASE_ME IWbemServices** ppNamespace ); HRESULT Decorate(IWbemClassObject* pObject, LPCWSTR wszNamespace); HRESULT GetProviderFactory(LPCWSTR wszNamespace, IWbemServices* pNamespace, _IWmiProviderFactory** ppFactory); HRESULT ReloadProvider( long lFlags, LPCWSTR wszNamespace, LPCWSTR wszName ); HRESULT PurgeNamespace(LPCWSTR wszNamespace); HRESULT ProcessEvent(READ_ONLY CEventRepresentation& Event, long lFlags); HRESULT ProcessQueryObjectSinkEvent( READ_ONLY CEventRepresentation& Event ); HRESULT VerifyInternalEvent(READ_ONLY CEventRepresentation& Event); HRESULT RegisterNotificationSink(WBEM_CWSTR wszNamespace, WBEM_CWSTR wszQueryLanguage, WBEM_CWSTR wszQuery, long lFlags, IWbemContext* pContext, IWbemObjectSink* pSink); HRESULT RemoveNotificationSink(IWbemObjectSink* pSink); CWinMgmtTimerGenerator& GetTimerGenerator() {return m_TimerGenerator;} CEventLog& GetEventLog() {return m_EventLog;} void IncrementObjectCount(); void DecrementObjectCount(); HRESULT SetNamespaceActive(LPCWSTR wszNamespace); HRESULT SetNamespaceInactive(LPCWSTR wszNamespace); HRESULT SaveActiveNamespaceList(); HRESULT RequestStartOnBoot(BOOL bStart = TRUE); HRESULT InitializeTimerGenerator(LPCWSTR wszNamespace, IWbemServices* pNamespace); static HRESULT DecorateObject(IWbemClassObject* pObj, LPCWSTR wszNamespace); HRESULT EnqueueDeliver(CQueueingEventSink* pDest); HRESULT Enqueue(CExecRequest* pReq); HRESULT AddSleepCharge(DWORD dwSleep); HRESULT AddCache(); HRESULT RemoveCache(); HRESULT AddToCache(DWORD dwAdd, DWORD dwMemberTotal, DWORD* pdwSleep = NULL); HRESULT RemoveFromCache(DWORD dwRemove); HRESULT GetToken(PSID pSid, IWbemToken** ppToken); HRESULT CreatePersistentQueue( LPCWSTR wszQueueName, DWORD dwQos ); HRESULT DestroyPersistentQueue( LPCWSTR wszQueueName ); void DumpStatistics(FILE* f, long lFlags); // // each namespace that is active on startup notifies us when it has // finished initialization. // void NotifyActiveNamespaceInitComplete(); protected: typedef CPointerArray InitActiveNsRequestList; HRESULT PrepareNamespaceInitRequest( LPCWSTR wszNamespace, CInitActiveNamespacesRequest* pRequest ); HRESULT PrepareNamespaceInitRequests( IWbemServices* pRoot, BOOL bRediscover, InitActiveNsRequestList& aRequests); HRESULT RecursivePrepareNamespaceInitRequests( LPCWSTR wszNamespace, IWbemServices* pNamespace, CInitActiveNamespacesRequest* pRequest); HRESULT ScheduleNamespaceInitialize( CExecRequest* pReq ); HRESULT LoadActiveNamespaces( IWbemServices* pRoot, BOOL bRediscover ); HRESULT CreateNamespaceObject( LPCWSTR wszNormName, CEssNamespace** ppNamespace ); HRESULT LoadNamespaceObject( LPCWSTR wszNamespace, BOOL bKnownEmpty, RELEASE_ME CEssNamespace** ppNamespace ); inline HRESULT GetQueueManager( IWmiMessageQueueManager** ppQueueMgr ); friend class CInObjectCount; }; class CInObjectCount { protected: CEss* m_pEss; public: CInObjectCount(CEss* pEss) : m_pEss(pEss) { m_pEss->IncrementObjectCount(); } ~CInObjectCount() { m_pEss->DecrementObjectCount(); } }; #endif