<tr>
<td><tt>icons_dir</tt></td>
<td>directory name</td>
- <td>Specifies a directory in which custom icons may be found. This directory should contain files with the same names as the files in the standard <tt>icons</tt> directory. The directory name is specified relative to the directory in which the rEFInd binary resides. The standard <tt>icons</tt> directory is searched if an icon can't be found in the one specified by <tt>icons_dir</tt>, so you can use this location to redefine just some icons.</td>
+ <td>Specifies a directory in which custom icons may be found. This directory should contain files with the same names as the files in the standard <tt>icons</tt> directory. The directory name is specified relative to the directory in which the rEFInd binary resides. The standard <tt>icons</tt> directory is searched if an icon can't be found in the one specified by <tt>icons_dir</tt>, so you can use this location to redefine just some icons. Note that if no icons directory is found (either <tt>icons</tt> or one specified by <tt>icons_dir</tt>), rEFInd switches to text-only mode, as if <tt>textonly</tt> had been specified.</td>
</tr>
<tr>
<td><tt>banner</tt></td>
</tr>
<tr>
<td><tt>showtools</tt></td>
- <td><tt>shell</tt>, <tt>memtest</tt>, <tt>gdisk</tt>, <tt>gptsync</tt>, <tt>apple_recovery</tt>, <tt>mok_tool</tt>, <tt>about</tt>, <tt>exit</tt>, <tt>shutdown</tt>, <tt>reboot</tt>, and <tt>firmware</tt></td>
- <td>Specifies which tool tags to display on the second row. <tt>shell</tt> launches an EFI shell, <tt>memtest</tt> (or <tt>memtest86</tt>) launches the <a href="http://www.memtest86.com/download.htm">Memtest86</a> program, <tt>gdisk</tt> launches the partitioning tool of the same name, <tt>gptsync</tt> launches a tool that creates a hybrid MBR, <tt>apple_recovery</tt> boots the OS X Recovery HD, <tt>windows_recovery</tt> boots a Windows recovery tool, <tt>mok_tool</tt> launches a tool to manage Machine Owner Keys (MOKs) on systems with Secure Boot active, <tt>about</tt> displays information about the program, <tt>exit</tt> terminates rEFInd, <tt>shutdown</tt> shuts down the computer (or reboots it, on some UEFI PCs), <tt>reboot</tt> reboots the computer, and <tt>firmware</tt> reboots the computer into the computer's own setup utility. The tags appear in the order in which you specify them. The default is <tt>shell, memtest, gdisk, apple_recovery, mok_tool, about, shutdown, reboot, firmware</tt>. Note that the <tt>shell</tt>, <tt>memtest</tt>, <tt>apple_recovery</tt>, and <tt>mok_tool</tt> options all require the presence of programs not included with rEFInd. The <tt>gptsync</tt> option requires use of a like-named program which, although it ships with rEFInd 0.6.9 and later, is not installed by default except under OS X. See the <a href="installing.html#addons">"Installing Additional Components"</a> section of the <a href="installing.html">Installing rEFInd</a> page for pointers to the shell, Memtest86, and <tt>gptsync</tt> programs. The <tt>apple_recovery</tt> option will appear only if you've got an Apple Recovery HD partition (which has a boot loader called <tt>com.apple.recovery.boot/boot.efi</tt>). The <tt>firmware</tt> option works only on computers that support this option; on other computers, the option is quietly ignored. See the <a href="secureboot.html">Secure Boot</a> page for information on Secure Boot and MOK management.</td>
+ <td><tt>shell</tt>, <tt>memtest</tt>, <tt>gdisk</tt>, <tt>gptsync</tt>, <tt>apple_recovery</tt>, <tt>mok_tool</tt>, <tt>netboot</tt>, <tt>about</tt>, <tt>exit</tt>, <tt>shutdown</tt>, <tt>reboot</tt>, and <tt>firmware</tt></td>
+ <td>Specifies which tool tags to display on the second row. <tt>shell</tt> launches an EFI shell, <tt>memtest</tt> (or <tt>memtest86</tt>) launches the <a href="http://www.memtest86.com/download.htm">Memtest86</a> program, <tt>gdisk</tt> launches the partitioning tool of the same name, <tt>gptsync</tt> launches a tool that creates a hybrid MBR, <tt>apple_recovery</tt> boots the OS X Recovery HD, <tt>windows_recovery</tt> boots a Windows recovery tool, <tt>mok_tool</tt> launches a tool to manage Machine Owner Keys (MOKs) on systems with Secure Boot active, <tt>netboot</tt> launches the network boot tool (iPXE), <tt>about</tt> displays information about rEFInd, <tt>exit</tt> terminates rEFInd, <tt>shutdown</tt> shuts down the computer (or reboots it, on some UEFI PCs), <tt>reboot</tt> reboots the computer, and <tt>firmware</tt> reboots the computer into the computer's own setup utility. The tags appear in the order in which you specify them. The default is <tt>shell, memtest, gdisk, apple_recovery, mok_tool, about, shutdown, reboot, firmware</tt>. Note that the <tt>shell</tt>, <tt>memtest</tt>, <tt>apple_recovery</tt>, and <tt>mok_tool</tt> options all require the presence of programs not included with rEFInd. The <tt>gptsync</tt> option requires use of a like-named program which, although it ships with rEFInd 0.6.9 and later, is not installed by default except under OS X. See the <a href="installing.html#addons">"Installing Additional Components"</a> section of the <a href="installing.html">Installing rEFInd</a> page for pointers to the shell, Memtest86, and <tt>gptsync</tt> programs. The <tt>apple_recovery</tt> option will appear only if you've got an Apple Recovery HD partition (which has a boot loader called <tt>com.apple.recovery.boot/boot.efi</tt>). The <tt>firmware</tt> option works only on computers that support this option; on other computers, the option is quietly ignored. See the <a href="secureboot.html">Secure Boot</a> page for information on Secure Boot and MOK management.</td>
</tr>
<tr>
<td><tt>font</tt></td>
<tr>
<td><tt>textonly</tt></td>
<td>none or one of <tt>true</tt>, <tt>on</tt>, <tt>1</tt>, <tt>false</tt>, <tt>off</tt>, or <tt>0</tt></td>
- <td>rEFInd defaults to a graphical mode; however, if you prefer to do without the flashy graphics, you can run it in text mode by including this option (alone or with <tt>true</tt>, <tt>on</tt>, or <tt>1</tt>). Passing <tt>false</tt>, <tt>off</tt>, or <tt>0</tt> causes graphics mode to be used. (This could be useful if you want to override a text-mode setting in an included secondary configuration file.)</td>
+ <td>rEFInd defaults to a graphical mode; however, if you prefer to do without the flashy graphics, you can run it in text mode by including this option (alone or with <tt>true</tt>, <tt>on</tt>, or <tt>1</tt>). Passing <tt>false</tt>, <tt>off</tt>, or <tt>0</tt> causes graphics mode to be used. (This could be useful if you want to override a text-mode setting in an included secondary configuration file.) Text-only mode is implicitly set if rEFInd cannot find either a subdirectory called <tt>icons</tt> or a subdirectory named by <tt>icons_dir</tt>.</td>
</tr>
<tr>
<td><tt>textmode</tt></td>
</tr>
<tr>
<td><tt>scanfor</tt></td>
- <td><tt>internal</tt>, <tt>external</tt>, <tt>optical</tt>, <tt>hdbios</tt>, <tt>biosexternal</tt>, <tt>cd</tt>, and <tt>manual</tt></td>
- <td>Tells rEFInd what methods to use to locate boot loaders. The <tt>internal</tt>, <tt>external</tt>, and <tt>optical</tt> parameters tell rEFInd to scan for EFI boot loaders on internal, external, and optical (CD, DVD, and Blu-ray) devices, respectively. The <tt>hdbios</tt>, <tt>biosexternal</tt>, and <tt>cd</tt> parameters are similar, but scan for BIOS boot loaders. (Note that the BIOS options scan more thoroughly and actively on Macs than on UEFI-based PCs; for the latter, only options in the firmware's boot list are scanned, as described on the <a href="using.html">Using rEFInd</a> page.) The <tt>manual</tt> parameter tells rEFInd to scan the configuration file for manual settings. You can specify multiple parameters to have the program scan for multiple boot loader types. When you do so, the order determines the order in which the boot loaders appear in the menu. The default is <tt>internal, external, optical, manual</tt> on most systems, but <tt>internal, hdbios, external, biosexternal, optical, cd, manual</tt> on Macs.</td>
+ <td><tt>internal</tt>, <tt>external</tt>, <tt>optical</tt>, <tt>netboot</tt>, <tt>hdbios</tt>, <tt>biosexternal</tt>, <tt>cd</tt>, and <tt>manual</tt></td>
+ <td>Tells rEFInd what methods to use to locate boot loaders. The <tt>internal</tt>, <tt>external</tt>, and <tt>optical</tt> parameters tell rEFInd to scan for EFI boot loaders on internal, external, and optical (CD, DVD, and Blu-ray) devices, respectively. The <tt>netboot</tt> option relies on the presence of the <tt>ipxe.efi</tt> and <tt>ipxe_discover.efi</tt> program files in the <tt>EFI/tools</tt> directory to assist with network (Preboot Execution Environment, or PXE) booting. Note that <tt>netboot</tt> is experimental. See the <tt>BUILDING.txt</tt> file for information on building the necessary binaries. The <tt>hdbios</tt>, <tt>biosexternal</tt>, and <tt>cd</tt> parameters are similar, but scan for BIOS boot loaders. (Note that the BIOS options scan more thoroughly and actively on Macs than on UEFI-based PCs; for the latter, only options in the firmware's boot list are scanned, as described on the <a href="using.html">Using rEFInd</a> page.) The <tt>manual</tt> parameter tells rEFInd to scan the configuration file for manual settings. You can specify multiple parameters to have the program scan for multiple boot loader types. When you do so, the order determines the order in which the boot loaders appear in the menu. The default is <tt>internal, external, optical, manual</tt> on most systems, but <tt>internal, hdbios, external, biosexternal, optical, cd, manual</tt> on Macs.</td>
</tr>
<tr>
<td><tt>uefi_deep_legacy_scan</tt></td>
#define SHELL_NAMES L"\\EFI\\tools\\shell.efi,\\EFI\\tools\\shellx64.efi,\\shell.efi,\\shellx64.efi"
#define GPTSYNC_NAMES L"\\EFI\\tools\\gptsync.efi,\\EFI\\tools\\gptsync_x64.efi"
#define GDISK_NAMES L"\\EFI\\tools\\gdisk.efi,\\EFI\\tools\\gdisk_x64.efi"
+#define NETBOOT_NAMES L"\\EFI\\tools\\ipxe.efi"
#define MEMTEST_NAMES L"memtest86.efi,memtest86_x64.efi,memtest86x64.efi,bootx64.efi"
#define DRIVER_DIRS L"drivers,drivers_x64"
#define FALLBACK_FULLNAME L"EFI\\BOOT\\bootx64.efi"
#define SHELL_NAMES L"\\EFI\\tools\\shell.efi,\\EFI\\tools\\shellia32.efi,\\shell.efi,\\shellia32.efi"
#define GPTSYNC_NAMES L"\\EFI\\tools\\gptsync.efi,\\EFI\\tools\\gptsync_ia32.efi"
#define GDISK_NAMES L"\\EFI\\tools\\gdisk.efi,\\EFI\\tools\\gdisk_ia32.efi"
+#define NETBOOT_NAMES L"\\EFI\\tools\\ipxe.efi"
#define MEMTEST_NAMES L"memtest86.efi,memtest86_ia32.efi,memtest86ia32.efi,bootia32.efi"
#define DRIVER_DIRS L"drivers,drivers_ia32"
#define FALLBACK_FULLNAME L"EFI\\BOOT\\bootia32.efi"
#define SHELL_NAMES L"\\EFI\\tools\\shell.efi,\\shell.efi"
#define GPTSYNC_NAMES L"\\EFI\\tools\\gptsync.efi"
#define GDISK_NAMES L"\\EFI\\tools\\gdisk.efi"
+#define NETBOOT_NAMES L"\\EFI\\tools\\ipxe.efi"
#define MEMTEST_NAMES L"memtest86.efi"
#define DRIVER_DIRS L"drivers"
#define FALLBACK_FULLNAME L"EFI\\BOOT\\boot.efi" /* Not really correct */
#endif
#define FAT_ARCH 0x0ef1fab9 /* ID for Apple "fat" binary */
+#define IPXE_DISCOVER_NAME L"\\efi\\tools\\ipxe_discover.efi"
+#define IPXE_NAME L"\\efi\\tools\\ipxe.efi"
+
// Filename patterns that identify EFI boot loaders. Note that a single case (either L"*.efi" or
// L"*.EFI") is fine for most systems; but Gigabyte's buggy Hybrid EFI does a case-sensitive
// comparison when it should do a case-insensitive comparison, so I'm doubling this up. It does
0, 0, { DEFAULT_BIG_ICON_SIZE / 4, DEFAULT_SMALL_ICON_SIZE, DEFAULT_BIG_ICON_SIZE }, BANNER_NOSCALE,
NULL, NULL, CONFIG_FILE_NAME, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
{ TAG_SHELL, TAG_MEMTEST, TAG_GDISK, TAG_APPLE_RECOVERY, TAG_WINDOWS_RECOVERY, TAG_MOK_TOOL,
- TAG_ABOUT, TAG_SHUTDOWN, TAG_REBOOT, TAG_FIRMWARE, 0, 0, 0, 0, 0, 0 }
+ TAG_ABOUT, TAG_SHUTDOWN, TAG_REBOOT, TAG_FIRMWARE, 0, 0, 0, 0, 0, 0, 0, 0 }
};
EFI_GUID GlobalGuid = EFI_GLOBAL_VARIABLE;
if (AboutMenu.EntryCount == 0) {
AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
- AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.8.3.2");
+ AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.8.3.4");
AddMenuInfoLine(&AboutMenu, L"");
AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012-2014 Roderick W. Smith");
msr = 0x3a;
__asm__ volatile ("wrmsr" : : "c" (msr), "a" (low_bits), "d" (high_bits));
}
-} // VOID DoEnableAndLockVMX
+} // VOID DoEnableAndLockVMX()
static VOID StartLoader(LOADER_ENTRY *Entry, CHAR16 *SelectionName)
{
// '\EFI\kernels\initramfs-3.3.0.img'. If the directory ALSO contains the file
// initramfs-3.3.0-rc7.img or initramfs-13.3.0.img, those files will NOT match;
// however, initmine-3.3.0.img might match. (FindInitrd() returns the first match it
-// finds). Thus, care should be taken to avoid placing duplicate matching files in
+// finds.) Thus, care should be taken to avoid placing duplicate matching files in
// the kernel's directory.
// If no matching init file can be found, returns NULL.
static CHAR16 * FindInitrd(IN CHAR16 *LoaderPath, IN REFIT_VOLUME *Volume) {
// code and shortcut letter. For Linux EFI stub loaders, also sets kernel options
// that will (with luck) work fairly automatically.
VOID SetLoaderDefaults(LOADER_ENTRY *Entry, CHAR16 *LoaderPath, REFIT_VOLUME *Volume) {
- CHAR16 *FileName, *PathOnly, *NoExtension, *OSIconName = NULL, *Temp, *SubString;
+ CHAR16 *NameClues, *PathOnly, *NoExtension, *OSIconName = NULL, *Temp, *SubString;
CHAR16 ShortcutLetter = 0;
UINTN i = 0, Length;
- FileName = Basename(LoaderPath);
+ NameClues = Basename(LoaderPath);
PathOnly = FindPath(LoaderPath);
- NoExtension = StripEfiExtension(FileName);
+ NoExtension = StripEfiExtension(NameClues);
- // locate a custom icon for the loader
- // Anything found here takes precedence over the "hints" in the OSIconName variable
- if (!Entry->me.Image) {
- Entry->me.Image = egLoadIconAnyType(Volume->RootDir, PathOnly, NoExtension, GlobalConfig.IconSizes[ICON_SIZE_BIG]);
- }
- if (!Entry->me.Image) {
- Entry->me.Image = egCopyImage(Volume->VolIconImage);
- }
+ if (Volume->DiskKind == DISK_KIND_NET) {
+ MergeStrings(&NameClues, Entry->me.Title, L' ');
+ } else {
+ // locate a custom icon for the loader
+ // Anything found here takes precedence over the "hints" in the OSIconName variable
+ if (!Entry->me.Image) {
+ Entry->me.Image = egLoadIconAnyType(Volume->RootDir, PathOnly, NoExtension, GlobalConfig.IconSizes[ICON_SIZE_BIG]);
+ }
+ if (!Entry->me.Image) {
+ Entry->me.Image = egCopyImage(Volume->VolIconImage);
+ }
- // Begin creating icon "hints" by using last part of directory path leading
- // to the loader
- Temp = FindLastDirName(LoaderPath);
- MergeStrings(&OSIconName, Temp, L',');
- MyFreePool(Temp);
- Temp = NULL;
- if (OSIconName != NULL) {
- ShortcutLetter = OSIconName[0];
- }
+ // Begin creating icon "hints" by using last part of directory path leading
+ // to the loader
+ Temp = FindLastDirName(LoaderPath);
+ MergeStrings(&OSIconName, Temp, L',');
+ MyFreePool(Temp);
+ Temp = NULL;
+ if (OSIconName != NULL) {
+ ShortcutLetter = OSIconName[0];
+ }
- // Add every "word" in the volume label, delimited by spaces, dashes (-), or
- // underscores (_), to the list of hints to be used in searching for OS
- // icons.
- if ((Volume->VolName) && (StrLen(Volume->VolName) > 0)) {
- Temp = SubString = StrDuplicate(Volume->VolName);
- if (Temp != NULL) {
- Length = StrLen(Temp);
- for (i = 0; i < Length; i++) {
- if ((Temp[i] == L' ') || (Temp[i] == L'_') || (Temp[i] == L'-')) {
- Temp[i] = 0;
- if (StrLen(SubString) > 0)
- MergeStrings(&OSIconName, SubString, L',');
- SubString = Temp + i + 1;
- } // if
- } // for
- MergeStrings(&OSIconName, SubString, L',');
- MyFreePool(Temp);
+ // Add every "word" in the volume label, delimited by spaces, dashes (-), or
+ // underscores (_), to the list of hints to be used in searching for OS
+ // icons.
+ if ((Volume->VolName) && (StrLen(Volume->VolName) > 0)) {
+ Temp = SubString = StrDuplicate(Volume->VolName);
+ if (Temp != NULL) {
+ Length = StrLen(Temp);
+ for (i = 0; i < Length; i++) {
+ if ((Temp[i] == L' ') || (Temp[i] == L'_') || (Temp[i] == L'-')) {
+ Temp[i] = 0;
+ if (StrLen(SubString) > 0)
+ MergeStrings(&OSIconName, SubString, L',');
+ SubString = Temp + i + 1;
+ } // if
+ } // for
+ MergeStrings(&OSIconName, SubString, L',');
+ MyFreePool(Temp);
+ } // if
} // if
- } // if
+ } // if/else network boot
// detect specific loaders
- if (StriSubCmp(L"bzImage", FileName) || StriSubCmp(L"vmlinuz", FileName)) {
- GuessLinuxDistribution(&OSIconName, Volume, LoaderPath);
+ if (StriSubCmp(L"bzImage", NameClues) || StriSubCmp(L"vmlinuz", NameClues)) {
+ if (Volume->DiskKind != DISK_KIND_NET) {
+ GuessLinuxDistribution(&OSIconName, Volume, LoaderPath);
+ Entry->LoadOptions = GetMainLinuxOptions(LoaderPath, Volume);
+ }
MergeStrings(&OSIconName, L"linux", L',');
Entry->OSType = 'L';
if (ShortcutLetter == 0)
ShortcutLetter = 'L';
- Entry->LoadOptions = GetMainLinuxOptions(LoaderPath, Volume);
Entry->UseGraphicsMode = GlobalConfig.GraphicsFor & GRAPHICS_FOR_LINUX;
} else if (StriSubCmp(L"refit", LoaderPath)) {
MergeStrings(&OSIconName, L"refit", L',');
Entry->OSType = 'M';
ShortcutLetter = 'M';
Entry->UseGraphicsMode = GlobalConfig.GraphicsFor & GRAPHICS_FOR_OSX;
- } else if (StriCmp(FileName, L"diags.efi") == 0) {
+ } else if (StriCmp(NameClues, L"diags.efi") == 0) {
MergeStrings(&OSIconName, L"hwtest", L',');
- } else if (StriCmp(FileName, L"e.efi") == 0 || StriCmp(FileName, L"elilo.efi") == 0 || StriSubCmp(L"elilo", FileName)) {
+ } else if (StriCmp(NameClues, L"e.efi") == 0 || StriCmp(NameClues, L"elilo.efi") == 0 || StriSubCmp(L"elilo", NameClues)) {
MergeStrings(&OSIconName, L"elilo,linux", L',');
Entry->OSType = 'E';
if (ShortcutLetter == 0)
ShortcutLetter = 'L';
Entry->UseGraphicsMode = GlobalConfig.GraphicsFor & GRAPHICS_FOR_ELILO;
- } else if (StriSubCmp(L"grub", FileName)) {
+ } else if (StriSubCmp(L"grub", NameClues)) {
+ MergeStrings(&OSIconName, L"grub,linux", L',');
Entry->OSType = 'G';
ShortcutLetter = 'G';
Entry->UseGraphicsMode = GlobalConfig.GraphicsFor & GRAPHICS_FOR_GRUB;
- } else if (StriCmp(FileName, L"cdboot.efi") == 0 ||
- StriCmp(FileName, L"bootmgr.efi") == 0 ||
- StriCmp(FileName, L"bootmgfw.efi") == 0 ||
- StriCmp(FileName, L"bkpbootmgfw.efi") == 0) {
+ } else if (StriCmp(NameClues, L"cdboot.efi") == 0 ||
+ StriCmp(NameClues, L"bootmgr.efi") == 0 ||
+ StriCmp(NameClues, L"bootmgfw.efi") == 0 ||
+ StriCmp(NameClues, L"bkpbootmgfw.efi") == 0) {
MergeStrings(&OSIconName, L"win", L',');
Entry->OSType = 'W';
ShortcutLetter = 'W';
Entry->UseGraphicsMode = GlobalConfig.GraphicsFor & GRAPHICS_FOR_WINDOWS;
- } else if (StriCmp(FileName, L"xom.efi") == 0) {
+ } else if (StriCmp(NameClues, L"xom.efi") == 0) {
MergeStrings(&OSIconName, L"xom,win", L',');
Entry->UseGraphicsMode = TRUE;
Entry->OSType = 'X';
ShortcutLetter = 'W';
Entry->UseGraphicsMode = GlobalConfig.GraphicsFor & GRAPHICS_FOR_WINDOWS;
}
+ else if (StriSubCmp(L"ipxe", NameClues)) {
+ Entry->OSType = 'N';
+ ShortcutLetter = 'N';
+ MergeStrings(&OSIconName, L"network", L',');
+ }
if ((ShortcutLetter >= 'a') && (ShortcutLetter <= 'z'))
ShortcutLetter = ShortcutLetter - 'a' + 'A'; // convert lowercase to uppercase
MyFreePool(PathOnly);
} // VOID SetLoaderDefaults()
+// // Add a network (PXE) EFI boot loader to the list, using automatic settings
+// // for icons, options, etc.
+// LOADER_ENTRY * AddNetbootLoaderEntry(IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle, IN REFIT_VOLUME *Volume) {
+// LOADER_ENTRY *Entry;
+//
+// Print(L"Adding iPXE entry for '%s'\n", LoaderTitle);
+// PauseForKey();
+// CleanUpPathNameSlashes(LoaderPath);
+// Entry = InitializeLoaderEntry(NULL);
+// if (Entry != NULL) {
+// Entry->Title = StrDuplicate((LoaderTitle != NULL) ? LoaderTitle : LoaderPath);
+// Entry->me.Title = AllocateZeroPool(sizeof(CHAR16) * 256);
+// // Extra space at end of Entry->me.Title enables searching on Volume->VolName even if another volume
+// // name is identical except for something added to the end (e.g., VolB1 vs. VolB12).
+// SPrint(Entry->me.Title, 255, L"NetBoot %s", (LoaderTitle != NULL) ? LoaderTitle : LoaderPath);
+// Entry->me.Row = 0;
+// if ((LoaderPath != NULL) && (LoaderPath[0] != L'\\')) {
+// Entry->LoaderPath = StrDuplicate(L"\\");
+// } else {
+// Entry->LoaderPath = NULL;
+// }
+// MergeStrings(&(Entry->LoaderPath), LoaderPath, 0);
+// Entry->VolName = Volume->VolName;
+// Entry->DevicePath = FileDevicePath(Volume->DeviceHandle, Entry->LoaderPath);
+// SetLoaderDefaults(Entry, LoaderPath, Volume);
+// GenerateSubScreen(Entry, Volume);
+// AddMenuEntry(&MainMenu, (REFIT_MENU_ENTRY *)Entry);
+// }
+//
+// return(Entry);
+// } // LOADER_ENTRY * AddLoaderEntry()
+
// Add a specified EFI boot loader to the list, using automatic settings
// for icons, options, etc.
LOADER_ENTRY * AddLoaderEntry(IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle, IN REFIT_VOLUME *Volume) {
Entry->me.Title = AllocateZeroPool(sizeof(CHAR16) * 256);
// Extra space at end of Entry->me.Title enables searching on Volume->VolName even if another volume
// name is identical except for something added to the end (e.g., VolB1 vs. VolB12).
- SPrint(Entry->me.Title, 255, L"Boot %s from %s ", (LoaderTitle != NULL) ? LoaderTitle : LoaderPath, Volume->VolName);
+ // Note: Volume->VolName will be NULL for network boot programs.
+ if (Volume->VolName)
+ SPrint(Entry->me.Title, 255, L"Boot %s from %s ", (LoaderTitle != NULL) ? LoaderTitle : LoaderPath, Volume->VolName);
+ else
+ SPrint(Entry->me.Title, 255, L"Boot %s ", (LoaderTitle != NULL) ? LoaderTitle : LoaderPath);
Entry->me.Row = 0;
Entry->me.BadgeImage = Volume->VolBadgeImage;
if ((LoaderPath != NULL) && (LoaderPath[0] != L'\\')) {
return FoundFallbackDuplicate;
} /* static VOID ScanLoaderDir() */
+// Run the IPXE_DISCOVER_NAME program, which obtains the IP address of the boot
+// server and the name of the boot file it delivers.
+CHAR16* RuniPXEDiscover(EFI_HANDLE Volume)
+{
+ EFI_STATUS Status;
+ EFI_DEVICE_PATH *FilePath;
+ EFI_HANDLE iPXEHandle;
+ CHAR16 *boot_info;
+ UINTN boot_info_size = 256 * sizeof(CHAR16);
+
+ FilePath = FileDevicePath (Volume, IPXE_DISCOVER_NAME);
+ Status = refit_call6_wrapper(BS->LoadImage, FALSE, SelfImageHandle, FilePath,
+ NULL, 0, &iPXEHandle);
+ if (Status != 0) {
+ return NULL;
+ } // if
+
+ boot_info = AllocatePool(256 * sizeof(CHAR16));
+ Status = refit_call3_wrapper(BS->StartImage, iPXEHandle, &boot_info_size, &boot_info);
+
+ return boot_info;
+} // RuniPXEDiscover()
+
+// Scan for network (PXE) boot servers. This function relies on the presence
+// of the IPXE_DISCOVER_NAME and IPXE_NAME program files on the volume from
+// which rEFInd launched. As of December 6, 2014, these tools aren't entirely
+// reliable. See BUILDING.txt for information on building them.
+static VOID ScanNetboot() {
+ CHAR16 *iPXEFileName = IPXE_NAME;
+ CHAR16 *Location;
+ REFIT_VOLUME *NetVolume;
+
+ if (FileExists(SelfVolume->RootDir, IPXE_DISCOVER_NAME) &&
+ FileExists(SelfVolume->RootDir, IPXE_NAME) &&
+ IsValidLoader(SelfVolume->RootDir, IPXE_DISCOVER_NAME) &&
+ IsValidLoader(SelfVolume->RootDir, IPXE_NAME)) {
+ Location = RuniPXEDiscover(SelfVolume->DeviceHandle);
+ if (Location != NULL && FileExists(SelfVolume->RootDir, iPXEFileName)) {
+ NetVolume = AllocatePool(sizeof(REFIT_VOLUME));
+ NetVolume = CopyMem(NetVolume, SelfVolume, sizeof(REFIT_VOLUME));
+ NetVolume->DiskKind = DISK_KIND_NET;
+ NetVolume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_NET);
+ NetVolume->PartName = NetVolume->VolName = NULL;
+ AddLoaderEntry(iPXEFileName, Location, NetVolume);
+ MyFreePool(NetVolume);
+ } // if support files exist and are valid
+ }
+} // VOID ScanNetBoot()
+
static VOID ScanEfiFiles(REFIT_VOLUME *Volume) {
EFI_STATUS Status;
REFIT_DIR_ITER EfiDirIter;
case 'o': case 'O':
ScanOptical();
break;
+ case 'n': case 'N':
+ ScanNetboot();
+ break;
} // switch()
} // for
} // while
FileName = NULL;
break;
+
+ case TAG_NETBOOT:
+ j = 0;
+ while ((FileName = FindCommaDelimited(NETBOOT_NAMES, j++)) != NULL) {
+ if (FileExists(SelfRootDir, FileName)) {
+ AddToolEntry(SelfLoadedImage->DeviceHandle, FileName, L"Netboot",
+ BuiltinIcon(BUILTIN_ICON_TOOL_NETBOOT), 'N', FALSE);
+ } // if
+ MyFreePool(FileName);
+ } // while
+ FileName = NULL;
+ break;
case TAG_APPLE_RECOVERY:
FileName = StrDuplicate(L"\\com.apple.recovery.boot\\boot.efi");