windows-nt/Source/XPSP1/NT/shell/cpls/system/startup.c
2020-09-26 16:20:57 +08:00

321 lines
9.2 KiB
C

/*++
Microsoft Confidential
Copyright (c) 1992-1997 Microsoft Corporation
All rights reserved
Module Name:
startup.c
Abstract:
Implements the Startup/Recovery dialog of the System
Control Panel Applet
Author:
Eric Flo (ericflo) 19-Jun-1995
Revision History:
15-Oct-1997 scotthal
Complete overhaul
--*/
#include <sysdm.h>
#ifdef _X86_
extern TCHAR szBootIni[];
#endif
//
// Globals for this dialog
//
#define CSEC_START_MAX 9999 // Maximum number of seconds allowed
BOOL g_fStartupInitializing;
BOOL g_fRebootRequired = FALSE;
#if defined(_X86_) || defined(EFI_NVRAM_ENABLED)
BOOL g_fSystemStartupEnabled = TRUE;
#else
BOOL g_fSystemStartupEnabled = FALSE;
#endif
//
// Help ID's
//
DWORD aStartupHelpIds[] = {
IDC_STARTUP_SYS_OS_LABEL, (IDH_STARTUP + 0),
IDC_STARTUP_SYS_OS, (IDH_STARTUP + 0),
IDC_STARTUP_SYS_ENABLECOUNTDOWN, (IDH_STARTUP + 1),
IDC_STARTUP_SYS_SECONDS, (IDH_STARTUP + 2),
IDC_STARTUP_SYS_SECONDS_LABEL, (IDH_STARTUP + 2),
IDC_STARTUP_CDMP_TXT1, (IDH_STARTUP + 3),
IDC_STARTUP_CDMP_LOG, (IDH_STARTUP + 4),
IDC_STARTUP_CDMP_SEND, (IDH_STARTUP + 5),
IDC_STARTUP_CDMP_FILENAME, (IDH_STARTUP + 7),
IDC_STARTUP_CDMP_OVERWRITE, (IDH_STARTUP + 13),
IDC_STARTUP_CDMP_AUTOREBOOT, (IDH_STARTUP + 9),
IDC_STARTUP_SYSTEM_GRP, (IDH_STARTUP + 10),
IDC_STARTUP_SYS_SECSCROLL, (IDH_STARTUP + 11),
IDC_STARTUP_CDMP_GRP, (IDH_STARTUP + 12),
IDC_STARTUP_CDMP_DEBUGINFO_GROUP, (IDH_STARTUP + 14),
IDC_STARTUP_CDMP_TYPE, (IDH_STARTUP + 8),
IDC_STARTUP_CDMP_FILE_LABEL, (IDH_STARTUP + 7),
IDC_STARTUP_SYS_EDIT_LABEL, (IDH_STARTUP + 15),
IDC_SYS_EDIT_BUTTION, (IDH_STARTUP + 16),
0, 0
};
INT_PTR
APIENTRY
StartupDlgProc(
IN HWND hDlg,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam
)
/*++
Routine Description:
Handles messages sent to the Startup/Recovery dialog box
Arguments:
hDlg -
Supplies window handle
uMsg -
Supplies message being sent
wParam -
Supplies message parameter
lParam -
Supplies message parameter
Return Value:
TRUE if message was handled
FALSE if message was unhandled
--*/
{
int iRet;
// If any controls on this page are touched by the user,
// enable the "Apply" button.
if ((WM_COMMAND == uMsg) && (!g_fStartupInitializing)) {
switch (HIWORD(wParam)) {
case EN_CHANGE:
case BN_CLICKED:
case CBN_SELCHANGE:
PropSheet_Changed(GetParent(hDlg), hDlg);
break;
default:
break;
} // switch (HIWORD(wParam))
} // if ((WM_COMMAND...
// Call the Core Dump stuff first. Only handle
// messages not handled by the Core Dump stuff.
iRet = CoreDumpDlgProc(hDlg, uMsg, wParam, lParam);
switch( iRet ) {
case RET_CONTINUE: {
break;
}
case RET_BREAK: {
return TRUE;
}
case RET_ERROR: {
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
return TRUE;
}
case RET_CHANGE_NO_REBOOT:
case RET_NO_CHANGE: {
break;
}
case RET_VIRTUAL_CHANGE:
case RET_RECOVER_CHANGE:
case RET_VIRT_AND_RECOVER: {
g_fRebootRequired = TRUE;
MsgBoxParam(
hDlg,
IDS_SYSDM_RESTART,
IDS_SYSDM_TITLE,
MB_OK | MB_ICONINFORMATION
);
break;
}
}
switch (uMsg)
{
case WM_INITDIALOG:
g_fStartupInitializing = TRUE;
StartListInit(hDlg, wParam, lParam);
AutoAdvancedBootInit(hDlg, wParam, lParam);
g_fStartupInitializing = FALSE;
if (!IsUserAdmin())
{
EnableWindow(GetDlgItem(hDlg, IDC_SYS_EDIT_BUTTION), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_STARTUP_SYS_EDIT_LABEL), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_STARTUP_AUTOLKG), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_STARTUP_AUTOLKG_SECONDS_LABEL), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_STARTUP_AUTOLKG_SECONDS), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_STARTUP_AUTOLKG_SECSCROLL), FALSE);
}
if (!g_fSystemStartupEnabled)
{
EnableWindow(GetDlgItem(hDlg, IDC_STARTUP_SYSTEM_GRP), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_STARTUP_SYS_OS), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_STARTUP_SYS_OS_LABEL), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_STARTUP_SYS_ENABLECOUNTDOWN), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_STARTUP_SYS_SECONDS_LABEL), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_STARTUP_SYS_SECONDS), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_STARTUP_SYS_EDIT_LABEL), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_SYS_EDIT_BUTTION), FALSE);
}
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_STARTUP_AUTOLKG:
if (HIWORD(wParam) == BN_CLICKED) {
BOOL fEnabled;
fEnabled = !IsDlgButtonChecked(hDlg, IDC_STARTUP_AUTOLKG);
CheckDlgButton(hDlg, IDC_STARTUP_AUTOLKG, fEnabled);
EnableWindow(GetDlgItem (hDlg, IDC_STARTUP_AUTOLKG_SECONDS), fEnabled);
EnableWindow(GetDlgItem (hDlg, IDC_STARTUP_AUTOLKG_SECSCROLL), fEnabled);
}
break;
case IDC_STARTUP_SYS_ENABLECOUNTDOWN:
if (HIWORD(wParam) == BN_CLICKED) {
int timeout;
timeout = IsDlgButtonChecked(hDlg, IDC_STARTUP_SYS_ENABLECOUNTDOWN) ? 0 : 30;
CheckDlgButton(hDlg, IDC_STARTUP_SYS_ENABLECOUNTDOWN,
(BOOL) timeout);
SetDlgItemInt(hDlg, IDC_STARTUP_SYS_SECONDS, timeout, FALSE);
EnableWindow(GetDlgItem (hDlg, IDC_STARTUP_SYS_SECONDS), (BOOL) timeout);
EnableWindow(GetDlgItem (hDlg, IDC_STARTUP_SYS_SECSCROLL), (BOOL) timeout);
}
break;
case IDOK: {
int r1, r2;
if((RET_BREAK != StartListExit(hDlg, wParam, lParam)) &&
(RET_BREAK != AutoAdvancedBootExit(hDlg, wParam, lParam)))
{
EndDialog(hDlg, 0);
} // if
break;
}
case IDCANCEL:
AutoAdvancedBootExit(hDlg, wParam, lParam);
EndDialog(hDlg, 0);
break;
case IDC_STARTUP_SYS_SECONDS:
if (HIWORD(wParam) == EN_UPDATE) {
if (!CheckVal(hDlg, IDC_STARTUP_SYS_SECONDS, FORMIN, FORMAX, IDS_SYSDM_ENTERSECONDS)) {
SetDlgItemInt(hDlg, IDC_STARTUP_SYS_SECONDS, FORDEF, FALSE);
SendMessage((HWND) lParam, EM_SETSEL, 0, -1);
} // if (!CheckVal(...
} // if (HIWORD(wParam == EN_UPDATE)
break;
case IDC_STARTUP_AUTOLKG_SECONDS:
if (HIWORD(wParam) == EN_UPDATE)
{
if (!CheckVal(hDlg, IDC_STARTUP_AUTOLKG_SECONDS, 0, 200, IDS_SYSDM_ENTERSECONDS))
{
SetDlgItemInt(hDlg, IDC_STARTUP_AUTOLKG_SECONDS, 30, FALSE);
SendMessage((HWND) lParam, EM_SETSEL, 0, -1);
} // if (!CheckVal(...
} // if (HIWORD(wParam == EN_UPDATE)
break;
case IDC_SYS_EDIT_BUTTION:
{
// invoke notepad.exe to edit boot.ini file
DWORD dwFileAttr;
SHELLEXECUTEINFO ExecInfo = {0};
#ifdef _X86_
ExecInfo.lpParameters = szBootIni;
#else
ExecInfo.lpParameters = TEXT("c:\\boot.ini");
#endif // _X86_
ExecInfo.lpFile = TEXT("NOTEPAD.EXE");
ExecInfo.nShow = SW_SHOWNORMAL;
ExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
// Change Read-only file attrs on Boot.ini file if necessary
if ((dwFileAttr = GetFileAttributes (ExecInfo.lpParameters)) != 0xFFFFFFFF)
{
if (dwFileAttr & FILE_ATTRIBUTE_READONLY)
{
SetFileAttributes (ExecInfo.lpParameters, dwFileAttr & ~FILE_ATTRIBUTE_READONLY);
}
}
ShellExecuteEx(&ExecInfo);
}
break;
} // switch (LOWORD(wParam))
break;
case WM_DESTROY:
StartListDestroy(hDlg, wParam, lParam);
break;
case WM_HELP: // F1
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_FILE, HELP_WM_HELP,
(DWORD_PTR) (LPSTR) aStartupHelpIds);
break;
case WM_CONTEXTMENU: // right mouse click
WinHelp((HWND) wParam, HELP_FILE, HELP_CONTEXTMENU,
(DWORD_PTR) (LPSTR) aStartupHelpIds);
break;
default:
return FALSE;
}
return TRUE;
}