WindowsXP-SP1/termsrv/remdsk/server/sessmgr/stdafx.h
2020-09-30 16:53:49 +02:00

472 lines
10 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)