Leaked source code of windows server 2003
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.
 
 
 
 
 
 

219 lines
7.7 KiB

//=============================================================================
//
// Copyright (c) 1996-1999, Microsoft Corporation, All rights reserved
//
// ESSSINK.H
//
// This files defines the class that implements IWbemObjectSink for the ESS.
//
// Classes defined:
//
// CEssObjectSink
//
// History:
//
// 11/27/96 a-levn Compiles
//
//=============================================================================
#ifndef __ESSSINK__H_
#define __ESSSINK__H_
#include <wbemidl.h>
#include <wbemint.h>
#include <unk.h>
#include <comutl.h>
#include "parmdefs.h"
#include "essutils.h"
//*****************************************************************************
//
// class CEssObjectSink
//
// This class implements IWbemObjectSink interface for ESS, including the
// automation part. A pointer to this object is given to WinMgmt at startup
// and it serves as the only communication port into the ESS.
//
//*****************************************************************************
class CEss;
class CEssObjectSink : public CUnk
{
private:
CEss* m_pEss;
BOOL m_bShutdown;
CEssSharedLock m_Lock;
_IWmiCoreServices* m_pCoreServices;
IClassFactory *m_pIFactory;
//
// Since we rely on wbem context to contain information about reentrant
// calls, we need to ensure that an external client cannot fool us.
// Since reentrant calls can only be made on behalf of an event provider
// and since event providers are local and trusted, we can detect
// rogue wbem contexts by checking for the presence of a random value
// in the context. Only a local provider and us would ever know this
// secret value and since local providers never share the contexts with
// other non-trusted parties, we can set the secret value in the context
// and verify the secret value on reentrant calls.
//
#define SECRET_SIZE 16
BYTE m_achSecretBytes[SECRET_SIZE];
HRESULT SetSecret( IWbemContext* pContext );
HRESULT VerifySecret( IWbemContext* pContext );
HRESULT PrepareCurrentEssThreadObject( IWbemContext* pContext );
protected:
typedef CImpl<IWbemEventSubsystem_m4, CEssObjectSink> TImplESS;
class XESS : public TImplESS
{
public:
XESS(CEssObjectSink* pObject) : TImplESS(pObject)
{}
STDMETHOD(ProcessInternalEvent)(long lSendType, LPCWSTR str1, LPCWSTR str2,
LPCWSTR str3, DWORD dw1, DWORD dw2, DWORD dwObjectCount,
_IWmiObject** apObjects, IWbemContext* pContext);
STDMETHOD(VerifyInternalEvent)(long lSendType, LPCWSTR str1, LPCWSTR str2,
LPCWSTR str3, DWORD dw1, DWORD dw2, DWORD dwObjectCount,
_IWmiObject** apObjects, IWbemContext* pContext);
STDMETHOD(SetStatus)(long, long, BSTR, IWbemClassObject*)
{return WBEM_S_NO_ERROR;}
STDMETHOD(RegisterNotificationSink)(LPCWSTR wszNamespace,
LPCWSTR wszQueryLanguage, LPCWSTR wszQuery, long lFlags,
IWbemContext* pContext, IWbemObjectSink* pSink);
STDMETHOD(RemoveNotificationSink)(IWbemObjectSink* pSink);
STDMETHOD(GetNamespaceSink)(LPCWSTR wszNamespace,
IWbemObjectSink** ppSink);
STDMETHOD(Initialize)(LPCWSTR wszServer, IWbemLocator* pAdminLocator,
IUnknown* pServices);
STDMETHOD(Shutdown)();
STDMETHOD(LastCallForCore)(LONG lSystemShutDown);
} m_XESS;
friend XESS;
typedef CImpl<_IWmiESS, CEssObjectSink> TImplNewESS;
class XNewESS : public TImplNewESS
{
public:
XNewESS(CEssObjectSink* pObject) : TImplNewESS(pObject)
{}
STDMETHOD(Initialize)(long lFlags, IWbemContext* pCtx,
_IWmiCoreServices* pServices);
STDMETHOD(ExecNotificationQuery)(LPCWSTR wszNamespace,
LPCWSTR wszQueryText, long lFlags,
IWbemContext* pContext, IWbemObjectSink* pSink);
STDMETHOD(CancelAsyncCall)(IWbemObjectSink* pSink);
STDMETHOD(QueryObjectSink)(LPCWSTR wszNamespace,
IWbemObjectSink** ppSink);
} m_XNewESS;
friend XNewESS;
typedef CImpl<IWbemShutdown, CEssObjectSink> TImplShutdown;
class XShutdown : public TImplShutdown
{
public:
XShutdown(CEssObjectSink* pObject) : TImplShutdown(pObject)
{}
STDMETHOD(Shutdown)( long lFlags,
ULONG uMaxMilliseconds,
IWbemContext* pCtx );
} m_XShutdown;
friend XShutdown;
typedef CImpl<_IWmiCoreWriteHook, CEssObjectSink> TImplHook;
class XHook : public TImplHook
{
public:
XHook(CEssObjectSink* pObject) : TImplHook(pObject)
{}
STDMETHOD(PrePut)(long lFlags, long lUserFlags, IWbemContext* pContext,
IWbemPath* pPath, LPCWSTR wszNamespace,
LPCWSTR wszClass, _IWmiObject* pCopy);
STDMETHOD(PostPut)(long lFlags, HRESULT hApiResult,
IWbemContext* pContext,
IWbemPath* pPath, LPCWSTR wszNamespace,
LPCWSTR wszClass, _IWmiObject* pNew,
_IWmiObject* pOld);
STDMETHOD(PreDelete)(long lFlags, long lUserFlags,
IWbemContext* pContext,
IWbemPath* pPath, LPCWSTR wszNamespace,
LPCWSTR wszClass);
STDMETHOD(PostDelete)(long lFlags, HRESULT hApiResult,
IWbemContext* pContext,
IWbemPath* pPath, LPCWSTR wszNamespace,
LPCWSTR wszClass, _IWmiObject* pOld);
} m_XHook;
friend XHook;
public:
CEssObjectSink(CLifeControl* pControl, IUnknown* pOuter = NULL);
~CEssObjectSink();
void* GetInterface(REFIID riid);
};
class CEssNamespaceSink : public CUnk
{
CEss* m_pEss;
BSTR m_strNamespace;
protected:
typedef CImpl<IWbemObjectSink, CEssNamespaceSink> TImplSink;
class XSink : public TImplSink
{
public:
XSink(CEssNamespaceSink* pObject) : TImplSink(pObject){}
STDMETHOD(Indicate)(long lObjectCount, IWbemClassObject** pObjArray);
STDMETHOD(SetStatus)(long, long, BSTR, IWbemClassObject*)
{return WBEM_S_NO_ERROR;}
} m_XSink;
friend XSink;
public:
CEssNamespaceSink(CEss* pEss, CLifeControl* pControl,
IUnknown* pOuter = NULL);
HRESULT Initialize(LPCWSTR wszNamespace);
~CEssNamespaceSink();
void* GetInterface(REFIID riid);
};
/****************************************************************************
CEssInternalOperationSink
This sink handles the setting up of a new ess thread object and then
delegates calls to the specified sink. The purpose of this is so that
internal ess operations can be performed asynchronously. For example,
for class change notifications we register a sink that reactivates the
associated filter. In order to actually perform the reactivation, the
calling thread must be set up appropriately.
*****************************************************************************/
class CEssInternalOperationSink
: public CUnkBase< IWbemObjectSink, &IID_IWbemObjectSink >
{
CWbemPtr<IWbemObjectSink> m_pSink;
public:
CEssInternalOperationSink( IWbemObjectSink* pSink ) : m_pSink( pSink ) {}
STDMETHOD(Indicate)( long cObjects, IWbemClassObject** ppObjs );
STDMETHOD(SetStatus)(long, long, BSTR, IWbemClassObject*);
};
#endif