// stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, // but are changed infrequently #if !defined(AFX_STDAFX_H__97A939A5_466D_43B0_9150_CFBCC67F024B__INCLUDED_) #define AFX_STDAFX_H__97A939A5_466D_43B0_9150_CFBCC67F024B__INCLUDED_ #ifndef __WIN9XBUILD__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "license.h" #include "tlsapi.h" #include "lscsp.h" #endif #include "safsessionresolver.h" #include "tsremdsk.h" #include "tsstl.h" #include "locks.h" #include "map.h" #include "myassert.h" #include "icshelpapi.h" #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #ifndef STRICT #define STRICT #endif #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif #define _ATL_APARTMENT_THREADED #include //You may derive a class from CComModule and use it if you want to override //something, but do not change the name of _Module #ifndef __WIN9XBUILD__ #ifndef DBG #define IDLE_SHUTDOWN_PERIOD 10 * 1000 * 60 // 10 min wait #define EXPIRE_HELPSESSION_PERIOD 60 * 60 * 1000 // Clean up help session every hrs #else #define IDLE_SHUTDOWN_PERIOD 1000 * 60 * 5 // 1 min. time out #define EXPIRE_HELPSESSION_PERIOD 5 * 60 * 1000 // Clean up help session every 5 min. #endif #define SESSMGR_NOCONNECTIONEVENT_NAME L"Global\\RemoteDesktopSessMgr" #define SERVICE_STARTUP_WAITHINT 1000*30 // 30 second wait #define REGKEY_SYSTEM_EVENTSOURCE L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\System" #define MAX_FETCHIPADDRESSRETRY 5 #define DEFAULT_MAXTICKET_EXPIRY 30 * 24 * 60 * 60 // Default max. ticket valid period class CServiceModule : public CComModule { public: static DWORD WINAPI HandlerEx( DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext ); HRESULT RegisterServer( FILE* pSetupLog, BOOL bRegTypeLib, BOOL bService ); HRESULT UnregisterServer(FILE* pSetupLog); HRESULT SetupEventViewerSource( FILE* pSetupLog ); void Init( _ATL_OBJMAP_ENTRY* p, HINSTANCE h, UINT nServiceNameID, UINT nServiceDispNameID, UINT nServiceDescID, const GUID* plibid = NULL ); void Start(); void ServiceMain( DWORD dwArgc, LPTSTR* lpszArgv ); void Handler(DWORD dwOpcode); void Run(); BOOL IsInstalled(FILE* pSetupLog); BOOL Install(FILE* pSetupLog); BOOL Uninstall(FILE* pSetupLog); LONG Unlock(); BOOL UpdateService(FILE* pSetupLog); void LogInfoEvent( DWORD dwCode ); void LogWarningEvent( DWORD dwCode ); void LogErrorEvent( DWORD dwCode ); void LogEventWithStatusCode( DWORD dwEventType, DWORD dwEventId, DWORD dwCode ); void LogEventString( DWORD dwEventType, DWORD dwEventId, DWORD dwNumString, LPCTSTR* lpStrings, DWORD dwBinaryDataSize = 0, LPVOID lpRawData = NULL ); void LogSessmgrEventLog( DWORD dwEventType, DWORD dwEventCode, CComBSTR& bstrNoviceDomain, CComBSTR& bstrNoviceAccount, CComBSTR& bstrRaType, CComBSTR& bstrExpertIPFromClient, CComBSTR& bstrExpertIPFromTS, DWORD dwErrCode ); void SetServiceStatus(DWORD dwState); void SetupAsLocalServer(); ULONG AddRef(); ULONG Release(); CServiceModule() : m_RefCount(0), CComModule() {} DWORD GetServiceStartupStatus() { return m_dwServiceStartupStatus; } BOOL IsSuccessServiceStartup() { return ERROR_SUCCESS == m_dwServiceStartupStatus; } BOOL InitializeSessmgr(); //Implementation private: static HANDLE gm_hIdle; static HANDLE gm_hIdleMonitorThread; static HANDLE gm_hICSAlertEvent; static void WINAPI _ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv); static void WINAPI _Handler(DWORD dwOpcode); static unsigned int WINAPI IdleMonitorThread( void* ptr ); //static unsigned int WINAPI StartupInitThread( void* ptr ); // data members public: // // Refer to CreateService() for 256 // TCHAR m_szServiceDesc[257]; TCHAR m_szServiceName[257]; TCHAR m_szServiceDispName[257]; SERVICE_STATUS_HANDLE m_hServiceStatus; SERVICE_STATUS m_status; DWORD dwThreadID; BOOL m_bService; CCriticalSection m_Locks; long m_RefCount; BOOL m_Initialized; DWORD m_dwServiceStartupStatus; }; extern CServiceModule _Module; #else class CExeModule : public CComModule { private: CSafeCounter m_RefCount; public: CExeModule() : m_RefCount(0) {} LONG Unlock(); DWORD dwThreadID; HANDLE hEventShutdown; void MonitorShutdown(); bool StartMonitor(); bool bActivity; ULONG AddRef() { return ++m_RefCount; } ULONG Release() { return --m_RefCount; } }; extern CExeModule _Module; #endif #include #include "sessmgrmc.h" #include "sessmgr.h" #include "helper.h" #include "helptab.h" #include "helpmgr.h" #include "helpsess.h" #include "tsremdsk.h" #include "rderror.h" class CComBSTRtoLPTSTR { private: LPTSTR m_pszString; LPTSTR ConvertString( LPWSTR pszString ) { #ifdef UNICODE return pszString; #else char* pszAnsiString = NULL; int length = wcslen(pszString); int bufSize; if( length > 0 ) { bufSize = WideCharToMultiByte( GetACP(), WC_DEFAULTCHAR, (LPWSTR)pszString, -1, NULL, 0, NULL, NULL ); if(bufSize != 0) { pszAnsiString = (LPSTR)LocalAlloc(LPTR, (bufSize + 1) * sizeof(char)); if( NULL != pszAnsiString ) { bufSize = WideCharToMultiByte( GetACP(), WC_DEFAULTCHAR, pszString, length, pszAnsiString, bufSize, NULL, NULL ); if( bufSize == 0 ) { LocalFree( pszAnsiString ); pszAnsiString = NULL; MYASSERT(FALSE); } } } } return pszAnsiString; #endif } public: CComBSTRtoLPTSTR( CComBSTR& bstr ) { m_pszString = ConvertString( bstr ); if( NULL == m_pszString ) { throw GetLastError(); } } ~CComBSTRtoLPTSTR() { #ifndef UNICODE if( NULL != m_pszString ) { LocalFree( m_pszString ); } #endif } operator LPCTSTR() { return m_pszString; } operator LPTSTR() { return m_pszString; } }; #ifndef AllocMemory #define AllocMemory(size) \ LocalAlloc(LPTR, size) #endif #ifndef FreeMemory #define FreeMemory(ptr) \ if(ptr) \ { \ LocalFree(ptr); \ ptr=NULL; \ } #endif #ifndef ReallocMemory #define ReallocMemory(ptr, size) \ LocalReAlloc(ptr, size, LMEM_ZEROINIT) #endif #define REGKEYCONTROL_REMDSK _TEXT("Software\\Microsoft\\Remote Desktop") #define CLASS_PRIVATE #define CLASS_PUBLIC #define CLASS_STATIC struct __declspec(uuid("A55737AB-5B26-4A21-99B7-6D0C606F515E")) SESSIONRESOLVER; #define SESSIONRESOLVERCLSID __uuidof(SESSIONRESOLVER) #define HELPSESSION_UNSOLICATED _TEXT("UnsolicitedHelp") #define HELPSESSION_NORMAL_RA _TEXT("SolicitedHelp") // // HYDRA_CERT_REG_KEY // HYDRA_X509_CERTIFICATE // X509_CERT_PUBLIC_KEY_NAME // defined in lscsp.h // #define REGKEY_TSX509_CERT _TEXT(HYDRA_CERT_REG_KEY) #define REGVALUE_TSX509_CERT _TEXT(HYDRA_X509_CERTIFICATE) #define LSA_TSX509_CERT_PUBLIC_KEY_NAME X509_CERT_PUBLIC_KEY_NAME // // Message for notify session logoff or disconnect, // WPARAM : Not use // LPARAM : the logoff or disconnecting session. // #define WM_SESSIONLOGOFFDISCONNECT (WM_APP + 1) // // Message for expiring help ticket // WPARAM : Not use // LPARAM : Not use // #define WM_EXPIREHELPSESSION (WM_SESSIONLOGOFFDISCONNECT + 1) // // Notification message to reload termsrv public key // WPARAM : Not use // LPARAM : Not use // #define WM_LOADTSPUBLICKEY (WM_EXPIREHELPSESSION + 1) // // Notification for rdsaddin terminates // WPARAM : Not use // LPARAM : Pointer to help session (ticket) object. // #define WM_HELPERRDSADDINEXIT (WM_LOADTSPUBLICKEY + 1) //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__97A939A5_466D_43B0_9150_CFBCC67F024B__INCLUDED)