472 lines
9.5 KiB
C++
472 lines
9.5 KiB
C++
// 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 <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <ntddkbd.h>
|
|
#include <ntddmou.h>
|
|
|
|
#include <windows.h>
|
|
#include <winbase.h>
|
|
#include <winerror.h>
|
|
|
|
#include <ntsecapi.h>
|
|
#include <lmcons.h>
|
|
#include <lm.h>
|
|
|
|
#include <wtsapi32.h>
|
|
#include <winsta.h>
|
|
|
|
#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 <atlbase.h>
|
|
//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 <atlcom.h>
|
|
#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)
|