3 * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 /* INCLUDES *******************************************************************/
24 /* GLOBALS ********************************************************************/
28 const CHAR BootSectorFilePrompt
[] = "Enter the boot sector file path.\n\nExamples:\n\\BOOTSECT.DOS\n/boot/bootsect.dos";
29 const CHAR LinuxKernelPrompt
[] = "Enter the Linux kernel image path.\n\nExamples:\n/vmlinuz\n/boot/vmlinuz-2.4.18";
30 const CHAR LinuxInitrdPrompt
[] = "Enter the initrd image path.\n\nExamples:\n/initrd.gz\n/boot/root.img.gz\n\nLeave blank for no initial ram disk.";
31 const CHAR LinuxCommandLinePrompt
[] = "Enter the Linux kernel command line.\n\nExamples:\nroot=/dev/hda1\nroot=/dev/fd0 read-only\nroot=/dev/sdb1 init=/sbin/init";
35 const CHAR 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";
36 const CHAR BootPartitionPrompt
[] = "Enter the boot partition.\n\nEnter 0 for the active (bootable) partition.";
37 const CHAR ReactOSSystemPathPrompt
[] = "Enter the path to your ReactOS system directory.\n\nExamples:\n\\REACTOS\n\\ROS";
38 const CHAR 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";
39 const CHAR CustomBootPrompt
[] = "Press ENTER to boot your custom boot setup.";
41 /* FUNCTIONS ******************************************************************/
43 #ifdef HAS_OPTION_MENU_CUSTOM_BOOT
45 VOID
OptionMenuCustomBoot(VOID
)
47 PCSTR CustomBootMenuList
[] = {
56 ULONG SelectedMenuItem
;
58 if (!UiDisplayMenu("Please choose a boot method:", NULL
,
61 sizeof(CustomBootMenuList
) / sizeof(CustomBootMenuList
[0]),
67 /* The user pressed ESC */
71 switch (SelectedMenuItem
)
75 EditCustomBootDisk(0);
78 EditCustomBootPartition(0);
80 case 2: // Boot Sector File
81 EditCustomBootSectorFile(0);
84 EditCustomBootLinux(0);
90 EditCustomBootReactOS(0);
95 #endif // HAS_OPTION_MENU_CUSTOM_BOOT
99 VOID
EditCustomBootDisk(IN ULONG_PTR SectionId OPTIONAL
)
102 OperatingSystemItem OperatingSystem
;
103 CHAR SectionName
[100];
104 CHAR BootDriveString
[20];
106 RtlZeroMemory(SectionName
, sizeof(SectionName
));
107 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
111 /* Load the settings */
112 IniReadSettingByName(SectionId
, "BootDrive", BootDriveString
, sizeof(BootDriveString
));
115 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, sizeof(BootDriveString
)))
118 /* Modify the settings values and return if we were in edit mode */
121 IniModifySettingValue(SectionId
, "BootDrive", BootDriveString
);
125 /* Generate a unique section name */
126 TimeInfo
= ArcGetTime();
127 RtlStringCbPrintfA(SectionName
, sizeof(SectionName
),
128 "CustomBootDisk%u%u%u%u%u%u",
129 TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
,
130 TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
132 /* Add the section */
133 if (!IniAddSection(SectionName
, &SectionId
))
136 /* Add the BootType */
137 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Drive"))
140 /* Add the BootDrive */
141 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
144 UiMessageBox(CustomBootPrompt
);
146 OperatingSystem
.SectionName
= SectionName
;
147 OperatingSystem
.LoadIdentifier
= NULL
;
148 LoadOperatingSystem(&OperatingSystem
);
151 VOID
EditCustomBootPartition(IN ULONG_PTR SectionId OPTIONAL
)
154 OperatingSystemItem OperatingSystem
;
155 CHAR SectionName
[100];
156 CHAR BootDriveString
[20];
157 CHAR BootPartitionString
[20];
159 RtlZeroMemory(SectionName
, sizeof(SectionName
));
160 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
161 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
165 /* Load the settings */
166 IniReadSettingByName(SectionId
, "BootDrive", BootDriveString
, sizeof(BootDriveString
));
167 IniReadSettingByName(SectionId
, "BootPartition", BootPartitionString
, sizeof(BootPartitionString
));
170 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, sizeof(BootDriveString
)))
173 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, sizeof(BootPartitionString
)))
176 /* Modify the settings values and return if we were in edit mode */
179 IniModifySettingValue(SectionId
, "BootDrive", BootDriveString
);
180 IniModifySettingValue(SectionId
, "BootPartition", BootPartitionString
);
184 /* Generate a unique section name */
185 TimeInfo
= ArcGetTime();
186 RtlStringCbPrintfA(SectionName
, sizeof(SectionName
),
187 "CustomBootPartition%u%u%u%u%u%u",
188 TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
,
189 TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
191 /* Add the section */
192 if (!IniAddSection(SectionName
, &SectionId
))
195 /* Add the BootType */
196 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Partition"))
199 /* Add the BootDrive */
200 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
203 /* Add the BootPartition */
204 if (!IniAddSettingValueToSection(SectionId
, "BootPartition", BootPartitionString
))
207 UiMessageBox(CustomBootPrompt
);
209 OperatingSystem
.SectionName
= SectionName
;
210 OperatingSystem
.LoadIdentifier
= NULL
;
211 LoadOperatingSystem(&OperatingSystem
);
214 VOID
EditCustomBootSectorFile(IN ULONG_PTR SectionId OPTIONAL
)
217 OperatingSystemItem OperatingSystem
;
218 CHAR SectionName
[100];
219 CHAR BootDriveString
[20];
220 CHAR BootPartitionString
[20];
221 CHAR BootSectorFileString
[200];
223 RtlZeroMemory(SectionName
, sizeof(SectionName
));
224 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
225 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
226 RtlZeroMemory(BootSectorFileString
, sizeof(BootSectorFileString
));
230 /* Load the settings */
231 IniReadSettingByName(SectionId
, "BootDrive", BootDriveString
, sizeof(BootDriveString
));
232 IniReadSettingByName(SectionId
, "BootPartition", BootPartitionString
, sizeof(BootPartitionString
));
233 IniReadSettingByName(SectionId
, "BootSectorFile", BootSectorFileString
, sizeof(BootSectorFileString
));
236 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, sizeof(BootDriveString
)))
239 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, sizeof(BootPartitionString
)))
242 if (!UiEditBox(BootSectorFilePrompt
, BootSectorFileString
, sizeof(BootSectorFileString
)))
245 /* Modify the settings values and return if we were in edit mode */
248 IniModifySettingValue(SectionId
, "BootDrive", BootDriveString
);
249 IniModifySettingValue(SectionId
, "BootPartition", BootPartitionString
);
250 IniModifySettingValue(SectionId
, "BootSectorFile", BootSectorFileString
);
254 /* Generate a unique section name */
255 TimeInfo
= ArcGetTime();
256 RtlStringCbPrintfA(SectionName
, sizeof(SectionName
),
257 "CustomBootSectorFile%u%u%u%u%u%u",
258 TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
,
259 TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
261 /* Add the section */
262 if (!IniAddSection(SectionName
, &SectionId
))
265 /* Add the BootType */
266 if (!IniAddSettingValueToSection(SectionId
, "BootType", "BootSector"))
269 /* Add the BootDrive */
270 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
273 /* Add the BootPartition */
274 if (!IniAddSettingValueToSection(SectionId
, "BootPartition", BootPartitionString
))
277 /* Add the BootSectorFile */
278 if (!IniAddSettingValueToSection(SectionId
, "BootSectorFile", BootSectorFileString
))
281 UiMessageBox(CustomBootPrompt
);
283 OperatingSystem
.SectionName
= SectionName
;
284 OperatingSystem
.LoadIdentifier
= NULL
;
285 LoadOperatingSystem(&OperatingSystem
);
288 VOID
EditCustomBootLinux(IN ULONG_PTR SectionId OPTIONAL
)
291 OperatingSystemItem OperatingSystem
;
292 CHAR SectionName
[100];
293 CHAR BootDriveString
[20];
294 CHAR BootPartitionString
[20];
295 CHAR LinuxKernelString
[200];
296 CHAR LinuxInitrdString
[200];
297 CHAR LinuxCommandLineString
[200];
299 RtlZeroMemory(SectionName
, sizeof(SectionName
));
300 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
301 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
302 RtlZeroMemory(LinuxKernelString
, sizeof(LinuxKernelString
));
303 RtlZeroMemory(LinuxInitrdString
, sizeof(LinuxInitrdString
));
304 RtlZeroMemory(LinuxCommandLineString
, sizeof(LinuxCommandLineString
));
308 /* Load the settings */
309 IniReadSettingByName(SectionId
, "BootDrive", BootDriveString
, sizeof(BootDriveString
));
310 IniReadSettingByName(SectionId
, "BootPartition", BootPartitionString
, sizeof(BootPartitionString
));
311 IniReadSettingByName(SectionId
, "Kernel", LinuxKernelString
, sizeof(LinuxKernelString
));
312 IniReadSettingByName(SectionId
, "Initrd", LinuxInitrdString
, sizeof(LinuxInitrdString
));
313 IniReadSettingByName(SectionId
, "CommandLine", LinuxCommandLineString
, sizeof(LinuxCommandLineString
));
316 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, sizeof(BootDriveString
)))
319 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, sizeof(BootPartitionString
)))
322 if (!UiEditBox(LinuxKernelPrompt
, LinuxKernelString
, sizeof(LinuxKernelString
)))
325 if (!UiEditBox(LinuxInitrdPrompt
, LinuxInitrdString
, sizeof(LinuxInitrdString
)))
328 if (!UiEditBox(LinuxCommandLinePrompt
, LinuxCommandLineString
, sizeof(LinuxCommandLineString
)))
331 /* Modify the settings values and return if we were in edit mode */
334 IniModifySettingValue(SectionId
, "BootDrive", BootDriveString
);
335 IniModifySettingValue(SectionId
, "BootPartition", BootPartitionString
);
336 IniModifySettingValue(SectionId
, "Kernel", LinuxKernelString
);
337 IniModifySettingValue(SectionId
, "Initrd", LinuxInitrdString
);
338 IniModifySettingValue(SectionId
, "CommandLine", LinuxCommandLineString
);
342 /* Generate a unique section name */
343 TimeInfo
= ArcGetTime();
344 RtlStringCbPrintfA(SectionName
, sizeof(SectionName
),
345 "CustomLinux%u%u%u%u%u%u",
346 TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
,
347 TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
349 /* Add the section */
350 if (!IniAddSection(SectionName
, &SectionId
))
353 /* Add the BootType */
354 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Linux"))
357 /* Add the BootDrive */
358 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
361 /* Add the BootPartition */
362 if (!IniAddSettingValueToSection(SectionId
, "BootPartition", BootPartitionString
))
366 if (!IniAddSettingValueToSection(SectionId
, "Kernel", LinuxKernelString
))
370 if (*LinuxInitrdString
)
372 if (!IniAddSettingValueToSection(SectionId
, "Initrd", LinuxInitrdString
))
376 /* Add the CommandLine */
377 if (!IniAddSettingValueToSection(SectionId
, "CommandLine", LinuxCommandLineString
))
380 UiMessageBox(CustomBootPrompt
);
382 OperatingSystem
.SectionName
= SectionName
;
383 OperatingSystem
.LoadIdentifier
= "Custom Linux Setup";
384 LoadOperatingSystem(&OperatingSystem
);
389 VOID
EditCustomBootReactOS(IN ULONG_PTR SectionId OPTIONAL
)
392 OperatingSystemItem OperatingSystem
;
393 CHAR SectionName
[100];
394 CHAR BootDriveString
[20];
395 CHAR BootPartitionString
[20];
396 CHAR ReactOSSystemPath
[200];
397 CHAR ReactOSARCPath
[200];
398 CHAR ReactOSOptions
[200];
400 RtlZeroMemory(SectionName
, sizeof(SectionName
));
401 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
402 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
403 RtlZeroMemory(ReactOSSystemPath
, sizeof(ReactOSSystemPath
));
404 RtlZeroMemory(ReactOSARCPath
, sizeof(ReactOSARCPath
));
405 RtlZeroMemory(ReactOSOptions
, sizeof(ReactOSOptions
));
409 /* Load the settings */
410 // TODO? Maybe use DissectArcPath(CHAR *ArcPath, CHAR *BootPath, UCHAR* BootDrive, ULONG* BootPartition) to get back to the small elements.
411 IniReadSettingByName(SectionId
, "SystemPath", ReactOSARCPath
, sizeof(ReactOSARCPath
));
412 IniReadSettingByName(SectionId
, "Options", ReactOSOptions
, sizeof(ReactOSOptions
));
417 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, sizeof(BootDriveString
)))
420 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, sizeof(BootPartitionString
)))
423 if (!UiEditBox(ReactOSSystemPathPrompt
, ReactOSSystemPath
, sizeof(ReactOSSystemPath
)))
428 if (!UiEditBox(ReactOSSystemPathPrompt
, ReactOSARCPath
, sizeof(ReactOSARCPath
)))
432 if (!UiEditBox(ReactOSOptionsPrompt
, ReactOSOptions
, sizeof(ReactOSOptions
)))
435 /* Modify the settings values and return if we were in edit mode */
438 IniModifySettingValue(SectionId
, "SystemPath", ReactOSARCPath
);
439 IniModifySettingValue(SectionId
, "Options", ReactOSOptions
);
443 /* Generate a unique section name */
444 TimeInfo
= ArcGetTime();
445 RtlStringCbPrintfA(SectionName
, sizeof(SectionName
),
446 "CustomReactOS%u%u%u%u%u%u",
447 TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
,
448 TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
450 /* Add the section */
451 if (!IniAddSection(SectionName
, &SectionId
))
454 /* Add the BootType */
455 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Windows2003"))
458 /* Construct the ReactOS ARC system path */
459 ConstructArcPath(ReactOSARCPath
, ReactOSSystemPath
, DriveMapGetBiosDriveNumber(BootDriveString
), atoi(BootPartitionString
));
461 /* Add the system path */
462 if (!IniAddSettingValueToSection(SectionId
, "SystemPath", ReactOSARCPath
))
465 /* Add the CommandLine */
466 if (!IniAddSettingValueToSection(SectionId
, "Options", ReactOSOptions
))
469 UiMessageBox(CustomBootPrompt
);
471 OperatingSystem
.SectionName
= SectionName
;
472 OperatingSystem
.LoadIdentifier
= NULL
;
473 LoadOperatingSystem(&OperatingSystem
);
476 #ifdef HAS_OPTION_MENU_REBOOT
478 VOID
OptionMenuReboot(VOID
)
480 UiMessageBox("The system will now reboot.");
482 #if defined(__i386__) || defined(_M_AMD64)
483 DiskStopFloppyMotor();
488 #endif // HAS_OPTION_MENU_REBOOT