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

218 lines
6.6 KiB
C++

/*++
Copyright (C) 1998-2001 Microsoft Corporation
Module Name:
MTGTMRSH.H
Abstract:
Multi Target Marshaling.
History:
--*/
#include <unk.h>
#include <wbemidl.h>
#include <wbemint.h>
#include <wbemcomn.h>
#include <sync.h>
#include <fastall.h>
#include "wbemclasscache.h"
#include "wbemclasstoidmap.h"
#include "mtgtpckt.h"
//***************************************************************************
//
// class CMultiTargetFactoryBuffer
//
// DESCRIPTION:
//
// This class provides the proxy stub factory so that we can provide custom
// facelets and stublets for the IWbemObjectSink interface.
//
//***************************************************************************
class CMultiTargetFactoryBuffer : public CUnk
{
// We don't want to AddRef the life control, but
// we need to let objects we create AddRef it, so the
// base class won't keep this pointer, but we will.
CLifeControl* m_pLifeControl;
protected:
class XEnumFactory : public CImpl<IPSFactoryBuffer, CMultiTargetFactoryBuffer>
{
public:
XEnumFactory(CMultiTargetFactoryBuffer* pObj) :
CImpl<IPSFactoryBuffer, CMultiTargetFactoryBuffer>(pObj)
{}
STDMETHOD(CreateProxy)(IN IUnknown* pUnkOuter, IN REFIID riid,
OUT IRpcProxyBuffer** ppProxy, void** ppv);
STDMETHOD(CreateStub)(IN REFIID riid, IN IUnknown* pUnkServer,
OUT IRpcStubBuffer** ppStub);
} m_XEnumFactory;
public:
CMultiTargetFactoryBuffer(CLifeControl* pControl, IUnknown* pUnkOuter = NULL)
: CUnk(NULL, pUnkOuter), m_XEnumFactory(this), m_pLifeControl( pControl )
{}
void* GetInterface(REFIID riid);
friend XEnumFactory;
};
//***************************************************************************
//
// class CMultiTargetProxyBuffer
//
// DESCRIPTION:
//
// This class provides the facelet for the IWbemObjectSink interface.
//
// Trick #1: This object is derived from IRpcProxyBuffer since IRpcProxyBuffer
// is its "internal" interface --- the interface that does not delegate to the
// aggregator. (Unlike in normal objects, where that interface is IUnknown)
//
//***************************************************************************
class CMultiTargetProxyBuffer : public IRpcProxyBuffer
{
private:
IRpcProxyBuffer* m_pOldProxy;
IWbemMultiTarget* m_pOldProxyMultiTarget;
BOOL m_fTriedSmartEnum;
BOOL m_fUseSmartMultiTarget;
HANDLE m_hSmartNextMutex;
GUID m_guidSmartEnum;
IWbemSmartMultiTarget* m_pSmartMultiTarget;
CRITICAL_SECTION m_cs;
bool m_fRemote;
protected:
CLifeControl* m_pControl;
IUnknown* m_pUnkOuter;
long m_lRef;
protected:
class XMultiTargetFacelet : public IWbemMultiTarget, IClientSecurity
{
protected:
CMultiTargetProxyBuffer* m_pObject;
CWbemClassToIdMap m_ClassToIdMap;
public:
XMultiTargetFacelet(CMultiTargetProxyBuffer* pObject) : m_pObject(pObject){};
~XMultiTargetFacelet(){};
ULONG STDMETHODCALLTYPE AddRef()
{return m_pObject->m_pUnkOuter->AddRef();}
ULONG STDMETHODCALLTYPE Release()
{return m_pObject->m_pUnkOuter->Release();}
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv);
// IWbemMultiTarget Methods
STDMETHOD(DeliverEvent)(
/*[in]*/ DWORD dwNumEvents,
/*[in]*/ IWbemClassObject** apEvents,
/*[in]*/ WBEM_REM_TARGETS* aTargets,
/*[in]*/ long lSDLength,
/*[in, size_is(lSDLength)]*/ BYTE* pSD);
STDMETHOD(DeliverStatus)(
/*[in]*/ long lFlags,
/*[in]*/ HRESULT hresStatus,
/*[in, string]*/ LPCWSTR wszStatus,
/*[in]*/ IWbemClassObject* pErrorObj,
/*[in]*/ WBEM_REM_TARGETS* pTargets,
/*[in]*/ long lSDLength,
/*[in, size_is(lSDLength)]*/ BYTE* pSD);
// IClientSecurity Methods
STDMETHOD(QueryBlanket)( IUnknown* pProxy, DWORD* pAuthnSvc, DWORD* pAuthzSvc,
OLECHAR** pServerPrincName, DWORD* pAuthnLevel, DWORD* pImpLevel,
void** pAuthInfo, DWORD* pCapabilities );
STDMETHOD(SetBlanket)( IUnknown* pProxy, DWORD AuthnSvc, DWORD AuthzSvc,
OLECHAR* pServerPrincName, DWORD AuthnLevel, DWORD ImpLevel,
void* pAuthInfo, DWORD Capabilities );
STDMETHOD(CopyProxy)( IUnknown* pProxy, IUnknown** pCopy );
} m_XMultiTargetFacelet;
friend XMultiTargetFacelet;
protected:
IRpcChannelBuffer* m_pChannel;
IRpcChannelBuffer* GetChannel( void ) { return m_pChannel; };
// Initialize the smart enumerator
HRESULT InitSmartMultiTarget( BOOL fSetBlanket = FALSE, DWORD AuthnSvc = RPC_C_AUTHN_WINNT,
DWORD AuthzSvc = RPC_C_AUTHZ_NONE, OLECHAR* pServerPrincName = NULL,
DWORD AuthnLevel = RPC_C_AUTHN_LEVEL_DEFAULT, DWORD ImpLevel = RPC_C_IMP_LEVEL_IMPERSONATE,
void* pAuthInfo = NULL, DWORD Capabilities = EOAC_NONE );
public:
CMultiTargetProxyBuffer(CLifeControl* pControl, IUnknown* pUnkOuter);
~CMultiTargetProxyBuffer();
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv);
STDMETHOD(Connect)(IRpcChannelBuffer* pChannel);
STDMETHOD_(void, Disconnect)();
};
//***************************************************************************
//
// class CMultiTargetStubBuffer
//
// DESCRIPTION:
//
// This class provides the stublet for the IWbemObjectSink interface.
//
//***************************************************************************
class CMultiTargetStubBuffer : public CUnk
{
private:
IRpcStubBuffer* m_pOldStub;
protected:
class XMultiTargetStublet : public CImpl<IRpcStubBuffer, CMultiTargetStubBuffer>
{
IWbemObjectSink* m_pServer;
LONG m_lConnections;
public:
XMultiTargetStublet(CMultiTargetStubBuffer* pObj);
~XMultiTargetStublet();
STDMETHOD(Connect)(IUnknown* pUnkServer);
STDMETHOD_(void, Disconnect)();
STDMETHOD(Invoke)(RPCOLEMESSAGE* pMessage, IRpcChannelBuffer* pBuffer);
STDMETHOD_(IRpcStubBuffer*, IsIIDSupported)(REFIID riid);
STDMETHOD_(ULONG, CountRefs)();
STDMETHOD(DebugServerQueryInterface)(void** ppv);
STDMETHOD_(void, DebugServerRelease)(void* pv);
private:
friend CMultiTargetStubBuffer;
} m_XMultiTargetStublet;
friend XMultiTargetStublet;
public:
CMultiTargetStubBuffer(CLifeControl* pControl, IUnknown* pUnkOuter = NULL)
: CUnk(pControl, pUnkOuter), m_XMultiTargetStublet(this), m_pOldStub( NULL )
{}
void* GetInterface(REFIID riid);
};