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 SelectedMenuItem
;
56 if (!UiDisplayMenu("Please choose a boot method:", "",
59 sizeof(CustomBootMenuList
) / sizeof(CustomBootMenuList
[0]),
65 /* The user pressed ESC */
69 switch (SelectedMenuItem
)
73 OptionMenuCustomBootDisk();
76 OptionMenuCustomBootPartition();
78 case 2: // Boot Sector File
79 OptionMenuCustomBootBootSectorFile();
82 OptionMenuCustomBootLinux();
88 OptionMenuCustomBootReactOS();
95 VOID
OptionMenuCustomBootDisk(VOID
)
98 CHAR SectionName
[100];
99 CHAR BootDriveString
[20];
101 OperatingSystemItem OperatingSystem
;
103 RtlZeroMemory(SectionName
, sizeof(SectionName
));
104 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
106 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
109 /* Generate a unique section name */
110 TimeInfo
= ArcGetTime();
111 RtlStringCbPrintfA(SectionName
, sizeof(SectionName
),
112 "CustomBootDisk%u%u%u%u%u%u",
113 TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
,
114 TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
116 /* Add the section */
117 if (!IniAddSection(SectionName
, &SectionId
))
120 /* Add the BootType */
121 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Drive"))
124 /* Add the BootDrive */
125 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
128 UiMessageBox(CustomBootPrompt
);
130 OperatingSystem
.SectionName
= SectionName
;
131 OperatingSystem
.LoadIdentifier
= NULL
;
132 LoadOperatingSystem(&OperatingSystem
);
135 VOID
OptionMenuCustomBootPartition(VOID
)
138 CHAR SectionName
[100];
139 CHAR BootDriveString
[20];
140 CHAR BootPartitionString
[20];
142 OperatingSystemItem OperatingSystem
;
144 RtlZeroMemory(SectionName
, sizeof(SectionName
));
145 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
146 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
148 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
151 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, 20))
154 /* Generate a unique section name */
155 TimeInfo
= ArcGetTime();
156 RtlStringCbPrintfA(SectionName
, sizeof(SectionName
),
157 "CustomBootPartition%u%u%u%u%u%u",
158 TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
,
159 TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
161 /* Add the section */
162 if (!IniAddSection(SectionName
, &SectionId
))
165 /* Add the BootType */
166 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Partition"))
169 /* Add the BootDrive */
170 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
173 /* Add the BootPartition */
174 if (!IniAddSettingValueToSection(SectionId
, "BootPartition", BootPartitionString
))
177 UiMessageBox(CustomBootPrompt
);
179 OperatingSystem
.SectionName
= SectionName
;
180 OperatingSystem
.LoadIdentifier
= NULL
;
181 LoadOperatingSystem(&OperatingSystem
);
184 VOID
OptionMenuCustomBootBootSectorFile(VOID
)
187 CHAR SectionName
[100];
188 CHAR BootDriveString
[20];
189 CHAR BootPartitionString
[20];
190 CHAR BootSectorFileString
[200];
192 OperatingSystemItem OperatingSystem
;
194 RtlZeroMemory(SectionName
, sizeof(SectionName
));
195 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
196 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
197 RtlZeroMemory(BootSectorFileString
, sizeof(BootSectorFileString
));
199 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
202 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, 20))
205 if (!UiEditBox(BootSectorFilePrompt
, BootSectorFileString
, 200))
208 /* Generate a unique section name */
209 TimeInfo
= ArcGetTime();
210 RtlStringCbPrintfA(SectionName
, sizeof(SectionName
),
211 "CustomBootSectorFile%u%u%u%u%u%u",
212 TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
,
213 TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
215 /* Add the section */
216 if (!IniAddSection(SectionName
, &SectionId
))
219 /* Add the BootType */
220 if (!IniAddSettingValueToSection(SectionId
, "BootType", "BootSector"))
223 /* Add the BootDrive */
224 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
227 /* Add the BootPartition */
228 if (!IniAddSettingValueToSection(SectionId
, "BootPartition", BootPartitionString
))
231 /* Add the BootSectorFile */
232 if (!IniAddSettingValueToSection(SectionId
, "BootSectorFile", BootSectorFileString
))
235 UiMessageBox(CustomBootPrompt
);
237 OperatingSystem
.SectionName
= SectionName
;
238 OperatingSystem
.LoadIdentifier
= NULL
;
239 LoadOperatingSystem(&OperatingSystem
);
242 VOID
OptionMenuCustomBootLinux(VOID
)
245 CHAR SectionName
[100];
246 CHAR BootDriveString
[20];
247 CHAR BootPartitionString
[20];
248 CHAR LinuxKernelString
[200];
249 CHAR LinuxInitrdString
[200];
250 CHAR LinuxCommandLineString
[200];
252 OperatingSystemItem OperatingSystem
;
254 RtlZeroMemory(SectionName
, sizeof(SectionName
));
255 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
256 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
257 RtlZeroMemory(LinuxKernelString
, sizeof(LinuxKernelString
));
258 RtlZeroMemory(LinuxInitrdString
, sizeof(LinuxInitrdString
));
259 RtlZeroMemory(LinuxCommandLineString
, sizeof(LinuxCommandLineString
));
261 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
264 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, 20))
267 if (!UiEditBox(LinuxKernelPrompt
, LinuxKernelString
, 200))
270 if (!UiEditBox(LinuxInitrdPrompt
, LinuxInitrdString
, 200))
273 if (!UiEditBox(LinuxCommandLinePrompt
, LinuxCommandLineString
, 200))
276 /* Generate a unique section name */
277 TimeInfo
= ArcGetTime();
278 RtlStringCbPrintfA(SectionName
, sizeof(SectionName
),
279 "CustomLinux%u%u%u%u%u%u",
280 TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
,
281 TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
283 /* Add the section */
284 if (!IniAddSection(SectionName
, &SectionId
))
287 /* Add the BootType */
288 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Linux"))
291 /* Add the BootDrive */
292 if (!IniAddSettingValueToSection(SectionId
, "BootDrive", BootDriveString
))
295 /* Add the BootPartition */
296 if (!IniAddSettingValueToSection(SectionId
, "BootPartition", BootPartitionString
))
300 if (!IniAddSettingValueToSection(SectionId
, "Kernel", LinuxKernelString
))
304 if (*LinuxInitrdString
)
306 if (!IniAddSettingValueToSection(SectionId
, "Initrd", LinuxInitrdString
))
310 /* Add the CommandLine */
311 if (!IniAddSettingValueToSection(SectionId
, "CommandLine", LinuxCommandLineString
))
314 UiMessageBox(CustomBootPrompt
);
316 OperatingSystem
.SectionName
= SectionName
;
317 OperatingSystem
.LoadIdentifier
= "Custom Linux Setup";
318 LoadOperatingSystem(&OperatingSystem
);
323 VOID
OptionMenuCustomBootReactOS(VOID
)
326 CHAR SectionName
[100];
327 CHAR BootDriveString
[20];
328 CHAR BootPartitionString
[20];
329 CHAR ReactOSSystemPath
[200];
330 CHAR ReactOSARCPath
[200];
331 CHAR ReactOSOptions
[200];
333 OperatingSystemItem OperatingSystem
;
335 RtlZeroMemory(SectionName
, sizeof(SectionName
));
336 RtlZeroMemory(BootDriveString
, sizeof(BootDriveString
));
337 RtlZeroMemory(BootPartitionString
, sizeof(BootPartitionString
));
338 RtlZeroMemory(ReactOSSystemPath
, sizeof(ReactOSSystemPath
));
339 RtlZeroMemory(ReactOSOptions
, sizeof(ReactOSOptions
));
341 if (!UiEditBox(BootDrivePrompt
, BootDriveString
, 20))
344 if (!UiEditBox(BootPartitionPrompt
, BootPartitionString
, 20))
347 if (!UiEditBox(ReactOSSystemPathPrompt
, ReactOSSystemPath
, 200))
350 if (!UiEditBox(ReactOSOptionsPrompt
, ReactOSOptions
, 200))
353 /* Generate a unique section name */
354 TimeInfo
= ArcGetTime();
355 RtlStringCbPrintfA(SectionName
, sizeof(SectionName
),
356 "CustomReactOS%u%u%u%u%u%u",
357 TimeInfo
->Year
, TimeInfo
->Day
, TimeInfo
->Month
,
358 TimeInfo
->Hour
, TimeInfo
->Minute
, TimeInfo
->Second
);
360 /* Add the section */
361 if (!IniAddSection(SectionName
, &SectionId
))
364 /* Add the BootType */
365 if (!IniAddSettingValueToSection(SectionId
, "BootType", "Windows2003"))
368 /* Construct the ReactOS ARC system path */
369 ConstructArcPath(ReactOSARCPath
, ReactOSSystemPath
, DriveMapGetBiosDriveNumber(BootDriveString
), atoi(BootPartitionString
));
371 /* Add the system path */
372 if (!IniAddSettingValueToSection(SectionId
, "SystemPath", ReactOSARCPath
))
375 /* Add the CommandLine */
376 if (!IniAddSettingValueToSection(SectionId
, "Options", ReactOSOptions
))
379 UiMessageBox(CustomBootPrompt
);
381 OperatingSystem
.SectionName
= SectionName
;
382 OperatingSystem
.LoadIdentifier
= NULL
;
383 LoadOperatingSystem(&OperatingSystem
);
386 VOID
OptionMenuReboot(VOID
)
388 UiMessageBox("The system will now reboot.");
390 #if defined(__i386__) || defined(_M_AMD64)
391 DiskStopFloppyMotor();