windows-nt/Source/XPSP1/NT/enduser/netmeeting/ui/conf/rdswiz.cpp
2020-09-26 16:20:57 +08:00

479 lines
18 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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);
}
}
}