//
// constants
-#define MACOSX_LOADER_PATH L"System\\Library\\CoreServices\\boot.efi"
+#define MACOSX_LOADER_DIR L"System\\Library\\CoreServices"
+#define MACOSX_LOADER_PATH ( MACOSX_LOADER_DIR L"\\boot.efi" )
#if defined (EFIX64)
#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"
if (AboutMenu.EntryCount == 0) {
AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
- AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.8.3.4");
+ AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.8.4.1");
AddMenuInfoLine(&AboutMenu, L"");
AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012-2014 Roderick W. Smith");
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) {
- LOADER_ENTRY *Entry;
+ LOADER_ENTRY *Entry;
CleanUpPathNameSlashes(LoaderPath);
Entry = InitializeLoaderEntry(NULL);
EFI_STATUS Status;
EFI_DEVICE_PATH *FilePath;
EFI_HANDLE iPXEHandle;
- CHAR16 *boot_info;
- UINTN boot_info_size = 256 * sizeof(CHAR16);
+ CHAR16 *boot_info = NULL;
+ UINTN boot_info_size = 0;
FilePath = FileDevicePath (Volume, IPXE_DISCOVER_NAME);
Status = refit_call6_wrapper(BS->LoadImage, FALSE, SelfImageHandle, FilePath,
NULL, 0, &iPXEHandle);
- if (Status != 0) {
+ 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;
MergeStrings(&MatchPatterns, LINUX_MATCH_PATTERNS, L',');
// check for Mac OS X boot loader
- if (ShouldScan(Volume, L"System\\Library\\CoreServices")) {
+ if (ShouldScan(Volume, MACOSX_LOADER_DIR)) {
StrCpy(FileName, MACOSX_LOADER_PATH);
- if (FileExists(Volume->RootDir, FileName) && !FilenameIn(Volume, Directory, L"boot.efi", GlobalConfig.DontScanFiles)) {
+ if (FileExists(Volume->RootDir, FileName) && !FilenameIn(Volume, MACOSX_LOADER_DIR, L"boot.efi", GlobalConfig.DontScanFiles)) {
AddLoaderEntry(FileName, L"Mac OS X", Volume);
if (DuplicatesFallback(Volume, FileName))
ScanFallbackLoader = FALSE;
// check for XOM
StrCpy(FileName, L"System\\Library\\CoreServices\\xom.efi");
- if (FileExists(Volume->RootDir, FileName) && !FilenameIn(Volume, Directory, L"boot.efi", GlobalConfig.DontScanFiles)) {
+ if (FileExists(Volume->RootDir, FileName) && !FilenameIn(Volume, MACOSX_LOADER_DIR, L"xom.efi", GlobalConfig.DontScanFiles)) {
AddLoaderEntry(FileName, L"Windows XP (XoM)", Volume);
if (DuplicatesFallback(Volume, FileName))
ScanFallbackLoader = FALSE;
// check for Microsoft boot loader/menu
if (ShouldScan(Volume, L"EFI\\Microsoft\\Boot")) {
StrCpy(FileName, L"EFI\\Microsoft\\Boot\\bkpbootmgfw.efi");
- if (FileExists(Volume->RootDir, FileName) && !FilenameIn(Volume, Directory, L"bkpbootmgfw.efi",
+ if (FileExists(Volume->RootDir, FileName) && !FilenameIn(Volume, L"EFI\\Microsoft\\Boot", L"bkpbootmgfw.efi",
GlobalConfig.DontScanFiles)) {
AddLoaderEntry(FileName, L"Microsoft EFI boot (Boot Repair backup)", Volume);
FoundBRBackup = TRUE;
ScanFallbackLoader = FALSE;
}
StrCpy(FileName, L"EFI\\Microsoft\\Boot\\bootmgfw.efi");
- if (FileExists(Volume->RootDir, FileName) && !FilenameIn(Volume, Directory, L"bootmgfw.efi", GlobalConfig.DontScanFiles)) {
+ if (FileExists(Volume->RootDir, FileName) && !FilenameIn(Volume, L"EFI\\Microsoft\\Boot", L"bootmgfw.efi", GlobalConfig.DontScanFiles)) {
if (FoundBRBackup)
AddLoaderEntry(FileName, L"Supposed Microsoft EFI boot (probably GRUB)", Volume);
else
PathName = StrDuplicate(DirName);
MergeStrings(&PathName, FileName, (StriCmp(PathName, L"\\") == 0) ? 0 : L'\\');
for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) {
- if ((Volumes[VolumeIndex]->RootDir != NULL) && (FileExists(Volumes[VolumeIndex]->RootDir, PathName))) {
+ if ((Volumes[VolumeIndex]->RootDir != NULL) && (FileExists(Volumes[VolumeIndex]->RootDir, PathName)) &&
+ IsValidLoader(Volumes[VolumeIndex]->RootDir, PathName)) {
SPrint(FullDescription, 255, L"%s at %s on %s", Description, PathName, Volumes[VolumeIndex]->VolName);
AddToolEntry(Volumes[VolumeIndex]->DeviceHandle, PathName, FullDescription, BuiltinIcon(Icon), 'S', FALSE);
} // if