// 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
{
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)
// 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
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();
}
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);
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' ');
} // 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";
// 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";
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)
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
// 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);
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
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)
{
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);
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
//
LoadDrivers();
#endif /* DEBIAN_ENABLE_EFI110 */
ScanForBootloaders();
+ ScanForTools();
while (MainLoopRunning) {
MenuExit = RunMainMenu(&MainMenu, GlobalConfig.DefaultSelection, &ChosenEntry);
}
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
case TAG_TOOL: // Start a EFI tool
StartTool((LOADER_ENTRY *)ChosenEntry);
break;
+
+ case TAG_EXIT: // Terminate rEFInd
+ BeginTextScreen(L" ");
+ return EFI_SUCCESS;
+ break;
}
}