/*++ Copyright (c) 1999-2000 Microsoft Corporation Module Name: HelpMgr.h Abstract: Declaration of the CRemoteDesktopHelpSessionMgr Author: HueiWang 2/17/2000 --*/ #ifndef __REMOTEDESKTOPHELPSESSIONMGR_H_ #define __REMOTEDESKTOPHELPSESSIONMGR_H_ #include "resource.h" // main symbols typedef struct __ExpertLogoffStruct { HANDLE hWaitObject; HANDLE hWaitProcess; LONG ExpertSessionId; CComBSTR bstrHelpedTicketId; CComBSTR bstrWinStationName; __ExpertLogoffStruct() { hWaitObject = NULL; hWaitProcess = NULL; }; ~__ExpertLogoffStruct() { if( NULL != hWaitObject ) { UnregisterWait( hWaitObject ); } if( NULL != hWaitProcess ) { CloseHandle( hWaitProcess ); } } } EXPERTLOGOFFSTRUCT, *PEXPERTLOGOFFSTRUCT; #ifdef __cplusplus extern "C"{ #endif HRESULT ImpersonateClient(); void EndImpersonateClient(); HRESULT LoadLocalSystemSID(); HRESULT LoadSessionResolver( ISAFRemoteDesktopCallback** ppResolver ); DWORD MonitorExpertLogoff( IN LONG pidToWaitFor, IN LONG expertSessionId, IN BSTR bstrHelpedTicketId ); VOID CleanupMonitorExpertList(); #ifdef __cplusplus } #endif typedef MAP EXPERTLOGOFFMONITORLIST; class CRemoteDesktopHelpSession; // // Help Session Manager service name, this must be consistent with // with COM or COM won't find us. // #define HELPSESSIONMGR_SERVICE_NAME \ _TEXT("RemoteDesktopHelpSessionMgr") // // STL Help Session ID to actual help session object map. // typedef MAP< CComBSTR, CComObject* > IDToSessionMap; typedef CComObject< CRemoteDesktopHelpSession > RemoteDesktopHelpSessionObj; ///////////////////////////////////////////////////////////////////////////// // CRemoteDesktopHelpSessionMgr class ATL_NO_VTABLE CRemoteDesktopHelpSessionMgr : public CComObjectRootEx, public CComCoClass, public IDispatchImpl { friend class CRemoteDesktopUserPolicy; public: CRemoteDesktopHelpSessionMgr(); ~CRemoteDesktopHelpSessionMgr() {} DECLARE_REGISTRY_RESOURCEID(IDR_REMOTEDESKTOPHELPSESSIONMGR) //DECLARE_CLASSFACTORY_SINGLETON(CRemoteDesktopHelpSessionMgr) DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CRemoteDesktopHelpSessionMgr) COM_INTERFACE_ENTRY(IRemoteDesktopHelpSessionMgr) COM_INTERFACE_ENTRY(IDispatch) END_COM_MAP() // // Can't impersonate so can't pre-load user SID at FinalConstruct() // HRESULT FinalConstruct() { ULONG count = _Module.AddRef(); DebugPrintf( _TEXT("Module AddRef by CRemoteDesktopHelpSessionMgr() %d...\n"), count ); BOOL bSuccess = _Module.InitializeSessmgr(); DebugPrintf( _TEXT("_Module.InitializeSessmgr() return %d\n"), bSuccess ); return S_OK; } void FinalRelease() { Cleanup(); ULONG count = _Module.Release(); DebugPrintf( _TEXT("Module Release by CRemoteDesktopHelpSessionMgr() %d ...\n"), count ); } // IRemoteDesktopHelpSessionMgr public: STDMETHOD(ResetHelpAssistantAccount)( /*[in]*/ BOOL bForce ); STDMETHOD(CreateHelpSession)( /*[in]*/ BSTR bstrSessName, /*[in]*/ BSTR bstrSessPwd, /*[in]*/ BSTR bstrUserHelpBlob, /*[in]*/ BSTR bstrUserHelpCreateBlob, /*[out, retval]*/ IRemoteDesktopHelpSession** ppIRemoteDesktopHelpSession ); STDMETHOD(DeleteHelpSession)( /*[in]*/ BSTR HelpSessionID ); STDMETHOD(RetrieveHelpSession)( /*[in]*/ BSTR HelpSessionID, /*[out, retval]*/ IRemoteDesktopHelpSession** ppIRemoteDesktopHelpSession ); STDMETHOD(VerifyUserHelpSession)( /*[in]*/ BSTR HelpSessionId, /*[in]*/ BSTR bstrSessPwd, /*[in]*/ BSTR bstrResolverConnectBlob, /*[in]*/ BSTR bstrUserHelpCreateBlob, /*[in]*/ LONG CallerProcessId, /*[out]*/ ULONG_PTR* phHelpCtr, /*[out]*/ LONG* pResolverRetCode, /*[out, retval]*/ long* pdwUserLogonSession ); STDMETHOD(GetUserSessionRdsSetting)( /*[out, retval]*/ REMOTE_DESKTOP_SHARING_CLASS* sessionRdsLevel ); STDMETHOD(RemoteCreateHelpSession)( /*[in]*/ REMOTE_DESKTOP_SHARING_CLASS sharingClass, /*[in]*/ LONG timeOut, /*[in]*/ LONG userSessionId, /*[in]*/ BSTR userSid, /*[in]*/ BSTR bstrUserHelpCreateBlob, /*[out, retval]*/ BSTR* parms ); STDMETHOD(CreateHelpSessionEx)( /*[in]*/ REMOTE_DESKTOP_SHARING_CLASS sharingClass, /*[in]*/ BOOL fEnableCallback, /*[in]*/ LONG timeOut, /*[in]*/ LONG userSessionId, /*[in]*/ BSTR userSid, /*[in]*/ BSTR bstrUserHelpCreateBlob, /*[out, retval]*/ IRemoteDesktopHelpSession** ppIRemoteDesktopHelpSession ); HRESULT RemoteCreateHelpSessionEx( /*[in]*/ BOOL bCacheEntry, /*[in]*/ BOOL bEnableResolver, /*[in]*/ REMOTE_DESKTOP_SHARING_CLASS sharingClass, /*[in]*/ LONG timeOut, /*[in]*/ LONG userSessionId, /*[in]*/ BSTR userSid, /*[in]*/ BSTR bstrUserHelpCreateBlob, /*[out, retval]*/ RemoteDesktopHelpSessionObj** ppIRemoteDesktopHelpSession ); STDMETHOD(IsValidHelpSession)( /*[in]*/ BSTR HelpSessionId, /*[in]*/ BSTR HelpSessionPwd ); STDMETHOD(LogSalemEvent)( /*[in]*/ long ulEventType, /*[in]*/ long ulEventCode, /*[in]*/ VARIANT* pEventStrings ); STDMETHOD(PrepareSystemRestore)(); static HRESULT AddHelpSessionToCache( IN BSTR bstrHelpId, IN CComObject* pIHelpSession ); static HRESULT DeleteHelpSessionFromCache( IN BSTR bstrHelpId ); static void TimeoutHelpSesion(); static void LockIDToSessionMapCache() { gm_HelpIdToHelpSession.Lock(); } static void UnlockIDToSessionMapCache() { gm_HelpIdToHelpSession.Unlock(); } static HRESULT LogoffUserHelpSessionCallback( IN CComBSTR& bstrHelpId, IN HANDLE userData ); static void NotifyHelpSesionLogoff( DWORD dwLogonId ); static void NotifyExpertLogoff( LONG ExpertSessionId, BSTR HelpedTicketId ); static void NotifyPendingHelpServiceStartup(); static HRESULT NotifyPendingHelpServiceStartCallback( IN CComBSTR& bstrHelpId, IN HANDLE userData ); private: HRESULT LogSalemEvent( IN long ulEventType, IN long ulEventCode, IN long numStrings = 0, IN LPTSTR* strings = NULL ); static RemoteDesktopHelpSessionObj* LoadHelpSessionObj( IN CRemoteDesktopHelpSessionMgr* pMgr, IN BSTR bstrHelpSession, IN BOOL bLoadExpiredHelp = FALSE ); static HRESULT ExpireUserHelpSessionCallback( IN CComBSTR& pHelp, IN HANDLE userData ); static HRESULT GenerateHelpSessionId( OUT CComBSTR& bstrHelpId ); static HRESULT AcquireAssistantAccount(); static HRESULT ReleaseAssistantAccount(); void Cleanup(); HRESULT IsUserAllowToGetHelp( OUT BOOL* pbAllow ); BOOL CheckAccessRights( IN CComObject* pIHelpSess ); HRESULT CreateHelpSession( IN BOOL bCacheEntry, IN BSTR bstrSessName, IN BSTR bstrSessPwd, IN BSTR bstrSessDesc, IN BSTR bstrSessBlob, IN LONG userLogonId, IN BSTR bstrClientSID, OUT RemoteDesktopHelpSessionObj** ppIRemoteDesktopHelpSession ); HRESULT LoadUserSid(); LONG m_LogonId; PBYTE m_pbUserSid; // Client SID. DWORD m_cbUserSid; // size of client SID. CComBSTR m_bstrUserSid; // For performance reason, convert SID to string // form once for all. //LONG m_lAccountAcquiredByLocal; // number of reference lock this connection placed on // help assistant account typedef vector< CComBSTR > LocalHelpSessionCache; // STL does not like list, CComBSTR has & defined. //LocalHelpSessionCache m_HelpListByLocal; // ID of Help Session created by this connection. static CCriticalSection gm_AccRefCountCS; // // COM create a new CRemoteDesktopHelpSessionMgr object for new connection // so these values must be static // static IDToSessionMap gm_HelpIdToHelpSession; }; #endif //__REMOTEDESKTOPHELPSESSIONMGR_H_