From f65fe9b450f766c1769d6eb6e3426fa24736df69 Mon Sep 17 00:00:00 2001 From: srs5694 Date: Sun, 11 Nov 2012 21:44:32 -0500 Subject: [PATCH] New Apple Recovery partition tool (2nd-row icon). --- refind/config.c | 11 +++++++++++ refind/global.h | 3 ++- refind/icns.c | 1 + refind/icns.h | 9 +++++---- refind/main.c | 31 +++++++++++++++++++++++-------- 5 files changed, 42 insertions(+), 13 deletions(-) diff --git a/refind/config.c b/refind/config.c index e70d6b2..e1b5c46 100644 --- a/refind/config.c +++ b/refind/config.c @@ -383,6 +383,8 @@ VOID ReadConfig(VOID) GlobalConfig.ShowTools[i - 1] = TAG_REBOOT; } else if (StriCmp(FlagName, L"shutdown") == 0) { GlobalConfig.ShowTools[i - 1] = TAG_SHUTDOWN; + } else if (StriCmp(FlagName, L"apple_recovery") == 0) { + GlobalConfig.ShowTools[i - 1] = TAG_APPLE_RECOVERY; } else { Print(L" unknown showtools flag: '%s'\n", FlagName); } @@ -571,6 +573,7 @@ static LOADER_ENTRY * AddStanzaEntries(REFIT_FILE *File, REFIT_VOLUME *Volume, C MyFreePool(Entry->LoadOptions); Entry->LoadOptions = NULL; // Discard default options, if any DefaultsSet = TRUE; + } else if ((StriCmp(TokenList[0], L"volume") == 0) && (TokenCount > 1)) { if (FindVolume(&CurrentVolume, TokenList[1])) { MyFreePool(Entry->me.Title); @@ -579,29 +582,37 @@ static LOADER_ENTRY * AddStanzaEntries(REFIT_FILE *File, REFIT_VOLUME *Volume, C Entry->me.BadgeImage = CurrentVolume->VolBadgeImage; Entry->VolName = CurrentVolume->VolName; } // if match found + } else if ((StriCmp(TokenList[0], L"icon") == 0) && (TokenCount > 1)) { MyFreePool(Entry->me.Image); Entry->me.Image = LoadIcns(CurrentVolume->RootDir, TokenList[1], 128); if (Entry->me.Image == NULL) { Entry->me.Image = DummyImage(128); } + } else if ((StriCmp(TokenList[0], L"initrd") == 0) && (TokenCount > 1)) { MyFreePool(Entry->InitrdPath); Entry->InitrdPath = StrDuplicate(TokenList[1]); + } else if ((StriCmp(TokenList[0], L"options") == 0) && (TokenCount > 1)) { MyFreePool(Entry->LoadOptions); Entry->LoadOptions = StrDuplicate(TokenList[1]); + } else if ((StriCmp(TokenList[0], L"ostype") == 0) && (TokenCount > 1)) { if (TokenCount > 1) { Entry->OSType = TokenList[1][0]; } + } else if ((StriCmp(TokenList[0], L"graphics") == 0) && (TokenCount > 1)) { Entry->UseGraphicsMode = (StriCmp(TokenList[1], L"on") == 0); + } else if (StriCmp(TokenList[0], L"disabled") == 0) { Entry->Enabled = FALSE; + } else if ((StriCmp(TokenList[0], L"submenuentry") == 0) && (TokenCount > 1)) { AddSubmenu(Entry, File, CurrentVolume, TokenList[1]); AddedSubmenu = TRUE; + } // set options to pass to the loader program FreeTokenLine(&TokenList, &TokenCount); } // while() diff --git a/refind/global.h b/refind/global.h index 101b597..24f33f3 100644 --- a/refind/global.h +++ b/refind/global.h @@ -68,7 +68,8 @@ #define TAG_SHELL (8) #define TAG_GPTSYNC (9) #define TAG_LEGACY_UEFI (10) -#define NUM_TOOLS (9) +#define TAG_APPLE_RECOVERY (11) +#define NUM_TOOLS (10) #define NUM_SCAN_OPTIONS 10 diff --git a/refind/icns.c b/refind/icns.c index df469ef..a7ec2e6 100644 --- a/refind/icns.c +++ b/refind/icns.c @@ -58,6 +58,7 @@ BUILTIN_ICON BuiltinIconTable[BUILTIN_ICON_COUNT] = { { NULL, L"tool_shell.icns", 48 }, { NULL, L"tool_part.icns", 48 }, { NULL, L"tool_rescue.icns", 48 }, + { NULL, L"tool_apple_rescue.icns", 48 }, { NULL, L"vol_internal.icns", 32 }, { NULL, L"vol_external.icns", 32 }, { NULL, L"vol_optical.icns", 32 }, diff --git a/refind/icns.h b/refind/icns.h index c4aff8a..e8945b2 100644 --- a/refind/icns.h +++ b/refind/icns.h @@ -64,10 +64,11 @@ EG_IMAGE * BuiltinIcon(IN UINTN Id); #define BUILTIN_ICON_TOOL_SHELL (4) #define BUILTIN_ICON_TOOL_PART (5) #define BUILTIN_ICON_TOOL_RESCUE (6) -#define BUILTIN_ICON_VOL_INTERNAL (7) -#define BUILTIN_ICON_VOL_EXTERNAL (8) -#define BUILTIN_ICON_VOL_OPTICAL (9) -#define BUILTIN_ICON_COUNT (10) +#define BUILTIN_ICON_TOOL_APPLE_RESCUE (7) +#define BUILTIN_ICON_VOL_INTERNAL (8) +#define BUILTIN_ICON_VOL_EXTERNAL (9) +#define BUILTIN_ICON_VOL_OPTICAL (10) +#define BUILTIN_ICON_COUNT (11) #endif diff --git a/refind/main.c b/refind/main.c index 721dbe7..df81018 100644 --- a/refind/main.c +++ b/refind/main.c @@ -95,7 +95,7 @@ static REFIT_MENU_SCREEN AboutMenu = { L"About", NULL, 0, NULL, 0, NULL, 0, REFIT_CONFIG GlobalConfig = { FALSE, FALSE, 0, 0, 20, 0, 0, GRAPHICS_FOR_OSX, LEGACY_TYPE_MAC, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - {TAG_SHELL, TAG_ABOUT, TAG_SHUTDOWN, TAG_REBOOT, 0, 0, 0, 0, 0 }}; + {TAG_SHELL, TAG_ABOUT, TAG_APPLE_RECOVERY, TAG_SHUTDOWN, TAG_REBOOT, 0, 0, 0, 0, 0 }}; // Structure used to hold boot loader filenames and time stamps in // a linked list; used to sort entries within a directory. @@ -115,7 +115,7 @@ static VOID AboutrEFInd(VOID) if (AboutMenu.EntryCount == 0) { AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT); - AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.4.7.2"); + AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.4.7.3"); AddMenuInfoLine(&AboutMenu, L""); AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer"); AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012 Roderick W. Smith"); @@ -1452,7 +1452,7 @@ static VOID StartTool(IN LOADER_ENTRY *Entry) FinishExternalScreen(); } /* static VOID StartTool() */ -static LOADER_ENTRY * AddToolEntry(IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle, IN EG_IMAGE *Image, +static LOADER_ENTRY * AddToolEntry(EFI_HANDLE DeviceHandle, IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle, IN EG_IMAGE *Image, IN CHAR16 ShortcutLetter, IN BOOLEAN UseGraphicsMode) { LOADER_ENTRY *Entry; @@ -1468,7 +1468,8 @@ static LOADER_ENTRY * AddToolEntry(IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle Entry->me.ShortcutLetter = ShortcutLetter; Entry->me.Image = Image; Entry->LoaderPath = (LoaderPath) ? StrDuplicate(LoaderPath) : NULL; - Entry->DevicePath = FileDevicePath(SelfLoadedImage->DeviceHandle, Entry->LoaderPath); +// Entry->DevicePath = FileDevicePath(SelfLoadedImage->DeviceHandle, Entry->LoaderPath); + Entry->DevicePath = FileDevicePath(DeviceHandle, Entry->LoaderPath); Entry->UseGraphicsMode = UseGraphicsMode; AddMenuEntry(&MainMenu, (REFIT_MENU_ENTRY *)Entry); @@ -1715,9 +1716,9 @@ static VOID ScanForBootloaders(VOID) { // Add the second-row tags containing built-in and external tools (EFI shell, // reboot, etc.) static VOID ScanForTools(VOID) { - CHAR16 *FileName = NULL; + CHAR16 *FileName = NULL, Description[256]; REFIT_MENU_ENTRY *TempMenuEntry; - UINTN i, j; + UINTN i, j, VolumeIndex; for (i = 0; i < NUM_TOOLS; i++) { switch(GlobalConfig.ShowTools[i]) { @@ -1745,16 +1746,30 @@ static VOID ScanForTools(VOID) { j = 0; while ((FileName = FindCommaDelimited(SHELL_NAMES, j++)) != NULL) { if (FileExists(SelfRootDir, FileName)) { - AddToolEntry(FileName, L"EFI Shell", BuiltinIcon(BUILTIN_ICON_TOOL_SHELL), 'S', FALSE); + AddToolEntry(SelfLoadedImage->DeviceHandle, FileName, L"EFI Shell", BuiltinIcon(BUILTIN_ICON_TOOL_SHELL), 'S', FALSE); } } // while break; case TAG_GPTSYNC: + MyFreePool(FileName); + FileName = NULL; MergeStrings(&FileName, L"\\efi\\tools\\gptsync.efi", 0); if (FileExists(SelfRootDir, FileName)) { - AddToolEntry(FileName, L"Make Hybrid MBR", BuiltinIcon(BUILTIN_ICON_TOOL_PART), 'P', FALSE); + AddToolEntry(SelfLoadedImage->DeviceHandle, FileName, L"Make Hybrid MBR", BuiltinIcon(BUILTIN_ICON_TOOL_PART), 'P', FALSE); } break; + case TAG_APPLE_RECOVERY: + MyFreePool(FileName); + FileName = NULL; + MergeStrings(&FileName, L"\\com.apple.recovery.boot\\boot.efi", 0); + for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) { + if ((Volumes[VolumeIndex]->RootDir != NULL) && (FileExists(Volumes[VolumeIndex]->RootDir, FileName))) { + SPrint(Description, 255, L"Apple Recovery on %s", Volumes[VolumeIndex]->VolName); + AddToolEntry(Volumes[VolumeIndex]->DeviceHandle, FileName, Description, + BuiltinIcon(BUILTIN_ICON_TOOL_APPLE_RESCUE), 'R', TRUE); + } + } // for + break; } // switch() MyFreePool(FileName); FileName = NULL; -- 2.39.2