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 VOID
OptionMenuCustomBoot(VOID
)
45 PCSTR CustomBootMenuList
[] = {
54 ULONG CustomBootMenuCount
= sizeof(CustomBootMenuList
) / sizeof(CustomBootMenuList
[0]);
55 ULONG SelectedMenuItem
;
57 if (!UiDisplayMenu("Please choose a boot method:", "",
66 /* The user pressed ESC */
70 switch (SelectedMenuItem
)
74 OptionMenuCustomBootDisk();
77 OptionMenuCustomBootPartition();
79 case 2: // Boot Sector File
80 OptionMenuCustomBootBootSectorFile();
83 OptionMenuCustomBootLinux();
89 OptionMenuCustomBootReactOS();
96 VOID
OptionMenuCustomBootDisk(VOID
)
99 CHAR SectionName
[100];
100 CHAR BootDriveString
[20];
102 OperatingSystemItem OperatingSystem
;
104 RtlZeroMemory(SectionName
, sizeof(SectionName
));
105 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
107 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
110 /* Generate a unique section name */
111 TimeInfo
= ArcGetTime();
112 sprintf(SectionName
, "CustomBootDisk%u%u%u%u%u%u", TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
, TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
114 /* Add the section */
115 if (!IniAddSection(SectionName
, &SectionId
))
118 /* Add the BootType */
119 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Drive"))
122 /* Add the BootDrive */
123 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
126 UiMessageBox(CustomBootPrompt
);
128 OperatingSystem
.SystemPartition
= SectionName
;
129 OperatingSystem
.LoadIdentifier
= NULL
;
130 OperatingSystem
.OsLoadOptions
= NULL
;
132 // LoadAndBootDrive(&OperatingSystem, 0);
133 LoadOperatingSystem(&OperatingSystem
);
136 VOID
OptionMenuCustomBootPartition(VOID
)
139 CHAR SectionName
[100];
140 CHAR BootDriveString
[20];
141 CHAR BootPartitionString
[20];
143 OperatingSystemItem OperatingSystem
;
145 RtlZeroMemory(SectionName
, sizeof(SectionName
));
146 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
147 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
149 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
152 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, 20))
155 /* Generate a unique section name */
156 TimeInfo
= ArcGetTime();
157 sprintf(SectionName
, "CustomBootPartition%u%u%u%u%u%u", TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
, TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
159 /* Add the section */
160 if (!IniAddSection(SectionName
, &SectionId
))
163 /* Add the BootType */
164 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Partition"))
167 /* Add the BootDrive */
168 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
171 /* Add the BootPartition */
172 if (!IniAddSettingValueToSection(SectionId
, "BootPartition", BootPartitionString
))
175 UiMessageBox(CustomBootPrompt
);
177 OperatingSystem
.SystemPartition
= SectionName
;
178 OperatingSystem
.LoadIdentifier
= NULL
;
179 OperatingSystem
.OsLoadOptions
= NULL
;
181 // LoadAndBootPartition(&OperatingSystem, 0);
182 LoadOperatingSystem(&OperatingSystem
);
185 VOID
OptionMenuCustomBootBootSectorFile(VOID
)
188 CHAR SectionName
[100];
189 CHAR BootDriveString
[20];
190 CHAR BootPartitionString
[20];
191 CHAR BootSectorFileString
[200];
193 OperatingSystemItem OperatingSystem
;
195 RtlZeroMemory(SectionName
, sizeof(SectionName
));
196 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
197 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
198 RtlZeroMemory(BootSectorFileString
, sizeof(BootSectorFileString
));
200 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
203 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, 20))
206 if (!UiEditBox(BootSectorFilePrompt
, BootSectorFileString
, 200))
209 /* Generate a unique section name */
210 TimeInfo
= ArcGetTime();
211 sprintf(SectionName
, "CustomBootSectorFile%u%u%u%u%u%u", TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
, TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
213 /* Add the section */
214 if (!IniAddSection(SectionName
, &SectionId
))
217 /* Add the BootType */
218 if (!IniAddSettingValueToSection(SectionId
, "BootType", "BootSector"))
221 /* Add the BootDrive */
222 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
225 /* Add the BootPartition */
226 if (!IniAddSettingValueToSection(SectionId
, "BootPartition", BootPartitionString
))
229 /* Add the BootSectorFile */
230 if (!IniAddSettingValueToSection(SectionId
, "BootSectorFile", BootSectorFileString
))
233 UiMessageBox(CustomBootPrompt
);
235 OperatingSystem
.SystemPartition
= SectionName
;
236 OperatingSystem
.LoadIdentifier
= NULL
;
237 OperatingSystem
.OsLoadOptions
= NULL
;
239 // LoadAndBootBootSector(&OperatingSystem, 0);
240 LoadOperatingSystem(&OperatingSystem
);
243 VOID
OptionMenuCustomBootLinux(VOID
)
246 CHAR SectionName
[100];
247 CHAR BootDriveString
[20];
248 CHAR BootPartitionString
[20];
249 CHAR LinuxKernelString
[200];
250 CHAR LinuxInitrdString
[200];
251 CHAR LinuxCommandLineString
[200];
253 OperatingSystemItem OperatingSystem
;
255 RtlZeroMemory(SectionName
, sizeof(SectionName
));
256 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
257 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
258 RtlZeroMemory(LinuxKernelString
, sizeof(LinuxKernelString
));
259 RtlZeroMemory(LinuxInitrdString
, sizeof(LinuxInitrdString
));
260 RtlZeroMemory(LinuxCommandLineString
, sizeof(LinuxCommandLineString
));
262 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
265 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, 20))
268 if (!UiEditBox(LinuxKernelPrompt
, LinuxKernelString
, 200))
271 if (!UiEditBox(LinuxInitrdPrompt
, LinuxInitrdString
, 200))
274 if (!UiEditBox(LinuxCommandLinePrompt
, LinuxCommandLineString
, 200))
277 /* Generate a unique section name */
278 TimeInfo
= ArcGetTime();
279 sprintf(SectionName
, "CustomLinux%u%u%u%u%u%u", TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
, TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
281 /* Add the section */
282 if (!IniAddSection(SectionName
, &SectionId
))
285 /* Add the BootType */
286 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Linux"))
289 /* Add the BootDrive */
290 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
293 /* Add the BootPartition */
294 if (!IniAddSettingValueToSection(SectionId
, "BootPartition", BootPartitionString
))
298 if (!IniAddSettingValueToSection(SectionId
, "Kernel", LinuxKernelString
))
302 if (strlen(LinuxInitrdString
) > 0)
304 if (!IniAddSettingValueToSection(SectionId
, "Initrd", LinuxInitrdString
))
308 /* Add the CommandLine */
309 if (!IniAddSettingValueToSection(SectionId
, "CommandLine", LinuxCommandLineString
))
312 UiMessageBox(CustomBootPrompt
);
314 OperatingSystem
.SystemPartition
= SectionName
;
315 OperatingSystem
.LoadIdentifier
= "Custom Linux Setup";
316 OperatingSystem
.OsLoadOptions
= NULL
;
318 // LoadAndBootLinux(&OperatingSystem, 0);
319 LoadOperatingSystem(&OperatingSystem
);
324 VOID
OptionMenuCustomBootReactOS(VOID
)
327 CHAR SectionName
[100];
328 CHAR BootDriveString
[20];
329 CHAR BootPartitionString
[20];
330 CHAR ReactOSSystemPath
[200];
331 CHAR ReactOSARCPath
[200];
332 CHAR ReactOSOptions
[200];
334 OperatingSystemItem OperatingSystem
;
336 RtlZeroMemory(SectionName
, sizeof(SectionName
));
337 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
338 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
339 RtlZeroMemory(ReactOSSystemPath
, sizeof(ReactOSSystemPath
));
340 RtlZeroMemory(ReactOSOptions
, sizeof(ReactOSOptions
));
342 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
345 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, 20))
348 if (!UiEditBox(ReactOSSystemPathPrompt
, ReactOSSystemPath
, 200))
351 if (!UiEditBox(ReactOSOptionsPrompt
, ReactOSOptions
, 200))
354 /* Generate a unique section name */
355 TimeInfo
= ArcGetTime();
356 sprintf(SectionName
, "CustomReactOS%u%u%u%u%u%u", TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
, TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
358 /* Add the section */
359 if (!IniAddSection(SectionName
, &SectionId
))
362 /* Add the BootType */
363 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Windows2003"))
366 /* Construct the ReactOS ARC system path */
367 ConstructArcPath(ReactOSARCPath
, ReactOSSystemPath
, DriveMapGetBiosDriveNumber(BootDriveString
), atoi(BootPartitionString
));
369 /* Add the system path */
370 if (!IniAddSettingValueToSection(SectionId
, "SystemPath", ReactOSARCPath
))
373 /* Add the CommandLine */
374 if (!IniAddSettingValueToSection(SectionId
, "Options", ReactOSOptions
))
377 UiMessageBox(CustomBootPrompt
);
379 OperatingSystem
.SystemPartition
= SectionName
;
380 OperatingSystem
.LoadIdentifier
= NULL
;
381 OperatingSystem
.OsLoadOptions
= NULL
; // ReactOSOptions
383 // LoadAndBootWindows(&OperatingSystem, _WIN32_WINNT_WS03);
384 LoadOperatingSystem(&OperatingSystem
);
387 VOID
OptionMenuReboot(VOID
)
389 UiMessageBox("The system will now reboot.");
391 DiskStopFloppyMotor();