L"Insert or F2 for more options; Esc to refresh" };
static REFIT_MENU_SCREEN AboutMenu = { L"About", NULL, 0, NULL, 0, NULL, 0, NULL, L"Press Enter to return to main menu", L"" };
-REFIT_CONFIG GlobalConfig = { FALSE, FALSE, FALSE, 0, 0, 0, DONT_CHANGE_TEXT_MODE, 20, 0, 0, GRAPHICS_FOR_OSX, LEGACY_TYPE_MAC, 0, 0,
+REFIT_CONFIG GlobalConfig = { FALSE, TRUE, FALSE, 0, 0, 0, DONT_CHANGE_TEXT_MODE, 20, 0, 0, GRAPHICS_FOR_OSX, LEGACY_TYPE_MAC, 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,
if (AboutMenu.EntryCount == 0) {
AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
- AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.8.1.3");
+ AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.8.2.3");
AddMenuInfoLine(&AboutMenu, L"");
AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012-2014 Roderick W. Smith");
IN CHAR16 *LoadOptions, IN UINTN LoaderType,
IN CHAR16 *ImageTitle, IN CHAR8 OSType,
OUT UINTN *ErrorInStep,
- IN BOOLEAN Verbose)
+ IN BOOLEAN Verbose,
+ IN BOOLEAN IsDriver)
{
EFI_STATUS Status, ReturnStatus;
EFI_HANDLE ChildImageHandle;
bailout_unload:
// unload the image, we don't care if it works or not...
- Status = refit_call1_wrapper(BS->UnloadImage, ChildImageHandle);
+ if (!IsDriver)
+ Status = refit_call1_wrapper(BS->UnloadImage, ChildImageHandle);
bailout:
MyFreePool(FullLoadOptions);
IN CHAR16 *LoadOptions, IN UINTN LoaderType,
IN CHAR16 *ImageTitle, IN CHAR8 OSType,
OUT UINTN *ErrorInStep,
- IN BOOLEAN Verbose)
+ IN BOOLEAN Verbose,
+ IN BOOLEAN IsDriver
+ )
{
EFI_DEVICE_PATH *DevicePaths[2];
DevicePaths[0] = DevicePath;
DevicePaths[1] = NULL;
- return StartEFIImageList(DevicePaths, LoadOptions, LoaderType, ImageTitle, OSType, ErrorInStep, Verbose);
+ return StartEFIImageList(DevicePaths, LoadOptions, LoaderType, ImageTitle, OSType, ErrorInStep, Verbose, IsDriver);
} /* static EFI_STATUS StartEFIImage() */
// From gummiboot: Reboot the computer into its built-in user interface
return err;
}
-// Record the value of the loader's name/description in rEFInd's "PreviousBoot" EFI variable.
+// Record the value of the loader's name/description in rEFInd's "PreviousBoot" EFI variable,
+// if it's different from what's already stored there.
static VOID StoreLoaderName(IN CHAR16 *Name) {
EFI_STATUS Status;
CHAR16 *OldName = NULL;
} // if
MyFreePool(OldName);
} // if
-} // VOID StorePreviousLoader()
+} // VOID StoreLoaderName()
//
// EFI OS loader functions
//
-static VOID StartLoader(LOADER_ENTRY *Entry)
+static VOID StartLoader(LOADER_ENTRY *Entry, CHAR16 *SelectionName)
{
UINTN ErrorInStep = 0;
BeginExternalScreen(Entry->UseGraphicsMode, L"Booting OS");
- StoreLoaderName(Entry->me.Title);
+ StoreLoaderName(SelectionName);
StartEFIImage(Entry->DevicePath, Entry->LoadOptions, TYPE_EFI,
- Basename(Entry->LoaderPath), Entry->OSType, &ErrorInStep, !Entry->UseGraphicsMode);
+ Basename(Entry->LoaderPath), Entry->OSType, &ErrorInStep, !Entry->UseGraphicsMode, FALSE);
FinishExternalScreen();
}
#define MAX_DISCOVERED_PATHS (16)
-static VOID StartLegacy(IN LEGACY_ENTRY *Entry)
+static VOID StartLegacy(IN LEGACY_ENTRY *Entry, IN CHAR16 *SelectionName)
{
EFI_STATUS Status;
EG_IMAGE *BootLogoImage;
ExtractLegacyLoaderPaths(DiscoveredPathList, MAX_DISCOVERED_PATHS, LegacyLoaderList);
- StoreLoaderName(Entry->me.Title);
- Status = StartEFIImageList(DiscoveredPathList, Entry->LoadOptions, TYPE_LEGACY, L"legacy loader", 0, &ErrorInStep, TRUE);
+ StoreLoaderName(SelectionName);
+ Status = StartEFIImageList(DiscoveredPathList, Entry->LoadOptions, TYPE_LEGACY, L"legacy loader", 0, &ErrorInStep, TRUE, FALSE);
if (Status == EFI_NOT_FOUND) {
if (ErrorInStep == 1) {
Print(L"\nPlease make sure that you have the latest firmware update installed.\n");
} /* static VOID StartLegacy() */
// Start a device on a non-Mac using the EFI_LEGACY_BIOS_PROTOCOL
-static VOID StartLegacyUEFI(LEGACY_ENTRY *Entry)
+static VOID StartLegacyUEFI(LEGACY_ENTRY *Entry, CHAR16 *SelectionName)
{
BeginExternalScreen(TRUE, L"Booting Legacy OS (UEFI mode)");
- StoreLoaderName(Entry->me.Title);
+ StoreLoaderName(SelectionName);
BdsLibConnectDevicePath (Entry->BdsOption->DevicePath);
BdsLibDoLegacyBoot(Entry->BdsOption);
BeginExternalScreen(Entry->UseGraphicsMode, Entry->me.Title + 6); // assumes "Start <title>" as assigned below
StoreLoaderName(Entry->me.Title);
StartEFIImage(Entry->DevicePath, Entry->LoadOptions, TYPE_EFI,
- Basename(Entry->LoaderPath), Entry->OSType, NULL, TRUE);
+ Basename(Entry->LoaderPath), Entry->OSType, NULL, TRUE, FALSE);
FinishExternalScreen();
} /* static VOID StartTool() */
SPrint(FileName, 255, L"%s\\%s", Path, DirEntry->FileName);
NumFound++;
Status = StartEFIImage(FileDevicePath(SelfLoadedImage->DeviceHandle, FileName),
- L"", TYPE_EFI, DirEntry->FileName, 0, NULL, FALSE);
+ L"", TYPE_EFI, DirEntry->FileName, 0, NULL, FALSE, TRUE);
}
Status = DirIterClose(&DirIter);
if (Status != EFI_NOT_FOUND) {
BOOLEAN MokProtocol;
REFIT_MENU_ENTRY *ChosenEntry;
UINTN MenuExit, i;
- CHAR16 *Selection = NULL;
+ CHAR16 *SelectionName = NULL;
EG_PIXEL BGColor;
// bootstrap
} // if
if (GlobalConfig.DefaultSelection)
- Selection = StrDuplicate(GlobalConfig.DefaultSelection);
+ SelectionName = StrDuplicate(GlobalConfig.DefaultSelection);
while (MainLoopRunning) {
- MenuExit = RunMainMenu(&MainMenu, Selection, &ChosenEntry);
+ MenuExit = RunMainMenu(&MainMenu, &SelectionName, &ChosenEntry);
// The Escape key triggers a re-scan operation....
if (MenuExit == MENU_EXIT_ESCAPE) {
break;
case TAG_LOADER: // Boot OS via .EFI loader
- StartLoader((LOADER_ENTRY *)ChosenEntry);
+ StartLoader((LOADER_ENTRY *)ChosenEntry, SelectionName);
break;
case TAG_LEGACY: // Boot legacy OS
- StartLegacy((LEGACY_ENTRY *)ChosenEntry);
+ StartLegacy((LEGACY_ENTRY *)ChosenEntry, SelectionName);
break;
case TAG_LEGACY_UEFI: // Boot a legacy OS on a non-Mac
- StartLegacyUEFI((LEGACY_ENTRY *)ChosenEntry);
+ StartLegacyUEFI((LEGACY_ENTRY *)ChosenEntry, SelectionName);
break;
case TAG_TOOL: // Start a EFI tool
break;
} // switch()
- MyFreePool(Selection);
- Selection = (ChosenEntry->Title) ? StrDuplicate(ChosenEntry->Title) : NULL;
} // while()
// If we end up here, things have gone wrong. Try to reboot, and if that