479 lines
18 KiB
C++
479 lines
18 KiB
C++
// File: rdswiz.cpp
|
||
|
||
#include "precomp.h"
|
||
#include "confcpl.h"
|
||
#include "conf.h"
|
||
#include "nmremote.h"
|
||
|
||
#define NUM_RDSPAGES 4
|
||
|
||
VOID EnableRDS(BOOL fEnabledRDS);
|
||
INT_PTR CALLBACK RemotePasswordDlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam);
|
||
extern int MessageBoxResource(HWND hwnd, UINT uMessage, UINT uTitle, UINT uFlags);
|
||
|
||
INT_PTR CALLBACK RDSWizard0Proc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam);
|
||
INT_PTR CALLBACK RDSWizard1Proc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam);
|
||
INT_PTR CALLBACK RDSWizard2Proc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam);
|
||
INT_PTR CALLBACK RDSWizard3Proc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam);
|
||
|
||
typedef struct _RDSWIZINFO
|
||
{
|
||
BOOL fEnabledRDS;
|
||
PBYTE pbHashedPassword;
|
||
DWORD cbHashedPassword;
|
||
CHash* pHash;
|
||
} RDSWIZINFO, *PRDSWIZINFO;
|
||
|
||
BOOL IntCreateRDSWizard(HWND hwndOwner)
|
||
{
|
||
UINT uNumPages = 0;
|
||
LPPROPSHEETPAGE ppsp = new PROPSHEETPAGE[NUM_RDSPAGES];
|
||
if (NULL == ppsp)
|
||
{
|
||
ERROR_OUT(("IntCreateRDSWizard: fail to allocate memory"));
|
||
return FALSE;
|
||
}
|
||
CHash hashObject;
|
||
RDSWIZINFO rdsconfig = { FALSE, NULL, 0, &hashObject };
|
||
|
||
FillInPropertyPage(&ppsp[uNumPages++], IDD_RDSWIZ_INTRO, RDSWizard0Proc, (LPARAM) &rdsconfig);
|
||
FillInPropertyPage(&ppsp[uNumPages++], ::IsWindowsNT() ? IDD_RDSWIZ_NTPASSWORDS : IDD_RDSWIZ_W98PASSWORD, RDSWizard1Proc, (LPARAM) &rdsconfig);
|
||
FillInPropertyPage(&ppsp[uNumPages++], IDD_RDSWIZ_SCRNSVR, RDSWizard2Proc, (LPARAM) &rdsconfig);
|
||
FillInPropertyPage(&ppsp[uNumPages++], IDD_RDSWIZ_CONGRATS, RDSWizard3Proc, (LPARAM) &rdsconfig);
|
||
|
||
PROPSHEETHEADER psh;
|
||
InitStruct(&psh);
|
||
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_WIZARD | PSH_NOAPPLYNOW;
|
||
psh.hwndParent = hwndOwner;
|
||
psh.nPages = uNumPages;
|
||
psh.ppsp = ppsp;
|
||
|
||
INT_PTR iRet = PropertySheet(&psh);
|
||
if (-1 == iRet)
|
||
{
|
||
ERROR_OUT(("IntCreateRDSWizard: fail to create PropertySheet"));
|
||
return FALSE;
|
||
}
|
||
|
||
delete []ppsp;
|
||
return TRUE;
|
||
}
|
||
|
||
INT_PTR CALLBACK RDSWizard0Proc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
|
||
{
|
||
static PRDSWIZINFO prds;
|
||
switch(iMsg)
|
||
{
|
||
case WM_INITDIALOG:
|
||
{
|
||
prds = (PRDSWIZINFO ) ((PROPSHEETPAGE *)lParam)->lParam;
|
||
ASSERT(prds);
|
||
return TRUE;
|
||
}
|
||
|
||
case WM_NOTIFY:
|
||
{
|
||
switch (((NMHDR FAR *) lParam)->code)
|
||
{
|
||
case PSN_SETACTIVE:
|
||
{
|
||
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
|
||
break;
|
||
}
|
||
case PSN_WIZNEXT:
|
||
{
|
||
prds->fEnabledRDS = TRUE;
|
||
break;
|
||
}
|
||
default:
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
const int MAXPASSWORDLENGTH = 36;
|
||
const int MINPASSWORDLENGTH = 7;
|
||
|
||
INT_PTR CALLBACK RDSWizard1Proc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
|
||
{
|
||
HWND hOldPasswordText, hNewPasswordText, hVerificationText;
|
||
int nOldPasswordLength, nNewPasswordLength, nVerificationLength;
|
||
CHAR lpOldPassword[MAXPASSWORDLENGTH], lpNewPassword[MAXPASSWORDLENGTH], lpVerification[MAXPASSWORDLENGTH];
|
||
WCHAR lpwszOldPassword[MAXPASSWORDLENGTH], lpwszNewPassword[MAXPASSWORDLENGTH];
|
||
PBYTE pbRegPassword;
|
||
DWORD cbRegPassword;
|
||
|
||
static PRDSWIZINFO prds;
|
||
switch(iMsg)
|
||
{
|
||
case WM_INITDIALOG:
|
||
{
|
||
prds = (PRDSWIZINFO )((PROPSHEETPAGE*)lParam)->lParam;
|
||
if (!::IsWindowsNT())
|
||
{
|
||
ASSERT(prds->pHash);
|
||
RegEntry reLM(REMOTECONTROL_KEY, HKEY_LOCAL_MACHINE);
|
||
cbRegPassword = reLM.GetBinary(REMOTE_REG_PASSWORD, (void **)&pbRegPassword);
|
||
|
||
if (0 == cbRegPassword)
|
||
{
|
||
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_RDSPASSWORDO), FALSE);
|
||
SetFocus(GetDlgItem(hDlg, IDC_EDIT_RDSPASSWORD));
|
||
}
|
||
SendDlgItemMessage(hDlg, IDC_EDIT_RDSPASSWORDO, EM_LIMITTEXT,MAXPASSWORDLENGTH - 1, 0);
|
||
SendDlgItemMessage(hDlg, IDC_EDIT_RDSPASSWORD, EM_LIMITTEXT,MAXPASSWORDLENGTH - 1, 0);
|
||
SendDlgItemMessage(hDlg, IDC_EDIT_RDSPASSWORDV, EM_LIMITTEXT,MAXPASSWORDLENGTH - 1, 0);
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
case WM_NOTIFY:
|
||
{
|
||
switch (((NMHDR FAR *) lParam)->code)
|
||
{
|
||
case PSN_SETACTIVE:
|
||
{
|
||
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
||
break;
|
||
}
|
||
case PSN_WIZNEXT:
|
||
{
|
||
if (!::IsWindowsNT())
|
||
{
|
||
PBYTE pbHashedPassword = NULL;
|
||
DWORD cbHashedPassword = 0;
|
||
|
||
RegEntry reLM( REMOTECONTROL_KEY, HKEY_LOCAL_MACHINE);
|
||
|
||
hOldPasswordText = GetDlgItem(hDlg, IDC_EDIT_RDSPASSWORDO);
|
||
hNewPasswordText = GetDlgItem(hDlg, IDC_EDIT_RDSPASSWORD);
|
||
hVerificationText = GetDlgItem(hDlg, IDC_EDIT_RDSPASSWORDV);
|
||
|
||
nOldPasswordLength = GetWindowText(hOldPasswordText,lpOldPassword,MAXPASSWORDLENGTH);
|
||
MultiByteToWideChar(CP_ACP, 0, lpOldPassword, -1, lpwszOldPassword, MAXPASSWORDLENGTH);
|
||
cbRegPassword = reLM.GetBinary(REMOTE_REG_PASSWORD, (void **)&pbRegPassword);
|
||
cbHashedPassword = prds->pHash->GetHashedData((LPBYTE)lpwszOldPassword,
|
||
sizeof(WCHAR)*strlen(lpOldPassword),
|
||
(void **)&pbHashedPassword);
|
||
|
||
if (0 != cbRegPassword && !(cbHashedPassword == cbRegPassword && 0 == memcmp(pbHashedPassword,pbRegPassword,cbHashedPassword)))
|
||
{
|
||
// Error Case - Old password incorrect.
|
||
MessageBoxResource(hDlg,IDS_REMOTE_OLD_PASSWORD_WRONG_TEXT,IDS_REMOTE_OLD_PASSWORD_WRONG_TITLE,MB_OK | MB_ICONERROR);
|
||
SetWindowText(hOldPasswordText,NULL);
|
||
SetWindowText(hNewPasswordText,NULL);
|
||
SetWindowText(hVerificationText,NULL);
|
||
SetFocus(hOldPasswordText);
|
||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
|
||
break;
|
||
}
|
||
nNewPasswordLength = GetWindowText(hNewPasswordText,lpNewPassword,MAXPASSWORDLENGTH);
|
||
nVerificationLength = GetWindowText(hVerificationText,lpVerification,MAXPASSWORDLENGTH);
|
||
|
||
if (0 != lstrcmp(lpNewPassword, lpVerification))
|
||
{
|
||
MessageBoxResource(hDlg,IDS_REMOTE_NEW_PASSWORD_WRONG_TEXT,IDS_REMOTE_NEW_PASSWORD_WRONG_TITLE,MB_OK | MB_ICONERROR);
|
||
SetWindowText(hNewPasswordText,NULL);
|
||
SetWindowText(hVerificationText,NULL);
|
||
SetFocus(hNewPasswordText);
|
||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
|
||
break;
|
||
}
|
||
if (nNewPasswordLength < MINPASSWORDLENGTH)
|
||
{
|
||
MessageBoxResource(hDlg,IDS_REMOTE_NEW_PASSWORD_LENGTH_TEXT,IDS_REMOTE_NEW_PASSWORD_LENGTH_TITLE,MB_OK | MB_ICONERROR);
|
||
SetWindowText(hNewPasswordText,NULL);
|
||
SetWindowText(hVerificationText,NULL);
|
||
SetFocus(hNewPasswordText);
|
||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
|
||
break;
|
||
}
|
||
if (!lstrlen(lpVerification)) {
|
||
// Don't allow empty password
|
||
MessageBoxResource(hDlg,IDS_REMOTE_NEW_PASSWORD_EMPTY,IDS_REMOTE_NEW_PASSWORD_WRONG_TITLE,MB_OK | MB_ICONERROR);
|
||
SetWindowText(hNewPasswordText,NULL);
|
||
SetWindowText(hVerificationText,NULL);
|
||
SetFocus(hNewPasswordText);
|
||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
|
||
break;
|
||
}
|
||
if (!FAnsiSz(lpNewPassword)) {
|
||
// Error Case - T.120 can't handle UNICODE passwords
|
||
MessageBoxResource(hDlg,IDS_REMOTE_NEW_PASSWORD_INVALID_TEXT,IDS_REMOTE_NEW_PASSWORD_WRONG_TITLE,MB_OK | MB_ICONERROR);
|
||
SetWindowText(hNewPasswordText,NULL);
|
||
SetWindowText(hVerificationText,NULL);
|
||
SetFocus(hNewPasswordText);
|
||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
|
||
break;
|
||
}
|
||
MultiByteToWideChar(CP_ACP, 0, lpNewPassword, -1, lpwszNewPassword, MAXPASSWORDLENGTH);
|
||
prds->cbHashedPassword = prds->pHash->GetHashedData((LPBYTE)lpwszNewPassword, sizeof(WCHAR)*lstrlen(lpNewPassword), (void **)&prds->pbHashedPassword);
|
||
|
||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, 0);
|
||
}
|
||
break;
|
||
}
|
||
|
||
default:
|
||
{
|
||
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, 0);
|
||
break;
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
INT_PTR CALLBACK RDSWizard2Proc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
|
||
{
|
||
static PRDSWIZINFO prds;
|
||
|
||
switch(iMsg)
|
||
{
|
||
case WM_INITDIALOG:
|
||
{
|
||
prds = (PRDSWIZINFO )((PROPSHEETPAGE*)lParam)->lParam;
|
||
SendDlgItemMessage(hDlg, IDC_SCRSAVER_NOW, BM_SETCHECK, 1, 0);
|
||
return TRUE;
|
||
}
|
||
|
||
case WM_NOTIFY:
|
||
{
|
||
switch (((NMHDR FAR *) lParam)->code)
|
||
{
|
||
case PSN_SETACTIVE:
|
||
{
|
||
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
||
break;
|
||
}
|
||
|
||
case PSN_WIZNEXT:
|
||
{
|
||
if (BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_SCRSAVER_NOW))
|
||
{
|
||
WinExec("Rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1", SW_SHOWDEFAULT);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
INT_PTR CALLBACK RDSWizard3Proc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
|
||
{
|
||
static PRDSWIZINFO prds;
|
||
switch(iMsg)
|
||
{
|
||
case WM_INITDIALOG:
|
||
{
|
||
prds = (PRDSWIZINFO ) ((PROPSHEETPAGE*)lParam)->lParam;
|
||
PropSheet_SetWizButtons(hDlg, PSWIZB_FINISH);
|
||
return TRUE;
|
||
}
|
||
|
||
case WM_NOTIFY:
|
||
{
|
||
switch (((NMHDR FAR *) lParam)->code)
|
||
{
|
||
case PSN_SETACTIVE:
|
||
{
|
||
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_FINISH);
|
||
break;
|
||
}
|
||
case PSN_WIZFINISH:
|
||
{
|
||
ASSERT(prds->fEnabledRDS);
|
||
EnableRDS(prds->fEnabledRDS);
|
||
if (!::IsWindowsNT())
|
||
{
|
||
ASSERT(prds->pbHashedPassword);
|
||
ASSERT(prds->cbHashedPassword);
|
||
RegEntry reLM(REMOTECONTROL_KEY, HKEY_LOCAL_MACHINE);
|
||
reLM.SetValue(REMOTE_REG_PASSWORD,prds->pbHashedPassword,prds->cbHashedPassword);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
INT_PTR CALLBACK RDSSettingDlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
|
||
{
|
||
switch(iMsg)
|
||
{
|
||
case WM_INITDIALOG:
|
||
{
|
||
if (::IsWindowsNT())
|
||
{
|
||
ShowWindow(GetDlgItem(hDlg, IDC_RDS_PASSWORD), SW_HIDE);
|
||
}
|
||
|
||
RegEntry reLM( REMOTECONTROL_KEY, HKEY_LOCAL_MACHINE);
|
||
if (reLM.GetNumber(REMOTE_REG_RUNSERVICE, DEFAULT_REMOTE_RUNSERVICE))
|
||
{
|
||
SendDlgItemMessage(hDlg, IDC_RDS_RUNRDS, BM_SETCHECK, 1, 0);
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
case WM_COMMAND:
|
||
{
|
||
switch (LOWORD(wParam))
|
||
{
|
||
case IDOK:
|
||
{
|
||
EnableRDS(BST_CHECKED==IsDlgButtonChecked(hDlg, IDC_RDS_RUNRDS));
|
||
EndDialog(hDlg, 1);
|
||
break;
|
||
}
|
||
|
||
case IDCANCEL:
|
||
EndDialog(hDlg, 0);
|
||
break;
|
||
|
||
case IDC_RDS_PASSWORD:
|
||
DialogBox(::GetInstanceHandle(), MAKEINTRESOURCE(IDD_REMOTE_PASSWORD), hDlg, RemotePasswordDlgProc);
|
||
break;
|
||
|
||
case IDC_BUTTON_RDSWIZ:
|
||
{
|
||
IntCreateRDSWizard(hDlg);
|
||
RegEntry reLM( REMOTECONTROL_KEY, HKEY_LOCAL_MACHINE);
|
||
SendDlgItemMessage(hDlg, IDC_RDS_RUNRDS, BM_SETCHECK, reLM.GetNumber(REMOTE_REG_RUNSERVICE, DEFAULT_REMOTE_RUNSERVICE) ? 1 : 0, 0);
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
VOID EnableRDS(BOOL fEnabledRDS)
|
||
{
|
||
//
|
||
// Can RDS be touched? Check policies and app sharing state.
|
||
//
|
||
if (ConfPolicies::IsRDSDisabled())
|
||
return;
|
||
|
||
if (::IsWindowsNT())
|
||
{
|
||
if (!g_fNTDisplayDriverEnabled)
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
if (ConfPolicies::IsRDSDisabledOnWin9x())
|
||
return;
|
||
}
|
||
|
||
{
|
||
RegEntry reLM( REMOTECONTROL_KEY, HKEY_LOCAL_MACHINE);
|
||
reLM.SetValue(REMOTE_REG_RUNSERVICE, fEnabledRDS ? 1 : 0);
|
||
reLM.SetValue(REMOTE_REG_ACTIVATESERVICE, (ULONG)0);
|
||
if (::IsWindowsNT())
|
||
{
|
||
SC_HANDLE hSCManager = NULL;
|
||
SC_HANDLE hRemoteControl = NULL;
|
||
SERVICE_STATUS serviceStatus;
|
||
|
||
hSCManager = OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ALL_ACCESS);
|
||
hRemoteControl = OpenService(hSCManager,REMOTE_CONTROL_NAME,SERVICE_ALL_ACCESS);
|
||
|
||
if (hSCManager)
|
||
{
|
||
if (hRemoteControl)
|
||
{
|
||
ChangeServiceConfig(hRemoteControl,
|
||
SERVICE_NO_CHANGE,
|
||
fEnabledRDS ? SERVICE_AUTO_START : SERVICE_DEMAND_START,
|
||
SERVICE_NO_CHANGE,
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
NULL);
|
||
BOOL fSuccess = QueryServiceStatus(hRemoteControl, &serviceStatus);
|
||
if (fEnabledRDS)
|
||
{
|
||
if (fSuccess && SERVICE_STOPPED == serviceStatus.dwCurrentState)
|
||
StartService(hRemoteControl,0,NULL);
|
||
}
|
||
else
|
||
{
|
||
if (fSuccess && SERVICE_PAUSED == serviceStatus.dwCurrentState)
|
||
{
|
||
if (!ControlService(hRemoteControl,
|
||
SERVICE_CONTROL_STOP, &serviceStatus))
|
||
{
|
||
WARNING_OUT(("EnableRDS: ControlService failed %d (%x)",
|
||
GetLastError(), GetLastError() ));
|
||
}
|
||
}
|
||
}
|
||
CloseServiceHandle(hRemoteControl);
|
||
}
|
||
else
|
||
{
|
||
WARNING_OUT(("EnableRDS: OpenService failed %x", GetLastError() ));
|
||
}
|
||
CloseServiceHandle(hSCManager);
|
||
}
|
||
else
|
||
{
|
||
ERROR_OUT(("EnableRDS: OpenSCManager failed: %x", GetLastError() ));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
RegEntry reServiceKey(WIN95_SERVICE_KEY, HKEY_LOCAL_MACHINE);
|
||
HANDLE hServiceEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, SERVICE_STOP_EVENT);
|
||
|
||
if ( fEnabledRDS )
|
||
{
|
||
TCHAR szSystemDir[MAX_PATH];
|
||
if (GetSystemDirectory(szSystemDir,MAX_PATH)) {
|
||
// Only append '\' if system dir is not root
|
||
if ( lstrlen(szSystemDir) > 3 )
|
||
lstrcat(szSystemDir, _T("\\"));
|
||
lstrcat(szSystemDir,WIN95_SERVICE_APP_NAME);
|
||
reServiceKey.SetValue(REMOTE_REG_RUNSERVICE,
|
||
szSystemDir);
|
||
}
|
||
if (NULL == hServiceEvent)
|
||
WinExec(WIN95_SERVICE_APP_NAME,SW_SHOWNORMAL);
|
||
}
|
||
else
|
||
{
|
||
reServiceKey.DeleteValue(REMOTE_REG_RUNSERVICE);
|
||
if (hServiceEvent)
|
||
{
|
||
SetEvent(hServiceEvent);
|
||
}
|
||
}
|
||
CloseHandle(hServiceEvent);
|
||
}
|
||
}
|
||
}
|
||
|