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.
23 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";
24 const CHAR BootPartitionPrompt
[] = "Enter the boot partition.\n\nEnter 0 for the active (bootable) partition.";
25 const CHAR BootSectorFilePrompt
[] = "Enter the boot sector file path.\n\nExamples:\n\\BOOTSECT.DOS\n/boot/bootsect.dos";
26 const CHAR LinuxKernelPrompt
[] = "Enter the Linux kernel image path.\n\nExamples:\n/vmlinuz\n/boot/vmlinuz-2.4.18";
27 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.";
28 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";
29 const CHAR ReactOSSystemPathPrompt
[] = "Enter the path to your ReactOS system directory.\n\nExamples:\n\\REACTOS\n\\ROS";
30 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";
32 const CHAR CustomBootPrompt
[] = "Press ENTER to boot your custom boot setup.";
34 VOID
OptionMenuCustomBoot(VOID
)
36 PCSTR CustomBootMenuList
[] = {
43 ULONG CustomBootMenuCount
= sizeof(CustomBootMenuList
) / sizeof(CustomBootMenuList
[0]);
44 ULONG SelectedMenuItem
;
46 if (!UiDisplayMenu("Please choose a boot method:", "",
55 // The user pressed ESC
59 switch (SelectedMenuItem
)
62 OptionMenuCustomBootDisk();
65 OptionMenuCustomBootPartition();
67 case 2: // Boot Sector File
68 OptionMenuCustomBootBootSectorFile();
71 OptionMenuCustomBootReactOS();
74 OptionMenuCustomBootLinux();
79 VOID
OptionMenuCustomBootDisk(VOID
)
82 CHAR SectionName
[100];
83 CHAR BootDriveString
[20];
85 OperatingSystemItem OperatingSystem
;
87 RtlZeroMemory(SectionName
, sizeof(SectionName
));
88 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
90 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
95 // Generate a unique section name
96 TimeInfo
= ArcGetTime();
97 sprintf(SectionName
, "CustomBootDisk%u%u%u%u%u%u", TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
, TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
100 if (!IniAddSection(SectionName
, &SectionId
))
106 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Drive"))
112 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
117 UiMessageBox(CustomBootPrompt
);
119 OperatingSystem
.SystemPartition
= SectionName
;
120 OperatingSystem
.LoadIdentifier
= NULL
;
121 OperatingSystem
.OsLoadOptions
= NULL
;
123 // LoadAndBootDrive(&OperatingSystem, 0);
124 LoadOperatingSystem(&OperatingSystem
);
127 VOID
OptionMenuCustomBootPartition(VOID
)
130 CHAR SectionName
[100];
131 CHAR BootDriveString
[20];
132 CHAR BootPartitionString
[20];
134 OperatingSystemItem OperatingSystem
;
136 RtlZeroMemory(SectionName
, sizeof(SectionName
));
137 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
138 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
140 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
145 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, 20))
150 // Generate a unique section name
151 TimeInfo
= ArcGetTime();
152 sprintf(SectionName
, "CustomBootPartition%u%u%u%u%u%u", TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
, TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
155 if (!IniAddSection(SectionName
, &SectionId
))
161 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Partition"))
167 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
172 // Add the BootPartition
173 if (!IniAddSettingValueToSection(SectionId
, "BootPartition", BootPartitionString
))
178 UiMessageBox(CustomBootPrompt
);
180 OperatingSystem
.SystemPartition
= SectionName
;
181 OperatingSystem
.LoadIdentifier
= NULL
;
182 OperatingSystem
.OsLoadOptions
= NULL
;
184 // LoadAndBootPartition(&OperatingSystem, 0);
185 LoadOperatingSystem(&OperatingSystem
);
188 VOID
OptionMenuCustomBootBootSectorFile(VOID
)
191 CHAR SectionName
[100];
192 CHAR BootDriveString
[20];
193 CHAR BootPartitionString
[20];
194 CHAR BootSectorFileString
[200];
196 OperatingSystemItem OperatingSystem
;
198 RtlZeroMemory(SectionName
, sizeof(SectionName
));
199 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
200 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
201 RtlZeroMemory(BootSectorFileString
, sizeof(BootSectorFileString
));
203 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
208 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, 20))
213 if (!UiEditBox(BootSectorFilePrompt
, BootSectorFileString
, 200))
218 // Generate a unique section name
219 TimeInfo
= ArcGetTime();
220 sprintf(SectionName
, "CustomBootSectorFile%u%u%u%u%u%u", TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
, TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
223 if (!IniAddSection(SectionName
, &SectionId
))
229 if (!IniAddSettingValueToSection(SectionId
, "BootType", "BootSector"))
235 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
240 // Add the BootPartition
241 if (!IniAddSettingValueToSection(SectionId
, "BootPartition", BootPartitionString
))
246 // Add the BootSectorFile
247 if (!IniAddSettingValueToSection(SectionId
, "BootSectorFile", BootSectorFileString
))
252 UiMessageBox(CustomBootPrompt
);
254 OperatingSystem
.SystemPartition
= SectionName
;
255 OperatingSystem
.LoadIdentifier
= NULL
;
256 OperatingSystem
.OsLoadOptions
= NULL
;
258 // LoadAndBootBootSector(&OperatingSystem, 0);
259 LoadOperatingSystem(&OperatingSystem
);
262 VOID
OptionMenuCustomBootReactOS(VOID
)
265 CHAR SectionName
[100];
266 CHAR BootDriveString
[20];
267 CHAR BootPartitionString
[20];
268 CHAR ReactOSSystemPath
[200];
269 CHAR ReactOSARCPath
[200];
270 CHAR ReactOSOptions
[200];
272 OperatingSystemItem OperatingSystem
;
274 RtlZeroMemory(SectionName
, sizeof(SectionName
));
275 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
276 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
277 RtlZeroMemory(ReactOSSystemPath
, sizeof(ReactOSSystemPath
));
278 RtlZeroMemory(ReactOSOptions
, sizeof(ReactOSOptions
));
280 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
285 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, 20))
290 if (!UiEditBox(ReactOSSystemPathPrompt
, ReactOSSystemPath
, 200))
295 if (!UiEditBox(ReactOSOptionsPrompt
, ReactOSOptions
, 200))
300 // Generate a unique section name
301 TimeInfo
= ArcGetTime();
302 sprintf(SectionName
, "CustomReactOS%u%u%u%u%u%u", TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
, TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
305 if (!IniAddSection(SectionName
, &SectionId
))
311 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Windows2003"))
316 // Construct the ReactOS ARC system path
317 ConstructArcPath(ReactOSARCPath
, ReactOSSystemPath
, DriveMapGetBiosDriveNumber(BootDriveString
), atoi(BootPartitionString
));
319 // Add the system path
320 if (!IniAddSettingValueToSection(SectionId
, "SystemPath", ReactOSARCPath
))
325 // Add the CommandLine
326 if (!IniAddSettingValueToSection(SectionId
, "Options", ReactOSOptions
))
331 UiMessageBox(CustomBootPrompt
);
333 OperatingSystem
.SystemPartition
= SectionName
;
334 OperatingSystem
.LoadIdentifier
= NULL
;
335 OperatingSystem
.OsLoadOptions
= NULL
; // ReactOSOptions
337 // LoadAndBootWindows(&OperatingSystem, _WIN32_WINNT_WS03);
338 LoadOperatingSystem(&OperatingSystem
);
341 VOID
OptionMenuCustomBootLinux(VOID
)
344 CHAR SectionName
[100];
345 CHAR BootDriveString
[20];
346 CHAR BootPartitionString
[20];
347 CHAR LinuxKernelString
[200];
348 CHAR LinuxInitrdString
[200];
349 CHAR LinuxCommandLineString
[200];
351 OperatingSystemItem OperatingSystem
;
353 RtlZeroMemory(SectionName
, sizeof(SectionName
));
354 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
355 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
356 RtlZeroMemory(LinuxKernelString
, sizeof(LinuxKernelString
));
357 RtlZeroMemory(LinuxInitrdString
, sizeof(LinuxInitrdString
));
358 RtlZeroMemory(LinuxCommandLineString
, sizeof(LinuxCommandLineString
));
360 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
365 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, 20))
370 if (!UiEditBox(LinuxKernelPrompt
, LinuxKernelString
, 200))
375 if (!UiEditBox(LinuxInitrdPrompt
, LinuxInitrdString
, 200))
380 if (!UiEditBox(LinuxCommandLinePrompt
, LinuxCommandLineString
, 200))
385 // Generate a unique section name
386 TimeInfo
= ArcGetTime();
387 sprintf(SectionName
, "CustomLinux%u%u%u%u%u%u", TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
, TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
390 if (!IniAddSection(SectionName
, &SectionId
))
396 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Linux"))
402 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
407 // Add the BootPartition
408 if (!IniAddSettingValueToSection(SectionId
, "BootPartition", BootPartitionString
))
414 if (!IniAddSettingValueToSection(SectionId
, "Kernel", LinuxKernelString
))
420 if (strlen(LinuxInitrdString
) > 0)
422 if (!IniAddSettingValueToSection(SectionId
, "Initrd", LinuxInitrdString
))
428 // Add the CommandLine
429 if (!IniAddSettingValueToSection(SectionId
, "CommandLine", LinuxCommandLineString
))
434 UiMessageBox(CustomBootPrompt
);
436 OperatingSystem
.SystemPartition
= SectionName
;
437 OperatingSystem
.LoadIdentifier
= "Custom Linux Setup";
438 OperatingSystem
.OsLoadOptions
= NULL
;
440 // LoadAndBootLinux(&OperatingSystem, 0);
441 LoadOperatingSystem(&OperatingSystem
);
444 VOID
OptionMenuReboot(VOID
)
446 UiMessageBox("The system will now reboot.");
448 DiskStopFloppyMotor();