309 lines
10 KiB
C++
309 lines
10 KiB
C++
//SH.h
|
|
//Header for SH (client Shell Utilities)
|
|
//
|
|
|
|
#ifndef _SH_H_
|
|
#define _SH_H_
|
|
|
|
#include "wuiids.h"
|
|
#include "autil.h"
|
|
|
|
#define DEFAULT_DESKTOP_WIDTH 800
|
|
#define DEFAULT_DESKTOP_HEIGHT 600
|
|
|
|
#define SH_MAX_DOMAIN_LENGTH 52
|
|
#define SH_MAX_USERNAME_LENGTH 512
|
|
#define SH_MAX_PASSWORD_LENGTH 256
|
|
#define SH_SALT_LENGTH 20
|
|
#define SH_FILENAME_MAX_LENGTH 15
|
|
#define SH_MAX_WORKINGDIR_LENGTH 512
|
|
#define SH_MAX_ALTERNATESHELL_LENGTH 512
|
|
#define SH_MAX_ADDRESS_LENGTH 256
|
|
#define SH_REGSESSION_MAX_LENGTH 32
|
|
#define SH_MAX_SUBKEY 265
|
|
|
|
#define SH_NUM_SERVER_MRU 10
|
|
#define SH_DEFAULT_REG_SESSION TEXT("Default")
|
|
|
|
#define SH_WINDOW_POSITION_STR_LEN 256
|
|
|
|
#define SH_FRAME_TITLE_RESOURCE_MAX_LENGTH 256
|
|
#define SH_DISCONNECT_RESOURCE_MAX_LENGTH 1024
|
|
|
|
#define SH_BUILDNUMBER_STRING_MAX_LENGTH 256
|
|
#define SH_VERSION_STRING_MAX_LENGTH 256
|
|
#define SH_DISPLAY_STRING_MAX_LENGTH 256
|
|
#define SH_INTEGER_STRING_MAX_LENGTH 10
|
|
#define SH_SHORT_STRING_MAX_LENGTH 32
|
|
|
|
#define UI_HELP_SERVERNAME_CONTEXT 103
|
|
|
|
#ifdef DC_DEBUG
|
|
#define SH_NUMBER_STRING_MAX_LENGTH ( 18 * sizeof (TCHAR) )
|
|
#endif /* DC_DEBUG */
|
|
|
|
#define TS_CONTROL_DLLNAME TEXT("mstscax.dll")
|
|
|
|
extern DCUINT clientResSizeTable[UI_NUMBER_DESKTOP_SIZE_IDS][2];
|
|
|
|
extern PDCTCHAR clientResSize[UI_NUMBER_DESKTOP_SIZE_IDS];
|
|
|
|
#define REMOTEDESKTOPFOLDER_REGKEY TEXT("RemoteDesktopFolder")
|
|
|
|
#ifdef OS_WINCE
|
|
#define PRINTER_APPLET_NAME _T("\\windows\\wbtprncpl.dll")
|
|
#endif
|
|
|
|
// Screen mode constants
|
|
|
|
#define UI_WINDOWED 1
|
|
#define UI_FULLSCREEN 2
|
|
|
|
#define SH_DEFAULT_BPP 8
|
|
#define SH_DEFAULT_NUMCOLS 256
|
|
|
|
#define SH_NUMBER_FIELDS_TO_READ 6
|
|
#define SH_WINDOW_POSITION_INI_FORMAT _T("%u,%u,%d,%d,%d,%d")
|
|
|
|
#define TRANSPORT_TCP 1
|
|
|
|
#if defined(OS_WIN32) && !defined(OS_WINCE)
|
|
#define SH_ICON_FILE _T("Icon File")
|
|
#define SH_ICON_INDEX _T("Icon Index")
|
|
#endif
|
|
|
|
#ifdef OS_WINCE
|
|
#define PEGHELP_EXE _T("\\Windows\\peghelp.exe")
|
|
#define TSC_HELP_FILE _T("\\Windows\\termservclient.htm")
|
|
#define HH_DISPLAY_TOPIC 0x0000
|
|
#endif
|
|
|
|
typedef struct tagSH_DATA
|
|
{
|
|
DCTCHAR regSession[MAX_PATH];
|
|
DCBOOL fRegDefault;
|
|
DCUINT connectedStringID;
|
|
DCUINT disconnectedStringID;
|
|
|
|
#if defined(OS_WIN32) && !defined(OS_WINCE)
|
|
DCTCHAR szIconFile[MAX_PATH];
|
|
DCINT iconIndex;
|
|
#endif
|
|
|
|
DCBOOL fAutoLogon;
|
|
DCBOOL fClearPersistBitmapCache;
|
|
DCBOOL autoConnectEnabled;
|
|
DCBOOL fStartFullScreen;
|
|
DCTCHAR szServer[SH_MAX_ADDRESS_LENGTH];
|
|
// Server specified from the command line
|
|
DCTCHAR szCommandLineServer[SH_MAX_ADDRESS_LENGTH];
|
|
DCUINT desktopWidth;
|
|
DCUINT desktopHeight;
|
|
TCHAR szCLXCmdLine[256];
|
|
|
|
DCINT cipherStrength;
|
|
DCTCHAR szControlVer[SH_DISPLAY_STRING_MAX_LENGTH];
|
|
// Command line settings
|
|
DCBOOL fCommandStartFullScreen;
|
|
DCUINT commandLineWidth;
|
|
DCUINT commandLineHeight;
|
|
} SH_DATA, *PSH_DATA;
|
|
|
|
typedef HWND (WINAPI* PFNHtmlHelp)(HWND hwndCaller,
|
|
LPCSTR pszFile,
|
|
UINT uCommand,
|
|
DWORD_PTR dwData);
|
|
|
|
typedef HRESULT (*PFNEnableThemeDialogTexture)(HWND hwnd,
|
|
BOOL fEnable);
|
|
|
|
typedef struct tagCTL_ENABLE
|
|
{
|
|
UINT ctlID;
|
|
BOOL fPrevDisabled;
|
|
} CTL_ENABLE, *PCTL_ENABLE;
|
|
|
|
#ifndef OS_WINCE
|
|
//
|
|
// Mstsc's private copy of StrRetToStrW because
|
|
// this is not availalbe on less than shlwapi.dll v5.00
|
|
//
|
|
HRESULT XSHStrDupA(LPCSTR psz, WCHAR **ppwsz);
|
|
HRESULT XStrRetToStrW(STRRET *psr, LPCITEMIDLIST pidl, WCHAR **ppsz);
|
|
#endif
|
|
|
|
//
|
|
// CMD Line parsing error codes
|
|
//
|
|
#define SH_PARSECMD_OK 1
|
|
#define SH_PARSECMD_ERR_INVALID_CMD_LINE (-1)
|
|
#define SH_PARSECMD_ERR_INVALID_CONNECTION_PARAM (-2)
|
|
|
|
|
|
class CSH
|
|
{
|
|
public:
|
|
//
|
|
// Public members
|
|
//
|
|
CSH();
|
|
~CSH();
|
|
|
|
DCBOOL SH_Init(HINSTANCE hInstance);
|
|
DWORD SH_ParseCmdParam(LPTSTR lpszCmdParam);
|
|
DCBOOL SH_ValidateParams(CTscSettings* pTscSet);
|
|
DCBOOL SH_ReadControlVer(IMsRdpClient* pTsControl);
|
|
DCVOID SH_ApplyCmdLineSettings(CTscSettings* pTscSet, HWND hwnd);
|
|
DCBOOL SH_IsScreenResSpecifiedOnCmdLine();
|
|
|
|
DCBOOL SH_CanonicalizeServerName(PDCTCHAR szServer);
|
|
static void InitServerAutoCmplCombo(CTscSettings* pTscSet, HWND hwndSrvCombo);
|
|
BOOL SH_GetCmdFileForEdit() {return _fFileForEdit;}
|
|
BOOL SH_GetCmdFileForConnect() {return _fFileForConnect;}
|
|
|
|
LPTSTR SH_GetCmdLnFileName() {return _szFileName;}
|
|
|
|
BOOL SH_GetPathToDefaultFile(LPTSTR szPath, UINT nLen);
|
|
BOOL SH_GetRemoteDesktopFolderPath(LPTSTR szPath, UINT nLen);
|
|
#ifndef OS_WINCE
|
|
BOOL SH_GetMyDocumentsDisplayName(LPTSTR szName, UINT nLen);
|
|
#endif
|
|
BOOL SH_GetCmdMigrate() {return _fMigrateOnly;}
|
|
BOOL SH_GetCmdConnectToConsole(){return _fConnectToConsole;}
|
|
VOID SH_SetCmdConnectToConsole(BOOL bCon) {_fConnectToConsole=bCon;}
|
|
|
|
static BOOL SH_GetPluginDllList(LPTSTR szSession, LPTSTR szPlugins, size_t cchSzPlugins);
|
|
|
|
static BOOL HandleServerComboChange(HWND hwndCombo, HWND hwndDlg,
|
|
HINSTANCE hInst,
|
|
LPTSTR szPrevText);
|
|
BOOL SH_AutoFillBlankSettings(CTscSettings* pTsc);
|
|
|
|
BOOL SH_FileExists(LPTSTR szFileName);
|
|
BOOL SH_TSSettingsRegKeyExists(LPTSTR szKeyName);
|
|
BOOL SH_DisplayErrorBox(HWND hwndParent, INT errStringID);
|
|
BOOL SH_DisplayMsgBox(HWND hwndParent, INT errStringID, INT flags);
|
|
BOOL SH_DisplayErrorBox(HWND hwndParent, INT errStringID, LPTSTR szParam);
|
|
static BOOL SH_GetNameFromPath(LPTSTR szPath, LPTSTR szName, UINT nameLen);
|
|
|
|
HWND SH_DisplayClientHelp(HWND hwndOwner, INT helpCommand);
|
|
BOOL SH_Cleanup();
|
|
|
|
static BOOL SH_CreateDirectory(LPTSTR szPath);
|
|
static BOOL SH_CreateHiddenFile(LPCTSTR szPath);
|
|
static UINT SH_GetScreenBpp();
|
|
|
|
static BOOL SH_IsRunningOn9x();
|
|
|
|
//
|
|
// Property accessers
|
|
//
|
|
LPTSTR GetCmdLineFileName();
|
|
DCINT GetCipherStrength() {return _SH.cipherStrength;}
|
|
PDCTCHAR GetControlVersionString() {return _SH.szControlVer;}
|
|
|
|
VOID SetAutoConnect(DCBOOL bAutoCon) {_SH.autoConnectEnabled = bAutoCon;}
|
|
DCBOOL GetAutoConnect() {return _SH.autoConnectEnabled;}
|
|
|
|
DCVOID SetServer(PDCTCHAR szServer);
|
|
PDCTCHAR GetServer() {return _SH.szServer;}
|
|
|
|
DCUINT GetCmdLineDesktopWidth() {return _SH.commandLineWidth;}
|
|
DCUINT GetCmdLineDesktopHeight() {return _SH.commandLineHeight;}
|
|
|
|
DCVOID SetStartFullScreen(DCBOOL b) {_SH.fStartFullScreen = b;}
|
|
DCBOOL GetStartFullScreen() {return _SH.fStartFullScreen;}
|
|
|
|
DCBOOL GetCmdLineStartFullScreen(){return _SH.fCommandStartFullScreen;}
|
|
|
|
LPTSTR GetCmdLineServer() {return _SH.szCommandLineServer;}
|
|
LPTSTR GetClxCmdLine() {return _SH.szCLXCmdLine;}
|
|
|
|
DCBOOL GetUsingDefaultRegSession() {return _SH.fRegDefault;}
|
|
PDCTCHAR GetRegSession() {return _SH.regSession;}
|
|
|
|
DCUINT GetConnectedStringID() {return _SH.connectedStringID;}
|
|
HICON GetAppIcon();
|
|
|
|
DCBOOL GetAutoLogon() {return _SH.fAutoLogon;}
|
|
DCVOID SetAutoLogon(DCBOOL b) {_SH.fAutoLogon = b;}
|
|
|
|
static VOID EnableControls(HWND hwndDlg, PUINT pCtls,
|
|
const UINT numCtls, BOOL fEnable);
|
|
|
|
static VOID EnableControls(HWND hwndDlg, PCTL_ENABLE pCtls,
|
|
const UINT numCtls, BOOL fEnable);
|
|
|
|
BOOL GetRegSessionSpecified() {return _fRegSessionSpecified;}
|
|
VOID SetRegSessionSpecified(BOOL b) {_fRegSessionSpecified = b;}
|
|
|
|
// Crypto helpter fns
|
|
static BOOL IsCryptoAPIPresent();
|
|
static BOOL DataProtect(PDATA_BLOB pInData, PDATA_BLOB pOutData);
|
|
static BOOL DataUnprotect(PDATA_BLOB pInData, PDATA_BLOB pOutData);
|
|
|
|
// Multimon helpers
|
|
static BOOL GetLargestMonitorRect(LPRECT prc);
|
|
static BOOL MonitorRectFromHwnd(HWND hwnd, LPRECT prc);
|
|
static BOOL MonitorRectFromNearestRect(LPRECT prcNear, LPRECT prcMonitor);
|
|
static LPTSTR FormatMessageVArgs(LPCTSTR pcszFormat, ...);
|
|
static LPTSTR FormatMessageVAList(LPCTSTR pcszFormat, va_list *argList);
|
|
HRESULT SH_ThemeDialogWindow(HWND hwnd, DWORD dwFlags);
|
|
|
|
private:
|
|
//
|
|
// Internal member functions
|
|
//
|
|
PDCTCHAR SHGetSwitch(PDCTCHAR lpszCmdParam);
|
|
LPTSTR SHGetSession(LPTSTR lpszCmdParam);
|
|
LPTSTR SHGetFileName(LPTSTR lpszCmdParam);
|
|
LPTSTR SHGetServer(LPTSTR lpszCmdParam);
|
|
UINT CLX_GetSwitch_CLXCMDLINE(IN LPTSTR lpszCmdParam);
|
|
BOOL ParseFileOrRegConnectionParam();
|
|
LPTSTR SHGetCacheToClear(LPTSTR lpszCmdParam);
|
|
DCVOID SHUpdateMRUList(PDCTCHAR pBuffer);
|
|
LPTSTR SHGetCmdLineInt(LPTSTR lpszCmdParam, PDCUINT pInt);
|
|
LPTSTR SHGetCmdLineString(LPTSTR lpszCmdParam, LPTSTR lpszDest,
|
|
DCINT cbDestLen);
|
|
DCBOOL SHValidateParsedCmdParam();
|
|
public:
|
|
//
|
|
// Public data members
|
|
//
|
|
DCTCHAR _fullFrameTitleStr[SH_FRAME_TITLE_RESOURCE_MAX_LENGTH +
|
|
SH_REGSESSION_MAX_LENGTH];
|
|
|
|
DCTCHAR _frameTitleStr[SH_FRAME_TITLE_RESOURCE_MAX_LENGTH];
|
|
private:
|
|
//
|
|
// Private data members
|
|
//
|
|
SH_DATA _SH;
|
|
CUT _Ut;
|
|
HICON _hAppIcon;
|
|
|
|
TCHAR _szFileName[MAX_PATH];
|
|
|
|
static TCHAR _szBrowseForMore[SH_DISPLAY_STRING_MAX_LENGTH];
|
|
|
|
BOOL _fFileForEdit;
|
|
BOOL _fFileForConnect;
|
|
BOOL _fRegSessionSpecified;
|
|
TCHAR _szAppName[MAX_PATH];
|
|
BOOL _fMigrateOnly;
|
|
HINSTANCE _hInstance;
|
|
BOOL _fConnectToConsole;
|
|
|
|
//
|
|
// Handle to HHCTL.OCX for HTML Help
|
|
//
|
|
HMODULE _hModHHCTRL;
|
|
PFNHtmlHelp _pFnHtmlHelp;
|
|
|
|
HMODULE _hUxTheme;
|
|
PFNEnableThemeDialogTexture _pFnEnableThemeDialogTexture;
|
|
BOOL _fFailedToGetThemeDll;
|
|
};
|
|
|
|
#endif // _SH_H_
|