diff --git a/freeldr/freeldr/CHANGELOG b/freeldr/freeldr/CHANGELOG index d3d358339c5..dfd92706eb1 100644 --- a/freeldr/freeldr/CHANGELOG +++ b/freeldr/freeldr/CHANGELOG @@ -1,3 +1,12 @@ +Changes in v1.8 (1/18/2003) (brianp) + +- Added F8 options menu +- Added custom Boot functionality +- Moved all OS= settings from [FreeLoader] section to [Operating Systems] section. +- Removed MessageLine= setting. MessageBox= now accepts "\n" as an escape character for newlines. +- Added descriptions for disk error codes returned by the BIOS. +- Device names like "fd0" and "hd0" and "hd1" as well as BIOS drive numbers can now be used as BootDrive= settings. + Changes in v1.7.12 (12/05/2002) (brianp) - Minor tweak to UI code to allow description diff --git a/freeldr/freeldr/Makefile b/freeldr/freeldr/Makefile index a1c5a373ad7..b66af39fe12 100644 --- a/freeldr/freeldr/Makefile +++ b/freeldr/freeldr/Makefile @@ -204,7 +204,8 @@ ARCH_OBJS = fathelp.o \ i386vid.o \ drvmap.o \ int386.o \ - i386disk.o + i386disk.o \ + portio.o RTL_OBJS = print.o \ stdlib.o \ @@ -230,8 +231,7 @@ REACTOS_OBJS= reactos.o \ reghive.o \ registry.o -COMM_OBJS = rs232.o \ - portio.o +COMM_OBJS = rs232.o DISK_OBJS = disk.o \ geometry.o \ @@ -269,7 +269,8 @@ FREELDR_OBJS= bootmgr.o \ miscboot.o \ options.o \ linuxboot.o \ - oslist.o + oslist.o \ + custom.o SETUPLDR_OBJS= setupldr.o diff --git a/freeldr/freeldr/bootmgr.c b/freeldr/freeldr/bootmgr.c index 86726eeb445..b654897daa0 100644 --- a/freeldr/freeldr/bootmgr.c +++ b/freeldr/freeldr/bootmgr.c @@ -1,6 +1,6 @@ /* * FreeLoader - * Copyright (C) 1998-2002 Brian Palmer + * Copyright (C) 1998-2003 Brian Palmer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,10 +28,12 @@ #include #include #include +#include #include #include #include #include +#include BOOL IsSetupLdr = FALSE; @@ -94,7 +96,7 @@ VOID RunLoader(VOID) UiDrawBackdrop(); // Show the operating system list menu - if (!UiDisplayMenu(OperatingSystemDisplayNames, OperatingSystemCount, DefaultOperatingSystem, TimeOut, &SelectedOperatingSystem)) + if (!UiDisplayMenu(OperatingSystemDisplayNames, OperatingSystemCount, DefaultOperatingSystem, TimeOut, &SelectedOperatingSystem, FALSE, MainBootMenuKeyPressFilter)) { UiMessageBox("Press ENTER to reboot.\n"); goto reboot; @@ -127,7 +129,7 @@ VOID RunLoader(VOID) } else if (stricmp(SettingValue, "Linux") == 0) { - LoadAndBootLinux(OperatingSystemSectionNames[SelectedOperatingSystem]); + LoadAndBootLinux(OperatingSystemSectionNames[SelectedOperatingSystem], OperatingSystemDisplayNames[SelectedOperatingSystem]); } else if (stricmp(SettingValue, "BootSector") == 0) { @@ -145,8 +147,7 @@ VOID RunLoader(VOID) reboot: - VideoClearScreen(); - VideoShowTextCursor(); + UiUnInitialize("Rebooting..."); return; } @@ -199,3 +200,16 @@ S32 GetTimeOut(VOID) return TimeOut; } + +BOOL MainBootMenuKeyPressFilter(U32 KeyPress) +{ + if (KeyPress == KEY_F8) + { + DoOptionsMenu(); + + return TRUE; + } + + // We didn't handle the key + return FALSE; +} diff --git a/freeldr/freeldr/custom.c b/freeldr/freeldr/custom.c new file mode 100644 index 00000000000..9fef01311e3 --- /dev/null +++ b/freeldr/freeldr/custom.c @@ -0,0 +1,400 @@ +/* + * FreeLoader + * Copyright (C) 1998-2003 Brian Palmer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +UCHAR BootDrivePrompt[] = "Enter the boot drive.\n\nExamples:\nfd0 - first floppy drive\nhd0 - first hard drive\nhd1 - second hard drive\ncd0 - first CD-ROM drive.\n\nBIOS drive numbers may also be used:\n0 - first floppy drive\n0x80 - first hard drive\n0x81 - second hard drive"; +UCHAR BootPartitionPrompt[] = "Enter the boot partition.\n\nEnter 0 for the active (bootable) partition."; +UCHAR BootSectorFilePrompt[] = "Enter the boot sector file path.\n\nExamples:\n\\BOOTSECT.DOS\n/boot/bootsect.dos"; +UCHAR LinuxKernelPrompt[] = "Enter the Linux kernel image path.\n\nExamples:\n/vmlinuz\n/boot/vmlinuz-2.4.18"; +UCHAR LinuxInitrdPrompt[] = "Enter the initrd image path.\n\nExamples:\n/initrd.gz\n/boot/root.img.gz\n\nLeave blank for no initial ram disk."; +UCHAR LinuxCommandLinePrompt[] = "Enter the Linux kernel command line.\n\nExamples:\nroot=/dev/hda1\nroot=/dev/fd0 read-only\nroot=/dev/sdb1 init=/sbin/init"; +UCHAR ReactOSSystemPathPrompt[] = "Enter the path to your ReactOS system directory.\n\nExamples:\n\\REACTOS\n\\ROS"; +UCHAR ReactOSOptionsPrompt[] = "Enter the options you want passed to the kernel.\n\nExamples:\n/DEBUG /DEBUGPORT=COM1 /BAUDRATE=115200\n/FASTDETECT /SOS /NOGUIBOOT\n/BASEVIDEO /MAXMEM=64\n/KERNEL=NTKRNLMP.EXE /HAL=HALMPS.DLL"; + +UCHAR CustomBootPrompt[] = "Press ENTER to boot your custom boot setup."; + +VOID OptionMenuCustomBoot(VOID) +{ + PUCHAR CustomBootMenuList[] = { "Disk", "Partition", "Boot Sector File", "ReactOS", "Linux" }; + U32 CustomBootMenuCount = sizeof(CustomBootMenuList) / sizeof(CustomBootMenuList[0]); + U32 SelectedMenuItem; + + if (!UiDisplayMenu(CustomBootMenuList, CustomBootMenuCount, 0, -1, &SelectedMenuItem, TRUE, NULL)) + { + // The user pressed ESC + return; + } + + switch (SelectedMenuItem) + { + case 0: // Disk + OptionMenuCustomBootDisk(); + break; + case 1: // Partition + OptionMenuCustomBootPartition(); + break; + case 2: // Boot Sector File + OptionMenuCustomBootBootSectorFile(); + break; + case 3: // ReactOS + OptionMenuCustomBootReactOS(); + break; + case 4: // Linux + OptionMenuCustomBootLinux(); + break; + } +} + +VOID OptionMenuCustomBootDisk(VOID) +{ + UCHAR SectionName[100]; + UCHAR BootDriveString[20]; + U32 SectionId; + + RtlZeroMemory(SectionName, sizeof(SectionName)); + RtlZeroMemory(BootDriveString, sizeof(BootDriveString)); + + if (!UiEditBox(BootDrivePrompt, BootDriveString, 20)) + { + return; + } + + // Generate a unique section name + sprintf(SectionName, "CustomBootDisk%d%d%d%d%d%d", getyear(), getday(), getmonth(), gethour(), getminute(), getsecond()); + + // Add the section + if (!IniAddSection(SectionName, &SectionId)) + { + return; + } + + // Add the BootType + if (!IniAddSettingValueToSection(SectionId, "BootType", "Drive")) + { + return; + } + + // Add the BootDrive + if (!IniAddSettingValueToSection(SectionId, "BootDrive", BootDriveString)) + { + return; + } + + UiMessageBox(CustomBootPrompt); + + LoadAndBootDrive(SectionName); +} + +VOID OptionMenuCustomBootPartition(VOID) +{ + UCHAR SectionName[100]; + UCHAR BootDriveString[20]; + UCHAR BootPartitionString[20]; + U32 SectionId; + + RtlZeroMemory(SectionName, sizeof(SectionName)); + RtlZeroMemory(BootDriveString, sizeof(BootDriveString)); + RtlZeroMemory(BootPartitionString, sizeof(BootPartitionString)); + + if (!UiEditBox(BootDrivePrompt, BootDriveString, 20)) + { + return; + } + + if (!UiEditBox(BootPartitionPrompt, BootPartitionString, 20)) + { + return; + } + + // Generate a unique section name + sprintf(SectionName, "CustomBootPartition%d%d%d%d%d%d", getyear(), getday(), getmonth(), gethour(), getminute(), getsecond()); + + // Add the section + if (!IniAddSection(SectionName, &SectionId)) + { + return; + } + + // Add the BootType + if (!IniAddSettingValueToSection(SectionId, "BootType", "Partition")) + { + return; + } + + // Add the BootDrive + if (!IniAddSettingValueToSection(SectionId, "BootDrive", BootDriveString)) + { + return; + } + + // Add the BootPartition + if (!IniAddSettingValueToSection(SectionId, "BootPartition", BootPartitionString)) + { + return; + } + + UiMessageBox(CustomBootPrompt); + + LoadAndBootPartition(SectionName); +} + +VOID OptionMenuCustomBootBootSectorFile(VOID) +{ + UCHAR SectionName[100]; + UCHAR BootDriveString[20]; + UCHAR BootPartitionString[20]; + UCHAR BootSectorFileString[200]; + U32 SectionId; + + RtlZeroMemory(SectionName, sizeof(SectionName)); + RtlZeroMemory(BootDriveString, sizeof(BootDriveString)); + RtlZeroMemory(BootPartitionString, sizeof(BootPartitionString)); + RtlZeroMemory(BootSectorFileString, sizeof(BootSectorFileString)); + + if (!UiEditBox(BootDrivePrompt, BootDriveString, 20)) + { + return; + } + + if (!UiEditBox(BootPartitionPrompt, BootPartitionString, 20)) + { + return; + } + + if (!UiEditBox(BootSectorFilePrompt, BootSectorFileString, 200)) + { + return; + } + + // Generate a unique section name + sprintf(SectionName, "CustomBootSectorFile%d%d%d%d%d%d", getyear(), getday(), getmonth(), gethour(), getminute(), getsecond()); + + // Add the section + if (!IniAddSection(SectionName, &SectionId)) + { + return; + } + + // Add the BootType + if (!IniAddSettingValueToSection(SectionId, "BootType", "BootSector")) + { + return; + } + + // Add the BootDrive + if (!IniAddSettingValueToSection(SectionId, "BootDrive", BootDriveString)) + { + return; + } + + // Add the BootPartition + if (!IniAddSettingValueToSection(SectionId, "BootPartition", BootPartitionString)) + { + return; + } + + // Add the BootSectorFile + if (!IniAddSettingValueToSection(SectionId, "BootSectorFile", BootSectorFileString)) + { + return; + } + + UiMessageBox(CustomBootPrompt); + + LoadAndBootBootSector(SectionName); +} + +VOID OptionMenuCustomBootReactOS(VOID) +{ + UCHAR SectionName[100]; + UCHAR BootDriveString[20]; + UCHAR BootPartitionString[20]; + UCHAR ReactOSSystemPath[200]; + UCHAR ReactOSARCPath[200]; + UCHAR ReactOSOptions[200]; + U32 SectionId; + + RtlZeroMemory(SectionName, sizeof(SectionName)); + RtlZeroMemory(BootDriveString, sizeof(BootDriveString)); + RtlZeroMemory(BootPartitionString, sizeof(BootPartitionString)); + RtlZeroMemory(ReactOSSystemPath, sizeof(ReactOSSystemPath)); + RtlZeroMemory(ReactOSOptions, sizeof(ReactOSOptions)); + + if (!UiEditBox(BootDrivePrompt, BootDriveString, 20)) + { + return; + } + + if (!UiEditBox(BootPartitionPrompt, BootPartitionString, 20)) + { + return; + } + + if (!UiEditBox(ReactOSSystemPathPrompt, ReactOSSystemPath, 200)) + { + return; + } + + if (!UiEditBox(ReactOSOptionsPrompt, ReactOSOptions, 200)) + { + return; + } + + // Generate a unique section name + sprintf(SectionName, "CustomReactOS%d%d%d%d%d%d", getyear(), getday(), getmonth(), gethour(), getminute(), getsecond()); + + // Add the section + if (!IniAddSection(SectionName, &SectionId)) + { + return; + } + + // Add the BootType + if (!IniAddSettingValueToSection(SectionId, "BootType", "ReactOS")) + { + return; + } + + // Construct the ReactOS ARC system path + ConstructArcPath(ReactOSARCPath, ReactOSSystemPath, DriveMapGetBiosDriveNumber(BootDriveString), atoi(BootPartitionString)); + + // Add the system path + if (!IniAddSettingValueToSection(SectionId, "SystemPath", ReactOSARCPath)) + { + return; + } + + // Add the CommandLine + if (!IniAddSettingValueToSection(SectionId, "Options", ReactOSOptions)) + { + return; + } + + UiMessageBox(CustomBootPrompt); + + LoadAndBootReactOS(SectionName); +} + +VOID OptionMenuCustomBootLinux(VOID) +{ + UCHAR SectionName[100]; + UCHAR BootDriveString[20]; + UCHAR BootPartitionString[20]; + UCHAR LinuxKernelString[200]; + UCHAR LinuxInitrdString[200]; + UCHAR LinuxCommandLineString[200]; + U32 SectionId; + + RtlZeroMemory(SectionName, sizeof(SectionName)); + RtlZeroMemory(BootDriveString, sizeof(BootDriveString)); + RtlZeroMemory(BootPartitionString, sizeof(BootPartitionString)); + RtlZeroMemory(LinuxKernelString, sizeof(LinuxKernelString)); + RtlZeroMemory(LinuxInitrdString, sizeof(LinuxInitrdString)); + RtlZeroMemory(LinuxCommandLineString, sizeof(LinuxCommandLineString)); + + if (!UiEditBox(BootDrivePrompt, BootDriveString, 20)) + { + return; + } + + if (!UiEditBox(BootPartitionPrompt, BootPartitionString, 20)) + { + return; + } + + if (!UiEditBox(LinuxKernelPrompt, LinuxKernelString, 200)) + { + return; + } + + if (!UiEditBox(LinuxInitrdPrompt, LinuxInitrdString, 200)) + { + return; + } + + if (!UiEditBox(LinuxCommandLinePrompt, LinuxCommandLineString, 200)) + { + return; + } + + // Generate a unique section name + sprintf(SectionName, "CustomLinux%d%d%d%d%d%d", getyear(), getday(), getmonth(), gethour(), getminute(), getsecond()); + + // Add the section + if (!IniAddSection(SectionName, &SectionId)) + { + return; + } + + // Add the BootType + if (!IniAddSettingValueToSection(SectionId, "BootType", "Linux")) + { + return; + } + + // Add the BootDrive + if (!IniAddSettingValueToSection(SectionId, "BootDrive", BootDriveString)) + { + return; + } + + // Add the BootPartition + if (!IniAddSettingValueToSection(SectionId, "BootPartition", BootPartitionString)) + { + return; + } + + // Add the Kernel + if (!IniAddSettingValueToSection(SectionId, "Kernel", LinuxKernelString)) + { + return; + } + + // Add the Initrd + if (strlen(LinuxInitrdString) > 0) + { + if (!IniAddSettingValueToSection(SectionId, "Initrd", LinuxInitrdString)) + { + return; + } + } + + // Add the CommandLine + if (!IniAddSettingValueToSection(SectionId, "CommandLine", LinuxCommandLineString)) + { + return; + } + + UiMessageBox(CustomBootPrompt); + + LoadAndBootLinux(SectionName, "Custom Linux Setup"); +} diff --git a/freeldr/freeldr/debug.c b/freeldr/freeldr/debug.c index c978ba8bb20..68787c9244d 100644 --- a/freeldr/freeldr/debug.c +++ b/freeldr/freeldr/debug.c @@ -1,6 +1,6 @@ /* * FreeLoader - * Copyright (C) 1998-2002 Brian Palmer + * Copyright (C) 1998-2003 Brian Palmer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,14 +21,15 @@ #include #include #include +#include #ifdef DEBUG -#define DEBUG_ALL -//#define DEBUG_INIFILE +//#define DEBUG_ALL +#define DEBUG_INIFILE //#define DEBUG_REACTOS //#define DEBUG_CUSTOM -#define DEBUG_NONE +//#define DEBUG_NONE #if defined (DEBUG_ALL) U32 DebugPrintMask = DPRINT_WARNING | DPRINT_MEMORY | DPRINT_FILESYSTEM | diff --git a/freeldr/freeldr/drivemap.c b/freeldr/freeldr/drivemap.c index 36b10817059..f32fd718661 100644 --- a/freeldr/freeldr/drivemap.c +++ b/freeldr/freeldr/drivemap.c @@ -1,6 +1,6 @@ /* * FreeLoader - * Copyright (C) 1998-2002 Brian Palmer + * Copyright (C) 1998-2003 Brian Palmer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -151,6 +151,13 @@ U32 DriveMapGetBiosDriveNumber(PUCHAR DeviceName) { U32 BiosDriveNumber = 0; + // If they passed in a number string then just + // convert it to decimal and return it + if (DeviceName[0] >= '0' && DeviceName[0] <= '9') + { + return atoi(DeviceName); + } + // Convert the drive number string into a number // 'hd1' = 1 BiosDriveNumber = atoi(&DeviceName[2]);