|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1993.
//
// File: propifs.hxx
//
// Contents: Common definitions for object activation.
//
// Classes: InstantiationInfo
// ServerLocationInfo
//
// History: 03-Feb-98 Vinaykr Created
//
//--------------------------------------------------------------------------
#ifndef __PROPIFS_HXX__
#define __PROPIFS_HXX__
#include <Serializ.h>
#include <immact.h>
#include <activate.h>
#include <privact.h>
#include <custmact.h>
#include <serial.hxx>
#include <actprops.hxx>
#ifndef OLESCM
#include <context.hxx>
#endif
#define ActMemAlloc(cb) MIDL_user_allocate(cb)
#define ActMemFree(pv) MIDL_user_free(pv)
#define MAX_ACTARRAY_SIZE 10
extern HRESULT ReleaseIFD( MInterfacePointer *pIRD);
static inline WCHAR *makeWStringCopy(WCHAR *pwszStr) { DWORD l = lstrlenW(pwszStr); WCHAR * newstr = (WCHAR*) ActMemAlloc((l+1)*sizeof(WCHAR)); if (newstr != NULL) lstrcpyW(newstr,pwszStr);
return newstr; }
//----------------------------------------------------------------------
// Prototypes for the CoMarshal family of functions
//----------------------------------------------------------------------
// These are function pointers to avoid using them inside of rpcss.dll.
// (rpcss.dll may not link with ole32.dll)
typedef HRESULT (__stdcall *PFN_COMARSHALINTERFACE)(IN LPSTREAM pStm, IN REFIID riid, IN LPUNKNOWN pUnk, IN DWORD dwDestContext, IN LPVOID pvDestContext, IN DWORD mshlflags); extern PFN_COMARSHALINTERFACE pfnCoMarshalInterface;
typedef HRESULT (__stdcall *PFN_COGETMARSHALSIZEMAX)(IN LPDWORD pSz, IN REFIID riid, IN LPUNKNOWN pUnk, IN DWORD dwDestContext, IN LPVOID pvDestContext, IN DWORD mshlflags); extern PFN_COGETMARSHALSIZEMAX pfnCoGetMarshalSizeMax;
typedef HRESULT (__stdcall *PFN_COUNMARSHALINTERFACE)(IN LPSTREAM pStm, IN REFIID riid, OUT LPVOID FAR* ppv); extern PFN_COUNMARSHALINTERFACE pfnCoUnmarshalInterface;
typedef HRESULT (__stdcall *PFN_CORELEASEMARSHALDATA)(IN LPSTREAM pStm); extern PFN_CORELEASEMARSHALDATA pfnCoReleaseMarshalData;
// Call this to initialize the function pointers.
void InitMarshalling(void);
class SerializableProperty: public ISerializable { public: SerializableProperty():_parent(0),_unSerialized(FALSE),_added(FALSE) {}
//Serialization Methods
STDMETHOD (SetParent) ( ISerializableParent *pParent) { _parent = pParent; return S_OK; }
inline BOOL IsAdded() { return _added; }
inline void Added() { _added = TRUE; }
inline BOOL IsInproc(Serializer *pSer, OUT DWORD *pdwMaxDestCtx, OUT DWORD *pdwCurrDestCtx) { pSer->GetCurrDestCtx(pdwCurrDestCtx); pSer->GetMaxDestCtx(pdwMaxDestCtx); return ((*pdwCurrDestCtx == MSHCTX_CROSSCTX)|| (*pdwCurrDestCtx == MSHCTX_INPROC)); }
inline BOOL IsInproc(Serializer *pSer) { DWORD dwCurrDestCtx; pSer->GetCurrDestCtx(&dwCurrDestCtx); return ((dwCurrDestCtx == MSHCTX_CROSSCTX)|| (dwCurrDestCtx == MSHCTX_INPROC)); }
protected: ISerializableParent *_parent; BOOL _unSerialized; BOOL _added; };
class InstantiationInfo : public IInstantiationInfo, public SerializableProperty { public: InstantiationInfo() { ZeroMemory(&_instantiationInfoData, sizeof(InstantiationInfoData)); _instantiationInfoData.clientCOMVersion.MajorVersion = COM_MAJOR_VERSION; _instantiationInfoData.clientCOMVersion.MinorVersion = COM_MINOR_VERSION; }
virtual ~InstantiationInfo() { if (_instantiationInfoData.pIID != _pIIDs) ActMemFree(_instantiationInfoData.pIID); }
// Methods from IUnknown
STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj); STDMETHOD_(ULONG,AddRef) ( void ); STDMETHOD_(ULONG,Release) ( void );
inline HRESULT SetClientCOMVersion(COMVERSION version) { _instantiationInfoData.clientCOMVersion = version; return S_OK; }
inline HRESULT GetClientCOMVersion(COMVERSION **ppVersion) { *ppVersion = &_instantiationInfoData.clientCOMVersion; return S_OK; }
inline HRESULT SetClsid(IN REFGUID clsid) { _instantiationInfoData.classId = clsid; return S_OK; }
inline HRESULT GetClsid(OUT GUID *pClsid) { *pClsid = _instantiationInfoData.classId; return S_OK; }
inline HRESULT SetClsctx(IN DWORD dwClsctx) { _instantiationInfoData.classCtx = dwClsctx; return S_OK; }
inline HRESULT GetClsctx(OUT DWORD *pdwClsctx) { *pdwClsctx = _instantiationInfoData.classCtx; return S_OK; }
inline HRESULT SetActivationFlags(IN DWORD dwActvFlags) { _instantiationInfoData.actvflags = dwActvFlags; return S_OK; }
inline HRESULT GetActivationFlags(OUT DWORD *pdwActvFlags) { *pdwActvFlags = _instantiationInfoData.actvflags; return S_OK; }
inline HRESULT SetInstFlag(IN DWORD flag) { _instantiationInfoData.instFlag = flag; return S_OK; }
inline HRESULT GetInstFlag(OUT DWORD *pFlag) { *pFlag = _instantiationInfoData.instFlag; return S_OK; }
inline HRESULT SetIsSurrogate() { _instantiationInfoData.fIsSurrogate = TRUE; return S_OK; }
inline HRESULT GetIsSurrogate(BOOL *pIsSurrogate) { *pIsSurrogate = _instantiationInfoData.fIsSurrogate; return S_OK; }
inline HRESULT GetRequestedIIDs( OUT DWORD *pcIfs, OUT IID **ppIID) { *pcIfs = _instantiationInfoData.cIID; *ppIID = _instantiationInfoData.pIID; return S_OK; }
inline HRESULT AddRequestedIIDs( IN DWORD cIfs, IN IID *pIID) { IID *newiids; //--------------------------------------------------------------------
// Check if we need to allocate
//--------------------------------------------------------------------
if ((_unSerialized) || (cIfs + _instantiationInfoData.cIID) > MAX_ACTARRAY_SIZE) {
newiids = (IID*) ActMemAlloc(sizeof(IID) * (cIfs + _instantiationInfoData.cIID));
if (newiids == NULL) return E_OUTOFMEMORY;
//----------------------------------------------------------------
// Copy old into new
//----------------------------------------------------------------
if (_instantiationInfoData.cIID) { memcpy(newiids, _instantiationInfoData.pIID, sizeof(IID)*_instantiationInfoData.cIID);
if (_instantiationInfoData.pIID != _pIIDs) ActMemFree(_instantiationInfoData.pIID); } } else newiids = _pIIDs;
//--------------------------------------------------------------------
// Copy new into array
//--------------------------------------------------------------------
memcpy(&newiids[_instantiationInfoData.cIID], pIID, sizeof(IID)*cIfs);
_instantiationInfoData.pIID = newiids; _instantiationInfoData.cIID += cIfs;
return S_OK; }
//Serialization Methods
STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj); STDMETHOD(Serialize)(IN void *pSer); STDMETHOD(UnSerialize)(IN void *pSer); STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize); STDMETHOD(GetCLSID)(OUT CLSID *pclsid);
private: InstantiationInfoData _instantiationInfoData; IID _pIIDs[MAX_ACTARRAY_SIZE]; };
class ServerLocationInfo: public IServerLocationInfo, public SerializableProperty { public: // ctor/dtor
ServerLocationInfo(); virtual ~ServerLocationInfo();
// Methods from IUnknown
STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj); STDMETHOD_(ULONG,AddRef) ( void ); STDMETHOD_(ULONG,Release) ( void );
STDMETHOD (SetRemoteServerName) (IN WCHAR *pwszMachineName);
STDMETHOD(GetRemoteServerName) (OUT WCHAR **ppwszMachineName) { *ppwszMachineName = _locationInfoData.machineName; return S_OK; }
STDMETHOD (SetProcess) (IN DWORD processId, DWORD dwPRT);
STDMETHOD (GetProcess) (OUT DWORD* pProcessId, DWORD* pdwPRT);
STDMETHOD (SetApartment) (IN APTID apartmentId) { _locationInfoData.apartmentId = apartmentId; return S_OK; }
STDMETHOD (GetApartment) (OUT APTID *pApartmentId) { *pApartmentId = _locationInfoData.apartmentId; return S_OK; }
STDMETHOD (SetContext) (IN IObjContext *pObjectContext) { HRESULT hr = pObjectContext->QueryInterface(IID_IStdObjectContext, (void**)&_pObjectContext); Win4Assert(SUCCEEDED(hr) && "Not COM internal context!"); if (SUCCEEDED(hr)) { // Get an internal ref and release the user ref.
_pObjectContext->InternalAddRef(); _pObjectContext->Release(); } return hr; }
STDMETHOD (GetContext) (OUT IObjContext **ppObjectContext) { CObjectContext *pCtx; GetInternalContext(&pCtx); if (pCtx) { // Return a user counted reference to the context.
pCtx->AddRef(); pCtx->InternalRelease(); *ppObjectContext = (IObjContext*)pCtx; } return S_OK; }
STDMETHOD(Serialize)(IN void *pSer); STDMETHOD(UnSerialize)(IN void *pSer); STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize); STDMETHOD(GetCLSID)(OUT CLSID *pclsid); STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0) { return E_NOTIMPL;}
STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj); HRESULT GetInternalContext(CObjectContext **ppObjectContext) { if (_pObjectContext) _pObjectContext->InternalAddRef(); *ppObjectContext = _pObjectContext; return S_OK; }
// Gives us a non-refcounted ISpecialSystemProperties* interface ptr; we
// need this so we can store/retrieve certain activation state from it.s
void SetSpecialPropsInterface(ISpecialSystemProperties* pISSP) { Win4Assert(!_pISSP && "_pISSP should not be set twice"); _pISSP = pISSP; // no refcount -- we do not release this
};
private: LocationInfoData _locationInfoData; CObjectContext *_pObjectContext; ISpecialSystemProperties* _pISSP; };
class SecurityInfo:public IActivationSecurityInfo, public ILegacyInfo, public SerializableProperty { public: SecurityInfo() { ZeroMemory(&_securityInfoData, sizeof(SecurityInfoData)); }
inline static void freeCOAUTHIDENTITY(COAUTHIDENTITY *id) { if (id) { ActMemFree(id->User); ActMemFree(id->Domain); ActMemFree(id->Password); ActMemFree(id); } }
inline static void freeCOAUTHINFO(COAUTHINFO *info) { if (info) { ActMemFree(info->pwszServerPrincName); freeCOAUTHIDENTITY(info->pAuthIdentityData); ActMemFree(info); } }
inline static void freeCOSERVERINFO(COSERVERINFO *info) { if (info) { ActMemFree(info->pwszName); freeCOAUTHINFO(info->pAuthInfo); ActMemFree(info); } }
virtual ~SecurityInfo() { // Free only if unmarshaled (in which case the
// memory has been allocated by the marshaler)
// We don't do deep copy, client frees these
// blobs after activation.
if (_unSerialized) { freeCOSERVERINFO(_securityInfoData.pServerInfo); freeCOAUTHIDENTITY(_securityInfoData.pAuthIdentityInfo); } }
// Methods from IUnknown
STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj); STDMETHOD_(ULONG,AddRef) ( void ); STDMETHOD_(ULONG,Release) ( void );
// IActivationSecurityInfo Methods
STDMETHOD(SetAuthnFlags)(IN DWORD dwAuthnFlags) { _securityInfoData.dwAuthnFlags = dwAuthnFlags; return S_OK; }
STDMETHOD(GetAuthnFlags)(OUT DWORD *pdwAuthnFlags) { *pdwAuthnFlags = _securityInfoData.dwAuthnFlags; return S_OK; }
STDMETHOD(SetAuthnSvc)(IN DWORD dwAuthnSvc) { return E_NOTIMPL; }
STDMETHOD(GetAuthnSvc)(OUT DWORD *pdwAuthnSvc) { *pdwAuthnSvc = _securityInfoData.pServerInfo->pAuthInfo->dwAuthnSvc; return S_OK; }
STDMETHOD(SetAuthzSvc)(IN DWORD dwAuthzSvc) { return E_NOTIMPL; }
STDMETHOD(GetAuthzSvc)(OUT DWORD *pdwAuthzSvc) { *pdwAuthzSvc = _securityInfoData.pServerInfo->pAuthInfo->dwAuthzSvc; return S_OK; }
STDMETHOD(SetAuthnLevel)(IN DWORD dwAuthnLevel) { return E_NOTIMPL; }
STDMETHOD(GetAuthnLevel)(OUT DWORD *pdwAuthnLevel) { *pdwAuthnLevel = _securityInfoData.pServerInfo->pAuthInfo->dwAuthnLevel; return S_OK; }
STDMETHOD(SetImpLevel)(IN DWORD dwImpLevel) { return E_NOTIMPL; }
STDMETHOD(GetImpLevel)(OUT DWORD *pdwImpLevel) { *pdwImpLevel = _securityInfoData.pServerInfo->pAuthInfo->dwImpersonationLevel; return S_OK; }
STDMETHOD(SetCapabilities)(IN DWORD dwCapabilities) { return E_NOTIMPL; }
STDMETHOD(GetCapabilities)(OUT DWORD *pdwCapabilities) { *pdwCapabilities = _securityInfoData.pServerInfo->pAuthInfo->dwCapabilities; return S_OK; }
STDMETHOD(SetAuthIdentity)(COAUTHIDENTITY *pAuthIdentityData) { _securityInfoData.pAuthIdentityInfo = pAuthIdentityData; return S_OK; }
STDMETHOD(GetAuthIdentity)(OUT COAUTHIDENTITY **ppAuthIdentityData) { *ppAuthIdentityData = _securityInfoData.pAuthIdentityInfo; return S_OK; }
STDMETHOD(SetServerPrincipalName)(LPWSTR pwszServerPrincName) { return E_NOTIMPL; }
STDMETHOD(GetServerPrincipalName)(OUT LPWSTR *ppwszServerPrincName) { *ppwszServerPrincName = _securityInfoData.pServerInfo->pAuthInfo->pwszServerPrincName; return S_OK; }
//ILegacyInfo Methods
STDMETHOD(SetCOSERVERINFO)(IN COSERVERINFO *pServerInfo) { _securityInfoData.pServerInfo = pServerInfo; if ((pServerInfo) && (pServerInfo->pwszName)) { IServerLocationInfo *iloc; QueryInterface(IID_IServerLocationInfo, (void**) &iloc); iloc->SetRemoteServerName(pServerInfo->pwszName); iloc->Release(); } return S_OK; }
STDMETHOD(GetCOSERVERINFO)(OUT COSERVERINFO **ppServerInfo) { *ppServerInfo = _securityInfoData.pServerInfo; return S_OK; }
STDMETHOD(SetCOAUTHINFO)(IN COAUTHINFO *pAuthInfo) { _securityInfoData.pServerInfo->pAuthInfo = pAuthInfo; return S_OK; }
//Methods from IActivationPropertySet
STDMETHOD(Reset)() { if (_unSerialized) { freeCOSERVERINFO(_securityInfoData.pServerInfo); freeCOAUTHIDENTITY(_securityInfoData.pAuthIdentityInfo); _securityInfoData.pServerInfo = 0; _securityInfoData.pAuthIdentityInfo = 0; } _unSerialized = FALSE; return S_OK; }
// ISerializable Methods
STDMETHOD(Serialize)(IN void *pSer); STDMETHOD(UnSerialize)(IN void *pSer); STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize); STDMETHOD(GetCLSID)(OUT CLSID *pclsid); STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0) { return E_NOTIMPL;}
STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
private: SecurityInfoData _securityInfoData; };
class ScmRequestInfo : public IScmRequestInfo, public SerializableProperty { public:
ScmRequestInfo() { ZeroMemory(&_scmRequestInfoData, sizeof(ScmRequestInfoData)); }
inline void freeScmInfo(PRIV_SCM_INFO *pScmInfo) { if (_unSerialized && pScmInfo) { ActMemFree(pScmInfo->pwszWinstaDesktop); ActMemFree(pScmInfo->pEnvBlock); ActMemFree(pScmInfo); } }
inline void freeRemoteRequest(REMOTE_REQUEST_SCM_INFO *remoteRequest) { if (remoteRequest) { ActMemFree(remoteRequest->pRequestedProtseqs); ActMemFree(remoteRequest); } }
virtual ~ScmRequestInfo() { freeScmInfo((PRIV_SCM_INFO *)_scmRequestInfoData.pScmInfo); freeRemoteRequest((REMOTE_REQUEST_SCM_INFO *)_scmRequestInfoData.remoteRequest); }
// Methods from IUnknown
STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj); STDMETHOD_(ULONG,AddRef) ( void ); STDMETHOD_(ULONG,Release) ( void );
// Methods from IScmRequestInfo
STDMETHOD(SetScmInfo)(IN PRIV_SCM_INFO *pScmInfo) { freeScmInfo((PRIV_SCM_INFO *)_scmRequestInfoData.pScmInfo); _scmRequestInfoData.pScmInfo = (CustomPrivScmInfo*)pScmInfo; freeRemoteRequest((REMOTE_REQUEST_SCM_INFO *)_scmRequestInfoData.remoteRequest); _scmRequestInfoData.remoteRequest = NULL; return S_OK; }
STDMETHOD(GetScmInfo)(OUT PRIV_SCM_INFO **ppScmInfo) { *ppScmInfo = (PRIV_SCM_INFO*)_scmRequestInfoData.pScmInfo; return S_OK; }
STDMETHOD(SetRemoteRequestInfo)(IN REMOTE_REQUEST_SCM_INFO *pRemoteReq) { freeRemoteRequest((REMOTE_REQUEST_SCM_INFO *)_scmRequestInfoData.remoteRequest); _scmRequestInfoData.remoteRequest = (customREMOTE_REQUEST_SCM_INFO*) pRemoteReq; freeScmInfo((PRIV_SCM_INFO *)_scmRequestInfoData.pScmInfo); _scmRequestInfoData.pScmInfo = NULL; return S_OK; }
STDMETHOD(GetRemoteRequestInfo)(OUT REMOTE_REQUEST_SCM_INFO **ppRemoteReq) { *ppRemoteReq = (REMOTE_REQUEST_SCM_INFO*) _scmRequestInfoData.remoteRequest; return S_OK; }
STDMETHOD(Reset)() { _scmRequestInfoData.pScmInfo = 0; _scmRequestInfoData.remoteRequest = 0; _unSerialized = FALSE; return S_OK; }
// ISerializable Methods
STDMETHOD(Serialize)(IN void *pSer); STDMETHOD(UnSerialize)(IN void *pSer); STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize); STDMETHOD(GetCLSID)(OUT CLSID *pclsid); STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0) { return E_NOTIMPL;}
STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
private: ScmRequestInfoData _scmRequestInfoData; };
class ContextInfo : public IPrivActivationContextInfo, public SerializableProperty, public IOverrideTargetContext { public:
ContextInfo() { _pClientCtx = 0; _pPrototypeCtx = 0; ZeroMemory(&_contextInfoData, sizeof(ActivationContextInfoData)); _contextInfoData.clientOK = TRUE; _toReleaseIFD = TRUE;
_ctxOverride = GUID_NULL; }
virtual ~ContextInfo() { if (_pClientCtx) _pClientCtx->InternalRelease(); if (_pPrototypeCtx) _pPrototypeCtx->InternalRelease(); if (_contextInfoData.pIFDClientCtx) { if (_toReleaseIFD) { InitMarshalling();
if (pfnCoReleaseMarshalData) { ActivationStream stream((InterfaceData*)_contextInfoData.pIFDClientCtx); pfnCoReleaseMarshalData(&stream); } } ActMemFree(_contextInfoData.pIFDClientCtx); } if (_contextInfoData.pIFDPrototypeCtx) { if (_toReleaseIFD) { InitMarshalling();
if (pfnCoReleaseMarshalData) { ActivationStream stream((InterfaceData*)_contextInfoData.pIFDPrototypeCtx); pfnCoReleaseMarshalData(&stream); } } ActMemFree(_contextInfoData.pIFDPrototypeCtx); } }
// Methods from IUnknown
STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj); STDMETHOD_(ULONG,AddRef) ( void ); STDMETHOD_(ULONG,Release) ( void );
// Methods from IActivationContextInfo
STDMETHOD(SetClientContext)(IN IContext *pctx) { if (_unSerialized) //Can only set on IInitActPropsIn
return E_NOTIMPL;
// We always want to set the internal context.
_pClientCtx = NULL; if (pctx) { // We want an internal reference to the supplied context, not a
// user reference. Hence, we QI for the StdObjectContext and
// take an internal reference.
HRESULT hr = pctx->QueryInterface(IID_IStdObjectContext, (void**)&_pClientCtx); Win4Assert(SUCCEEDED(hr)); if (SUCCEEDED(hr)) { _pClientCtx->InternalAddRef(); _pClientCtx->Release(); } return hr; }
return S_OK; }
STDMETHOD(GetClientContext)(OUT IContext **ppCtx); HRESULT GetInternalClientContext(OUT CObjectContext **ppCtx);
STDMETHOD(SetPrototypeContext)(IN IContext *pctx) { if (_unSerialized) //Can only set on IInitActPropsIn
return E_NOTIMPL;
// We always want to set the internal context.
_pPrototypeCtx = NULL; if (pctx) { // We want an internal reference to the supplied context, not a
// user reference. Hence, we QI for the StdObjectContext and
// take an internal reference.
HRESULT hr = pctx->QueryInterface(IID_IStdObjectContext, (void**)&_pPrototypeCtx); Win4Assert(SUCCEEDED(hr)); if (SUCCEEDED(hr)) { _pPrototypeCtx->InternalAddRef(); _pPrototypeCtx->Release(); } return hr; }
return S_OK; }
STDMETHOD(GetPrototypeContext)(OUT IContext **ppCtx); HRESULT GetInternalPrototypeContext(OUT CObjectContext **ppCtx);
STDMETHOD(PrototypeExists)(BOOL *pBExists) {
if ((_pPrototypeCtx!=NULL) || ((_unSerialized) && (_contextInfoData.pIFDPrototypeCtx != NULL))) *pBExists = TRUE; else *pBExists = FALSE;
return S_OK; }
STDMETHOD(IsClientContextOK)(OUT BOOL *pBOk) { *pBOk = _contextInfoData.clientOK; return S_OK; }
STDMETHOD(SetClientContextNotOK)() { _contextInfoData.clientOK = FALSE; return S_OK; }
// IOverrideTargetContext Methods
STDMETHOD(OverrideTargetContext)(REFGUID guidTargetCtxtId) { _ctxOverride = guidTargetCtxtId; return S_OK; }
// ISerializable Methods
STDMETHOD(Serialize)(IN void *pSer); STDMETHOD(UnSerialize)(IN void *pSer); STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize); STDMETHOD(GetCLSID)(OUT CLSID *pclsid); STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0) { return E_NOTIMPL;}
STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
public: ActivationContextInfoData _contextInfoData; GUID _ctxOverride;
private: CObjectContext *_pClientCtx; CObjectContext *_pPrototypeCtx; BOOL _toReleaseIFD; };
class ScmReplyInfo : public IScmReplyInfo, public SerializableProperty { public:
ScmReplyInfo() { ZeroMemory(&_scmReplyInfoData, sizeof(_scmReplyInfoData)); }
inline void freeResolverInfo() { if (_scmReplyInfoData.pResolverInfo) { ActMemFree(_scmReplyInfoData.pResolverInfo->pwszDllServer); ActMemFree(_scmReplyInfoData.pResolverInfo->pServerORBindings); ActMemFree(_scmReplyInfoData.pResolverInfo->OxidInfo.psa); ActMemFree(_scmReplyInfoData.pResolverInfo); } }
inline void freeRemoteReplyInfo() { if (_scmReplyInfoData.remoteReply) { ActMemFree(_scmReplyInfoData.remoteReply->pdsaOxidBindings); ActMemFree(_scmReplyInfoData.remoteReply); } }
virtual ~ScmReplyInfo() { freeResolverInfo(); freeRemoteReplyInfo(); }
// Methods from IUnknown
STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj); STDMETHOD_(ULONG,AddRef) ( void ); STDMETHOD_(ULONG,Release) ( void );
// Methods from IScmReplyInfo
STDMETHOD(SetRemoteReplyInfo)(IN REMOTE_REPLY_SCM_INFO *pRemoteReq) { _scmReplyInfoData.remoteReply = (customREMOTE_REPLY_SCM_INFO*) pRemoteReq; freeResolverInfo(); _scmReplyInfoData.pResolverInfo = NULL; return S_OK; }
STDMETHOD(GetRemoteReplyInfo)(OUT REMOTE_REPLY_SCM_INFO **ppRemoteReq) { *ppRemoteReq = (REMOTE_REPLY_SCM_INFO*) _scmReplyInfoData.remoteReply; return S_OK; }
STDMETHOD(SetResolverInfo)(IN PRIV_RESOLVER_INFO *pResolverInfo) { _scmReplyInfoData.pResolverInfo = (CustomPrivResolverInfo*)pResolverInfo; freeRemoteReplyInfo(); _scmReplyInfoData.remoteReply = NULL; return S_OK; }
STDMETHOD(GetResolverInfo)(OUT PRIV_RESOLVER_INFO **ppResolverInfo) { *ppResolverInfo = (PRIV_RESOLVER_INFO*)_scmReplyInfoData.pResolverInfo; return S_OK; }
//Methods from IActivationPropertySet
STDMETHOD(Reset)() { _scmReplyInfoData.remoteReply = 0; _scmReplyInfoData.pResolverInfo = 0; _unSerialized = FALSE; return S_OK; }
// ISerializable Methods
STDMETHOD(Serialize)(IN void *pSer); STDMETHOD(UnSerialize)(IN void *pSer); STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize); STDMETHOD(GetCLSID)(OUT CLSID *pclsid); STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0) { return E_NOTIMPL;}
STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
private: ScmReplyInfoData _scmReplyInfoData; };
class InstanceInfo : public IInstanceInfo, public SerializableProperty { public:
InstanceInfo() { ZeroMemory(&_instanceInfoData, sizeof(InstanceInfoData)); _pstg = 0; }
virtual ~InstanceInfo() { if (_pstg) _pstg->Release(); if (_instanceInfoData.fileName) ActMemFree(_instanceInfoData.fileName); //NOTE: need to copy in SCM to always free here
if (_instanceInfoData.ifdROT) ActMemFree(_instanceInfoData.ifdROT); if (_instanceInfoData.ifdStg) ActMemFree(_instanceInfoData.ifdStg); }
// Methods from IUnknown
STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj); STDMETHOD_(ULONG,AddRef) ( void ); STDMETHOD_(ULONG,Release) ( void );
// Methods from IInstanceInfo
STDMETHOD(SetStorage)(IN IStorage *pstg); STDMETHOD(GetStorage)(OUT IStorage **ppstg);
STDMETHOD(GetStorageIFD)(MInterfacePointer **pStgIfd) { if (!_unSerialized) return E_FAIL;
*pStgIfd = _instanceInfoData.ifdStg;
return S_OK; }
STDMETHOD(SetStorageIFD)(MInterfacePointer *pStgIfd) { Win4Assert(_instanceInfoData.ifdStg == NULL); _instanceInfoData.ifdStg = pStgIfd; return S_OK; }
STDMETHOD(SetIfdROT) (IN MInterfacePointer *pIFD) { _instanceInfoData.ifdROT = pIFD; return S_OK; }
STDMETHOD(GetIfdROT) (OUT MInterfacePointer **ppIFD) { *ppIFD = _instanceInfoData.ifdROT; return S_OK; }
STDMETHOD(SetFile)(IN WCHAR *pfile, DWORD mode) { ActMemFree(_instanceInfoData.fileName); _instanceInfoData.fileName = makeWStringCopy(pfile); if (_instanceInfoData.fileName==NULL) return E_OUTOFMEMORY; _instanceInfoData.mode = mode; return S_OK; }
STDMETHOD(GetFile)(OUT WCHAR **ppfile, DWORD *pmode) { *ppfile = _instanceInfoData.fileName; *pmode = _instanceInfoData.mode; return S_OK; }
// ISerializable Methods
STDMETHOD(Serialize)(IN void *pSer); STDMETHOD(UnSerialize)(IN void *pSer); STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize); STDMETHOD(GetCLSID)(OUT CLSID *pclsid); STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0) { return E_NOTIMPL;}
STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
inline void CleanupLocalState(void) { if (_pstg) { _pstg->Release(); _pstg = NULL; } }
private: InstanceInfoData _instanceInfoData; IStorage *_pstg; };
class OpaqueDataInfo : public IOpaqueDataInfo, public SerializableProperty { public:
inline HRESULT CopyOpaqueData(OpaqueData *pDst, OpaqueData *pSrc, DWORD dwLen, BOOL bDeep) { HRESULT hr = S_OK;
for (DWORD i=0; i<dwLen; i++) { pDst->guid = pSrc->guid; pDst->dataLength = pSrc->dataLength; pDst->reserved1 = pSrc->reserved1; pDst->reserved2 = pSrc->reserved2;
if (bDeep) { pDst->data = (BYTE*) ActMemAlloc((pSrc->dataLength+7)&~7);
if (pDst->data == NULL) return E_OUTOFMEMORY;
memcpy(pDst->data, pSrc->data, pSrc->dataLength); } else pDst->data = pSrc->data;
pDst++; pSrc++; }
return hr; }
OpaqueDataInfo() { _cOpaqueData = 0; _dwCollSize = 0; _pOpaqueData = NULL; }
~OpaqueDataInfo() { for (DWORD i=0; i<_cOpaqueData;i++) ActMemFree(_pOpaqueData[i].data);
ActMemFree(_pOpaqueData); }
// Methods from IUnknown
STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj); STDMETHOD_(ULONG,AddRef) ( void ); STDMETHOD_(ULONG,Release) ( void );
// Methods from IOpaqueDataInfo
STDMETHOD (AddOpaqueData) (OpaqueData *pData); STDMETHOD (GetOpaqueData) (REFGUID guid, OpaqueData **pData); STDMETHOD (DeleteOpaqueData) (REFGUID guid); STDMETHOD (GetOpaqueDataCount) (ULONG *pulCount); STDMETHOD (GetAllOpaqueData) (OpaqueData **prgData);
// ISerializable Methods
STDMETHOD(Serialize)(IN void *pSer); STDMETHOD(UnSerialize)(IN void *pSer); STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize); STDMETHOD(GetCLSID)(OUT CLSID *pclsid); STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0) { return E_NOTIMPL;}
STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
STDMETHOD (SetParent) ( ISerializableParent *pParent);
private:
DWORD _cOpaqueData; DWORD _dwCollSize; OpaqueData *_pOpaqueData; void *_pAct; };
class SpecialProperties : public ISpecialSystemProperties, public SerializableProperty { public:
SpecialProperties() { ZeroMemory(&_data, sizeof(SpecialPropertiesData)); }
~SpecialProperties() { }
SpecialProperties & operator =(SpecialProperties &sp) {
if(this == &sp) return *this;
_data = sp._data;
return *this; }
// Methods from ISpecialSystemProperties
STDMETHOD (SetSessionId) (ULONG dwSessionId, BOOL bUseConsole, BOOL fRemoteThisSessionId) { if (bUseConsole) { _data.dwFlags |= SPD_FLAG_USE_CONSOLE_SESSION; _data.dwSessionId = 0; } else { _data.dwFlags &= ~SPD_FLAG_USE_CONSOLE_SESSION; _data.dwSessionId = dwSessionId; } _data.fRemoteThisSessionId = fRemoteThisSessionId; return S_OK; }
STDMETHOD (GetSessionId) (ULONG *pdwSessionId, BOOL* pbUseConsole) { if (_data.dwFlags & SPD_FLAG_USE_CONSOLE_SESSION) { *pbUseConsole = TRUE; *pdwSessionId = 0; } else { *pbUseConsole = FALSE; *pdwSessionId = _data.dwSessionId; } return S_OK; }
STDMETHOD (GetSessionId2) (ULONG *pdwSessionId, BOOL* pbUseConsole, BOOL* pfRemoteThisSessionId) { HRESULT hr = GetSessionId(pdwSessionId, pbUseConsole); if (SUCCEEDED(hr)) { *pfRemoteThisSessionId = _data.fRemoteThisSessionId; } return hr; }
STDMETHOD (SetClientImpersonating) (BOOL fClientImpersonating) { _data.fClientImpersonating = fClientImpersonating; return S_OK; }
STDMETHOD (GetClientImpersonating) (BOOL* pfClientImpersonating) { *pfClientImpersonating = _data.fClientImpersonating; return S_OK; }
STDMETHOD (SetPartitionId) (REFGUID guidPartition) { _data.fPartitionIDPresent = TRUE; memcpy (&_data.guidPartition,&guidPartition, sizeof(GUID)); return S_OK; } STDMETHOD (GetPartitionId) (GUID* pguidPartition) { Win4Assert(pguidPartition != NULL); if (_data.fPartitionIDPresent) { memcpy (pguidPartition,&_data.guidPartition,sizeof(GUID)); return S_OK; } return E_FAIL; } STDMETHOD (SetProcessRequestType) (DWORD dwPRT) { _data.dwPRTFlags = dwPRT; return S_OK; }
STDMETHOD (GetProcessRequestType) (DWORD* pdwPRT) { *pdwPRT = _data.dwPRTFlags; return S_OK; }
STDMETHOD (SetOrigClsctx) (DWORD dwClsCtx) { _data.dwOrigClsctx = dwClsCtx; return S_OK; } STDMETHOD (GetOrigClsctx) (DWORD *pdwClsCtx) {
if(!pdwClsCtx) return E_POINTER;
*pdwClsCtx = _data.dwOrigClsctx; return S_OK; }
// Methods from IUnknown
STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj); STDMETHOD_(ULONG,AddRef) ( void ); STDMETHOD_(ULONG,Release) ( void );
// ISerializable Methods
STDMETHOD(Serialize)(IN void *pSer); STDMETHOD(UnSerialize)(IN void *pSer); STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize); STDMETHOD(GetCLSID)(OUT CLSID *pclsid); STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0) { return E_NOTIMPL;}
STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
private:
SpecialPropertiesData _data;
};
#endif // __PROPIFS_HXX__
|