//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: class.hxx // //-------------------------------------------------------------------------- #ifndef __CLASS_HXX__ #define __CLASS_HXX__ //-------------------------------------------------------------------------- // There are two kinds of out-of-proc servers // 1. Traditional local servers that use CoRegisterClassObject and have entries // for individual CLSIDs each with its own server list. // // 2. COM+ surrogate processes that use the IMachineActivatorControl interface // for registration/revocation, and have a server-list per process GUID. // // There are two tables, one for each kind of server. // //-------------------------------------------------------------------------- class CServerTable; class CServerTableEntry; extern CServerTable * gpClassTable; extern CServerTable * gpProcessTable; extern CSharedLock * gpClassLock; extern CSharedLock * gpProcessLock; extern CInterlockedInteger gRegisterKey; typedef enum {ENTRY_TYPE_CLASS, ENTRY_TYPE_PROCESS} EnumEntryType; // // CServerTable // class CServerTable : public CGuidTable { friend class CServerTableEntry; public: CServerTable( OUT LONG& Status, IN EnumEntryType EntryType ) : CGuidTable( Status ), _EntryType(EntryType) { _pServerTableLock = (_EntryType == ENTRY_TYPE_CLASS) ? gpClassLock : gpProcessLock; } ~CServerTable() {} CServerTableEntry * Create( IN GUID & ServerGuid ); CServerTableEntry * Lookup( IN GUID & ServerGuid ); CServerTableEntry * GetOrCreate( IN GUID & ServerGuid ); private: EnumEntryType _EntryType; CSharedLock * _pServerTableLock; }; //+------------------------------------------------------------------------- // // CServerTableEntry // //-------------------------------------------------------------------------- class CServerTableEntry : public CGuidTableEntry { public: CServerTableEntry( OUT LONG& Status, IN GUID * pServerGUID, IN EnumEntryType EntryType ); ~CServerTableEntry(); DWORD Release(); HRESULT RegisterServer( IN CProcess * pServerProcess, IN IPID ipid, IN CClsidData * pClsidData, // NULL for ComPlus Surrogate IN CAppidData * pAppidData, IN UCHAR ServerState, OUT DWORD * pRegistrationKey ); void RevokeServer( IN CProcess * pServerProcess, IN DWORD RegistrationKey ); void RevokeServer( IN ScmProcessReg * pScmProcessReg ); void UnsuspendServer( IN DWORD RegistrationKey ); BOOL LookupServer( IN CToken * pClientToken, IN BOOL bRemoteActivation, IN BOOL bClientImpersonating, IN WCHAR * pwszWinstaDesktop, IN DWORD dwFlags, IN LONG lThreadToken, IN LONG lSessionID, IN DWORD pid, IN DWORD dwProcessReqType, OUT CServerListEntry ** ppServerListEntry ); HRESULT ServerExists( IN ACTIVATION_PARAMS * pActParams, BOOL *pfExist ); BOOL LookupServer( IN DWORD RegistrationKey, OUT CServerListEntry ** ppServerListEntry ); BOOL CallRunningServer( IN ACTIVATION_PARAMS * pActParams, IN DWORD dwFlags, IN LONG lThreadToken, IN CClsidData * pClsidData, OPTIONAL OUT HRESULT * phr ); BOOL RegisterHandles(IN CServerListEntry * pEntry, IN CProcess *pServerProcess); BOOL WaitForLocalServer( IN HANDLE hRegisterEvent, IN ULONG &winerr ); BOOL WaitForDllhostServer( IN HANDLE hRegisterEvent, IN ACTIVATION_PARAMS * pActParams, IN ULONG &winerr, IN LONG lThreadToken ); BOOL WaitForService( IN SC_HANDLE hService, IN HANDLE hRegisterEvent, IN BOOL bServiceAlreadyRunning ); HRESULT WaitForInitCompleted( IN CServerListEntry *pEntry, IN CClsidData *pClsidData ); HRESULT StartServerAndWait( IN ACTIVATION_PARAMS * pActParams, IN CClsidData * pClsidData, IN LONG &lThreadToken ); // // The following methods are for supporting custom activatorss // CServerList* GetServerListWithSharedLock(); void ReleaseSharedListLock(); void SuspendClass(); void UnsuspendClass(); void RetireClass(); void SuspendApplication(); void UnsuspendApplication(); void RetireApplication(); BOOL IsSuspended(); void SetSuspendedFlagOnNewServer(CProcess* pprocess); private: inline CSharedLock* ServerLock() { return &_ServerLock; } void SetSuspendOnAllServers(BOOL bSuspended); void RetireAllServers(); EnumEntryType _EntryType; CSharedLock * _pParentTableLock; CServerTable * _pParentTable; LONG _lThreadToken; DWORD _dwProcessId; HANDLE _hProcess; CProcess* _pProcess; void * _pvRunAsHandle; BOOL _bSuspendedClsid; BOOL _bSuspendedApplication; // the _bRetired flag exists per-running process/application CServerList _ServerList; CSharedLock _ServerLock; }; #endif // __CLASS_HXX__