From 799b6ad5b84fc6ed9e0650870bf737c423f478a9 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 28 May 2010 22:54:27 +0000 Subject: [PATCH] [FREELOADER] - Fix DoOptionsMenu and implement AppendBootOptions to support F8 boot options - Fixes bug 5363 svn path=/trunk/; revision=47387 --- .../boot/freeldr/freeldr/include/options.h | 1 + reactos/boot/freeldr/freeldr/options.c | 46 +++++++++++++++++++ .../boot/freeldr/freeldr/reactos/reactos.c | 5 ++ reactos/boot/freeldr/freeldr/windows/winldr.c | 3 ++ 4 files changed, 55 insertions(+) diff --git a/reactos/boot/freeldr/freeldr/include/options.h b/reactos/boot/freeldr/freeldr/include/options.h index 124b64e2326..b00d9f58daf 100644 --- a/reactos/boot/freeldr/freeldr/include/options.h +++ b/reactos/boot/freeldr/freeldr/include/options.h @@ -20,3 +20,4 @@ #pragma once VOID DoOptionsMenu(VOID); +VOID AppendBootTimeOptions(PCHAR BootOptions); diff --git a/reactos/boot/freeldr/freeldr/options.c b/reactos/boot/freeldr/freeldr/options.c index 4dabc89c6f4..5b64b46a077 100644 --- a/reactos/boot/freeldr/freeldr/options.c +++ b/reactos/boot/freeldr/freeldr/options.c @@ -69,6 +69,15 @@ enum OptionMenuItems ULONG OptionsMenuItemCount = sizeof(OptionsMenuList) / sizeof(OptionsMenuList[0]); +BOOLEAN SafeMode = FALSE; +BOOLEAN SafeModeWithNetworking = FALSE; +BOOLEAN SafeModeWithCommandPrompt = FALSE; +BOOLEAN BootLogging = FALSE; +BOOLEAN VgaMode = FALSE; +BOOLEAN LastKnownGoodConfiguration = FALSE; +BOOLEAN DirectoryServicesRepairMode = FALSE; +BOOLEAN DebuggingMode = FALSE; + VOID DoOptionsMenu(VOID) { ULONG SelectedMenuItem; @@ -85,22 +94,33 @@ VOID DoOptionsMenu(VOID) switch (SelectedMenuItem) { case SAFE_MODE: + SafeMode = TRUE; + BootLogging = TRUE; break; case SAFE_MODE_WITH_NETWORKING: + SafeModeWithNetworking = TRUE; + BootLogging = TRUE; break; case SAFE_MODE_WITH_COMMAND_PROMPT: + SafeModeWithCommandPrompt = TRUE; + BootLogging = TRUE; break; //case SEPARATOR1: // break; case ENABLE_BOOT_LOGGING: + BootLogging = TRUE; break; case ENABLE_VGA_MODE: + VgaMode = TRUE; break; case LAST_KNOWN_GOOD_CONFIGURATION: + LastKnownGoodConfiguration = TRUE; break; case DIRECTORY_SERVICES_RESTORE_MODE: + DirectoryServicesRepairMode = TRUE; break; case DEBUGGING_MODE: + DebuggingMode = TRUE; break; //case SEPARATOR2: // break; @@ -117,3 +137,29 @@ VOID DoOptionsMenu(VOID) } } +VOID AppendBootTimeOptions(PCHAR BootOptions) +{ + if (SafeMode) + strcat(BootOptions, " /SAFEBOOT:MINIMAL /SOS"); //FIXME: NOGUIBOOT should also be specified + + if (SafeModeWithNetworking) + strcat(BootOptions, " /SAFEBOOT:NETWORK /SOS"); //FIXME: NOGUIBOOT should also be specified + + if (SafeModeWithCommandPrompt) + strcat(BootOptions, " /SAFEBOOT:MINIMAL(ALTERNATESHELL) /SOS"); //FIXME: NOGUIBOOT should also be specified + + if (BootLogging) + strcat(BootOptions, " /BOOTLOG"); + + if (VgaMode) + strcat(BootOptions, " /BASEVIDEO"); + + if (LastKnownGoodConfiguration) + DbgPrint("Last known good configuration is not supported yet!\n"); + + if (DirectoryServicesRepairMode) + strcat(BootOptions, " /SAFEBOOT:DSREPAIR /SOS"); + + if (DebuggingMode) + strcat(BootOptions, " /DEBUG"); +} diff --git a/reactos/boot/freeldr/freeldr/reactos/reactos.c b/reactos/boot/freeldr/freeldr/reactos/reactos.c index 81b654b84b9..22f3771b28b 100644 --- a/reactos/boot/freeldr/freeldr/reactos/reactos.c +++ b/reactos/boot/freeldr/freeldr/reactos/reactos.c @@ -606,6 +606,11 @@ LoadAndBootReactOS(PCSTR OperatingSystemName) // if (IniReadSettingByName(SectionId, "Options", value, sizeof(value))) { + // + // Append boot-time options + // + AppendBootTimeOptions(value); + // // Check if a ramdisk file was given // diff --git a/reactos/boot/freeldr/freeldr/windows/winldr.c b/reactos/boot/freeldr/freeldr/windows/winldr.c index d130472ebae..c068517dd2b 100644 --- a/reactos/boot/freeldr/freeldr/windows/winldr.c +++ b/reactos/boot/freeldr/freeldr/windows/winldr.c @@ -475,6 +475,9 @@ LoadAndBootWindows(PCSTR OperatingSystemName, DPRINTM(DPRINT_WINDOWS,"BootOptions: '%s'\n", BootOptions); } + /* Append boot-time options */ + AppendBootTimeOptions(BootOptions); + // // Check if a ramdisk file was given //