X-Git-Url: https://code.delx.au/refind/blobdiff_plain/ec94a3138800973e0308c641c5e1ced7c5f1b7ba..e8d44d7578a450f6289abf45f841c65514a6d443:/refind/main.c diff --git a/refind/main.c b/refind/main.c index 9e653b4..1598463 100644 --- a/refind/main.c +++ b/refind/main.c @@ -76,7 +76,8 @@ // // 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" @@ -175,7 +176,7 @@ static VOID AboutrEFInd(VOID) 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"); @@ -1035,42 +1036,10 @@ VOID SetLoaderDefaults(LOADER_ENTRY *Entry, CHAR16 *LoaderPath, REFIT_VOLUME *Vo 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); @@ -1406,17 +1375,15 @@ 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); + 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; @@ -1463,9 +1430,9 @@ static VOID ScanEfiFiles(REFIT_VOLUME *Volume) { 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; @@ -1473,7 +1440,7 @@ static VOID ScanEfiFiles(REFIT_VOLUME *Volume) { // 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; @@ -1483,7 +1450,7 @@ static VOID ScanEfiFiles(REFIT_VOLUME *Volume) { // 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; @@ -1491,7 +1458,7 @@ static VOID ScanEfiFiles(REFIT_VOLUME *Volume) { 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 @@ -2385,7 +2352,8 @@ static VOID FindTool(CHAR16 *Locations, CHAR16 *Names, CHAR16 *Description, UINT 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