X-Git-Url: https://code.delx.au/refind/blobdiff_plain/6ddfd09a30d788c784840b1f6dfc3d9281b33726..860fb6e13e399f326ff20e25f9f36070ee67b1a9:/refind/main.c diff --git a/refind/main.c b/refind/main.c index b1839c9..5ccd577 100644 --- a/refind/main.c +++ b/refind/main.c @@ -55,16 +55,25 @@ // variables #define MACOSX_LOADER_PATH L"\\System\\Library\\CoreServices\\boot.efi" +#if defined (EFIX64) +#define SHELL_NAMES L"\\EFI\\tools\\shell.efi,\\shellx64.efi" +#elif defined (EFI32) +#define SHELL_NAMES L"\\EFI\\tools\\shell.efi,\\shellia32.efi" +#else +#define SHELL_NAMES L"\\EFI\\tools\\shell.efi" +#endif static REFIT_MENU_ENTRY MenuEntryAbout = { L"About rEFInd", TAG_ABOUT, 1, 0, 'A', NULL, NULL, NULL }; -static REFIT_MENU_ENTRY MenuEntryReset = { L"Restart Computer", TAG_RESET, 1, 0, 'R', NULL, NULL, NULL }; +static REFIT_MENU_ENTRY MenuEntryReset = { L"Reboot Computer", TAG_REBOOT, 1, 0, 'R', NULL, NULL, NULL }; static REFIT_MENU_ENTRY MenuEntryShutdown = { L"Shut Down Computer", TAG_SHUTDOWN, 1, 0, 'U', NULL, NULL, NULL }; static REFIT_MENU_ENTRY MenuEntryReturn = { L"Return to Main Menu", TAG_RETURN, 0, 0, 0, NULL, NULL, NULL }; +static REFIT_MENU_ENTRY MenuEntryExit = { L"Exit rEFInd", TAG_EXIT, 1, 0, 0, NULL, NULL, NULL }; static REFIT_MENU_SCREEN MainMenu = { L"Main Menu", NULL, 0, NULL, 0, NULL, 0, L"Automatic boot" }; static REFIT_MENU_SCREEN AboutMenu = { L"About", NULL, 0, NULL, 0, NULL, 0, NULL }; -REFIT_CONFIG GlobalConfig = { FALSE, 20, 0, 0, FALSE, NULL, NULL, NULL, NULL }; +REFIT_CONFIG GlobalConfig = { FALSE, 20, 0, 0, NULL, NULL, NULL, NULL, + {TAG_SHELL, TAG_ABOUT, TAG_SHUTDOWN, TAG_REBOOT, 0, 0, 0, 0, 0 }}; // // misc functions @@ -74,15 +83,16 @@ static VOID AboutrEFInd(VOID) { if (AboutMenu.EntryCount == 0) { AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT); - AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.2.2"); + AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.2.4"); AddMenuInfoLine(&AboutMenu, L""); AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer"); AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012 Roderick W. Smith"); AddMenuInfoLine(&AboutMenu, L"Portions Copyright (c) Intel Corporation and others"); + AddMenuInfoLine(&AboutMenu, L"Distributed under the terms of the GNU GPLv3 license"); AddMenuInfoLine(&AboutMenu, L""); AddMenuInfoLine(&AboutMenu, L"Running on:"); AddMenuInfoLine(&AboutMenu, PoolPrint(L" EFI Revision %d.%02d", - ST->Hdr.Revision >> 16, ST->Hdr.Revision & ((1 << 16) - 1))); + ST->Hdr.Revision >> 16, ST->Hdr.Revision & ((1 << 16) - 1))); #if defined(EFI32) AddMenuInfoLine(&AboutMenu, L" Platform: x86 (32 bit)"); #elif defined(EFIX64) @@ -134,13 +144,13 @@ static EFI_STATUS StartEFIImageList(IN EFI_DEVICE_PATH **DevicePaths, // set load options if (LoadOptions != NULL) { - ReturnStatus = Status = refit_call3_wrapper(BS->HandleProtocol, ChildImageHandle, &LoadedImageProtocol, (VOID **) &ChildLoadedImage); + ReturnStatus = Status = refit_call3_wrapper(BS->HandleProtocol, ChildImageHandle, &LoadedImageProtocol, (VOID **) &ChildLoadedImage); if (CheckError(Status, L"while getting a LoadedImageProtocol handle")) { if (ErrorInStep != NULL) *ErrorInStep = 2; goto bailout_unload; } - + if (LoadOptionsPrefix != NULL) { FullLoadOptions = PoolPrint(L"%s %s ", LoadOptionsPrefix, LoadOptions); // NOTE: That last space is also added by the EFI shell and seems to be significant @@ -196,9 +206,11 @@ static EFI_STATUS StartEFIImage(IN EFI_DEVICE_PATH *DevicePath, static VOID StartLoader(IN LOADER_ENTRY *Entry) { + UINTN ErrorInStep = 0; + BeginExternalScreen(Entry->UseGraphicsMode, L"Booting OS"); StartEFIImage(Entry->DevicePath, Entry->LoadOptions, - Basename(Entry->LoaderPath), Basename(Entry->LoaderPath), NULL); + Basename(Entry->LoaderPath), Basename(Entry->LoaderPath), &ErrorInStep); FinishExternalScreen(); } @@ -226,10 +238,8 @@ static CHAR16 * FindInitrd(IN CHAR16 *LoaderPath, IN REFIT_VOLUME *Volume) { while ((DirIterNext(&DirIter, 2, L"init*", &DirEntry)) && (InitrdName == NULL)) { InitrdVersion = FindNumbers(DirEntry->FileName); if (KernelVersion != NULL) { -// if (StriSubCmp(KernelVersion, DirEntry->FileName)) { if (StriCmp(InitrdVersion, KernelVersion) == 0) InitrdName = PoolPrint(L"%s\\%s", Path, DirEntry->FileName); -// } // if match found } else { if (InitrdVersion == NULL) InitrdName = PoolPrint(L"%s\\%s", Path, DirEntry->FileName); @@ -300,7 +310,6 @@ REFIT_MENU_SCREEN *InitializeSubScreen(IN LOADER_ENTRY *Entry) { SubEntry = InitializeLoaderEntry(Entry); if (SubEntry != NULL) { SubEntry->me.Title = L"Boot using default options"; -// SubEntry->me.Title = (Entry->OSType == 'M') ? L"Boot Mac OS X" : PoolPrint(L"Run %s", FileName); if ((SubEntry->InitrdPath != NULL) && (StrLen(SubEntry->InitrdPath) > 0) && (!StriSubCmp(L"initrd", SubEntry->LoadOptions))) { Temp = PoolPrint(L"initrd=%s", SubEntry->InitrdPath); MergeStrings(&SubEntry->LoadOptions, Temp, L' '); @@ -350,7 +359,7 @@ VOID GenerateSubScreen(LOADER_ENTRY *Entry, IN REFIT_VOLUME *Volume) { } // if #endif - if (!(GlobalConfig.DisableFlags & DISABLE_FLAG_SINGLEUSER)) { + if (!(GlobalConfig.HideUIFlags & HIDEUI_FLAG_SINGLEUSER)) { SubEntry = InitializeLoaderEntry(Entry); if (SubEntry != NULL) { SubEntry->me.Title = L"Boot Mac OS X in verbose mode"; @@ -388,7 +397,7 @@ VOID GenerateSubScreen(LOADER_ENTRY *Entry, IN REFIT_VOLUME *Volume) { // check for Apple hardware diagnostics StrCpy(DiagsFileName, L"\\System\\Library\\CoreServices\\.diagnostics\\diags.efi"); - if (FileExists(Volume->RootDir, DiagsFileName) && !(GlobalConfig.DisableFlags & DISABLE_FLAG_HWTEST)) { + if (FileExists(Volume->RootDir, DiagsFileName) && !(GlobalConfig.HideUIFlags & HIDEUI_FLAG_HWTEST)) { SubEntry = InitializeLoaderEntry(Entry); if (SubEntry != NULL) { SubEntry->me.Title = L"Run Apple Hardware Test"; @@ -615,7 +624,8 @@ static VOID ScanLoaderDir(IN REFIT_VOLUME *Volume, IN CHAR16 *Path) if (DirEntry->FileName[0] == '.' || StriCmp(DirEntry->FileName, L"TextMode.efi") == 0 || StriCmp(DirEntry->FileName, L"ebounce.efi") == 0 || - StriCmp(DirEntry->FileName, L"GraphicsConsole.efi") == 0) + StriCmp(DirEntry->FileName, L"GraphicsConsole.efi") == 0 || + StriSubCmp(L"shell", DirEntry->FileName)) continue; // skip this if (Path) @@ -640,7 +650,6 @@ static VOID ScanEfiFiles(REFIT_VOLUME *Volume) { REFIT_DIR_ITER EfiDirIter; EFI_FILE_INFO *EfiDirEntry; CHAR16 FileName[256]; -// LOADER_ENTRY *Entry; if ((Volume->RootDir != NULL) && (Volume->VolName != NULL)) { // check for Mac OS X boot loader @@ -671,7 +680,7 @@ static VOID ScanEfiFiles(REFIT_VOLUME *Volume) { // scan subdirectories of the EFI directory (as per the standard) DirIterOpen(Volume->RootDir, L"EFI", &EfiDirIter); while (DirIterNext(&EfiDirIter, 1, NULL, &EfiDirEntry)) { - if (StriCmp(EfiDirEntry->FileName, L"TOOLS") == 0 || EfiDirEntry->FileName[0] == '.') + if (StriCmp(EfiDirEntry->FileName, L"tools") == 0 || EfiDirEntry->FileName[0] == '.') continue; // skip this, doesn't contain boot loaders SPrint(FileName, 255, L"EFI\\%s", EfiDirEntry->FileName); ScanLoaderDir(Volume, FileName); @@ -1062,48 +1071,6 @@ static LOADER_ENTRY * AddToolEntry(IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle return Entry; } /* static LOADER_ENTRY * AddToolEntry() */ -static VOID ScanTool(VOID) -{ - CHAR16 FileName[256]; - LOADER_ENTRY *Entry; - - if (GlobalConfig.DisableFlags & DISABLE_FLAG_TOOLS) - return; - - // look for the EFI shell - if (!(GlobalConfig.DisableFlags & DISABLE_FLAG_SHELL)) { - SPrint(FileName, 255, L"%s\\apps\\shell.efi", SelfDirPath); - if (FileExists(SelfRootDir, FileName)) { - AddToolEntry(FileName, L"EFI Shell", BuiltinIcon(BUILTIN_ICON_TOOL_SHELL), 'E', FALSE); - } else { - StrCpy(FileName, L"\\efi\\tools\\shell.efi"); - if (FileExists(SelfRootDir, FileName)) { - AddToolEntry(FileName, L"EFI Shell", BuiltinIcon(BUILTIN_ICON_TOOL_SHELL), 'E', FALSE); - } - } - } - - // look for the GPT/MBR sync tool - StrCpy(FileName, L"\\efi\\tools\\gptsync.efi"); - if (FileExists(SelfRootDir, FileName)) { - AddToolEntry(FileName, L"Make Hybrid MBR", BuiltinIcon(BUILTIN_ICON_TOOL_PART), 'P', FALSE); - } - - // look for rescue Linux - StrCpy(FileName, L"\\efi\\rescue\\elilo.efi"); - if (SelfVolume != NULL && FileExists(SelfRootDir, FileName)) { - Entry = AddToolEntry(FileName, L"Rescue Linux", BuiltinIcon(BUILTIN_ICON_TOOL_RESCUE), '0', FALSE); - - if (UGAWidth == 1440 && UGAHeight == 900) - Entry->LoadOptions = L"-d 0 i17"; - else if (UGAWidth == 1680 && UGAHeight == 1050) - Entry->LoadOptions = L"-d 0 i20"; - else - Entry->LoadOptions = L"-d 0 mini"; - } -} - - #ifdef DEBIAN_ENABLE_EFI110 // // pre-boot driver functions @@ -1132,6 +1099,28 @@ static VOID ScanDriverDir(IN CHAR16 *Path) CheckError(Status, FileName); } } +EFI_STATUS +LibScanHandleDatabase ( + EFI_HANDLE DriverBindingHandle, OPTIONAL + UINT32 *DriverBindingHandleIndex, OPTIONAL + EFI_HANDLE ControllerHandle, OPTIONAL + UINT32 *ControllerHandleIndex, OPTIONAL + UINTN *HandleCount, + EFI_HANDLE **HandleBuffer, + UINT32 **HandleType + ); +#define EFI_HANDLE_TYPE_UNKNOWN 0x000 +#define EFI_HANDLE_TYPE_IMAGE_HANDLE 0x001 +#define EFI_HANDLE_TYPE_DRIVER_BINDING_HANDLE 0x002 +#define EFI_HANDLE_TYPE_DEVICE_DRIVER 0x004 +#define EFI_HANDLE_TYPE_BUS_DRIVER 0x008 +#define EFI_HANDLE_TYPE_DRIVER_CONFIGURATION_HANDLE 0x010 +#define EFI_HANDLE_TYPE_DRIVER_DIAGNOSTICS_HANDLE 0x020 +#define EFI_HANDLE_TYPE_COMPONENT_NAME_HANDLE 0x040 +#define EFI_HANDLE_TYPE_DEVICE_HANDLE 0x080 +#define EFI_HANDLE_TYPE_PARENT_HANDLE 0x100 +#define EFI_HANDLE_TYPE_CONTROLLER_HANDLE 0x200 +#define EFI_HANDLE_TYPE_CHILD_HANDLE 0x400 static EFI_STATUS ConnectAllDriversToAllControllers(VOID) { @@ -1260,20 +1249,7 @@ static VOID ScanForBootloaders(VOID) { break; } // switch() } // for - ScanTool(); - // fixed other menu entries - if (!(GlobalConfig.HideUIFlags & HIDEUI_FLAG_FUNCS)) { - MenuEntryAbout.Image = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT); - AddMenuEntry(&MainMenu, &MenuEntryAbout); - } - if (!(GlobalConfig.HideUIFlags & HIDEUI_FLAG_FUNCS) || MainMenu.EntryCount == 0) { - MenuEntryShutdown.Image = BuiltinIcon(BUILTIN_ICON_FUNC_SHUTDOWN); - AddMenuEntry(&MainMenu, &MenuEntryShutdown); - MenuEntryReset.Image = BuiltinIcon(BUILTIN_ICON_FUNC_RESET); - AddMenuEntry(&MainMenu, &MenuEntryReset); - } - // assign shortcut keys for (i = 0; i < MainMenu.EntryCount && MainMenu.Entries[i]->Row == 0 && i < 9; i++) MainMenu.Entries[i]->ShortcutDigit = (CHAR16)('1' + i); @@ -1282,6 +1258,52 @@ static VOID ScanForBootloaders(VOID) { FinishTextScreen(FALSE); } // static VOID ScanForBootloaders() +// Add the second-row tags containing built-in and external tools (EFI shell, +// reboot, etc.) +static VOID ScanForTools(VOID) { + CHAR16 *FileName = NULL; + UINTN i, j; + + for (i = 0; i < NUM_TOOLS; i++) { + switch(GlobalConfig.ShowTools[i]) { + case TAG_SHUTDOWN: + MenuEntryShutdown.Image = BuiltinIcon(BUILTIN_ICON_FUNC_SHUTDOWN); + AddMenuEntry(&MainMenu, &MenuEntryShutdown); + break; + case TAG_REBOOT: + MenuEntryReset.Image = BuiltinIcon(BUILTIN_ICON_FUNC_RESET); + AddMenuEntry(&MainMenu, &MenuEntryReset); + break; + case TAG_ABOUT: + MenuEntryAbout.Image = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT); + AddMenuEntry(&MainMenu, &MenuEntryAbout); + break; + case TAG_EXIT: + MenuEntryExit.Image = BuiltinIcon(BUILTIN_ICON_FUNC_EXIT); + AddMenuEntry(&MainMenu, &MenuEntryExit); + break; + case TAG_SHELL: + j = 0; + while ((FileName = FindCommaDelimited(SHELL_NAMES, j++)) != NULL) { + if (FileExists(SelfRootDir, FileName)) { + AddToolEntry(FileName, L"EFI Shell", BuiltinIcon(BUILTIN_ICON_TOOL_SHELL), 'E', FALSE); + } + } // while + break; + case TAG_GPTSYNC: + 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); + } + break; + } // switch() + if (FileName != NULL) { + FreePool(FileName); + FileName = NULL; + } + } // for +} // static VOID ScanForTools + // // main entry point // @@ -1316,6 +1338,7 @@ efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) LoadDrivers(); #endif /* DEBIAN_ENABLE_EFI110 */ ScanForBootloaders(); + ScanForTools(); while (MainLoopRunning) { MenuExit = RunMainMenu(&MainMenu, GlobalConfig.DefaultSelection, &ChosenEntry); @@ -1332,8 +1355,8 @@ efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) } switch (ChosenEntry->Tag) { - - case TAG_RESET: // Restart + + case TAG_REBOOT: // Reboot TerminateScreen(); refit_call4_wrapper(RT->ResetSystem, EfiResetCold, EFI_SUCCESS, 0, NULL); MainLoopRunning = FALSE; // just in case we get this far @@ -1360,6 +1383,11 @@ efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) case TAG_TOOL: // Start a EFI tool StartTool((LOADER_ENTRY *)ChosenEntry); break; + + case TAG_EXIT: // Terminate rEFInd + BeginTextScreen(L" "); + return EFI_SUCCESS; + break; } }