X-Git-Url: https://code.delx.au/refind/blobdiff_plain/860fb6e13e399f326ff20e25f9f36070ee67b1a9..622ed08c231f81a83b5e2807e7abace1dec9502f:/refind/main.c diff --git a/refind/main.c b/refind/main.c index 5ccd577..0196aab 100644 --- a/refind/main.c +++ b/refind/main.c @@ -49,6 +49,7 @@ #include "icns.h" #include "menu.h" #include "refit_call_wrapper.h" +#include "driver_support.h" #include "../include/syslinux_mbr.h" // @@ -72,7 +73,7 @@ static REFIT_MENU_ENTRY MenuEntryExit = { L"Exit rEFInd", TAG_EXIT, 1, 0, 0, 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, NULL, NULL, NULL, NULL, +REFIT_CONFIG GlobalConfig = { FALSE, 20, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, {TAG_SHELL, TAG_ABOUT, TAG_SHUTDOWN, TAG_REBOOT, 0, 0, 0, 0, 0 }}; // @@ -83,7 +84,7 @@ static VOID AboutrEFInd(VOID) { if (AboutMenu.EntryCount == 0) { AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT); - AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.2.4"); + AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.2.7.1"); AddMenuInfoLine(&AboutMenu, L""); AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer"); AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012 Roderick W. Smith"); @@ -115,7 +116,8 @@ static VOID AboutrEFInd(VOID) static EFI_STATUS StartEFIImageList(IN EFI_DEVICE_PATH **DevicePaths, IN CHAR16 *LoadOptions, IN CHAR16 *LoadOptionsPrefix, IN CHAR16 *ImageTitle, - OUT UINTN *ErrorInStep) + OUT UINTN *ErrorInStep, + IN BOOLEAN Verbose) { EFI_STATUS Status, ReturnStatus; EFI_HANDLE ChildImageHandle; @@ -124,7 +126,8 @@ static EFI_STATUS StartEFIImageList(IN EFI_DEVICE_PATH **DevicePaths, CHAR16 ErrorInfo[256]; CHAR16 *FullLoadOptions = NULL; - Print(L"Starting %s\n", ImageTitle); + if (Verbose) + Print(L"Starting %s\n", ImageTitle); if (ErrorInStep != NULL) *ErrorInStep = 0; @@ -160,7 +163,8 @@ static EFI_STATUS StartEFIImageList(IN EFI_DEVICE_PATH **DevicePaths, // NOTE: We also include the terminating null in the length for safety. ChildLoadedImage->LoadOptions = (VOID *)LoadOptions; ChildLoadedImage->LoadOptionsSize = ((UINT32)StrLen(LoadOptions) + 1) * sizeof(CHAR16); - Print(L"Using load options '%s'\n", LoadOptions); + if (Verbose) + Print(L"Using load options '%s'\n", LoadOptions); } // close open file handles @@ -175,7 +179,7 @@ static EFI_STATUS StartEFIImageList(IN EFI_DEVICE_PATH **DevicePaths, if (ErrorInStep != NULL) *ErrorInStep = 3; } - + // re-open file handles ReinitRefitLib(); @@ -191,13 +195,14 @@ bailout: static EFI_STATUS StartEFIImage(IN EFI_DEVICE_PATH *DevicePath, IN CHAR16 *LoadOptions, IN CHAR16 *LoadOptionsPrefix, IN CHAR16 *ImageTitle, - OUT UINTN *ErrorInStep) + OUT UINTN *ErrorInStep, + IN BOOLEAN Verbose) { EFI_DEVICE_PATH *DevicePaths[2]; - + DevicePaths[0] = DevicePath; DevicePaths[1] = NULL; - return StartEFIImageList(DevicePaths, LoadOptions, LoadOptionsPrefix, ImageTitle, ErrorInStep); + return StartEFIImageList(DevicePaths, LoadOptions, LoadOptionsPrefix, ImageTitle, ErrorInStep, Verbose); } /* static EFI_STATUS StartEFIImage() */ // @@ -210,7 +215,7 @@ static VOID StartLoader(IN LOADER_ENTRY *Entry) BeginExternalScreen(Entry->UseGraphicsMode, L"Booting OS"); StartEFIImage(Entry->DevicePath, Entry->LoadOptions, - Basename(Entry->LoaderPath), Basename(Entry->LoaderPath), &ErrorInStep); + Basename(Entry->LoaderPath), Basename(Entry->LoaderPath), &ErrorInStep, TRUE); FinishExternalScreen(); } @@ -234,15 +239,25 @@ static CHAR16 * FindInitrd(IN CHAR16 *LoaderPath, IN REFIT_VOLUME *Volume) { KernelVersion = FindNumbers(FileName); Path = FindPath(LoaderPath); + // Add trailing backslash for root directory; necessary on some systems, but must + // NOT be added to all directories, since on other systems, a trailing backslash on + // anything but the root directory causes them to flake out! + if (StrLen(Path) == 0) { + MergeStrings(&Path, L"\\", 0); + } // if DirIterOpen(Volume->RootDir, Path, &DirIter); + // Now add a trailing backslash if it was NOT added earlier, for consistency in + // building the InitrdName later.... + if ((StrLen(Path) > 0) && (Path[StrLen(Path) - 1] != L'\\')) + MergeStrings(&Path, L"\\", 0); while ((DirIterNext(&DirIter, 2, L"init*", &DirEntry)) && (InitrdName == NULL)) { InitrdVersion = FindNumbers(DirEntry->FileName); if (KernelVersion != NULL) { if (StriCmp(InitrdVersion, KernelVersion) == 0) - InitrdName = PoolPrint(L"%s\\%s", Path, DirEntry->FileName); + InitrdName = PoolPrint(L"%s%s", Path, DirEntry->FileName); } else { if (InitrdVersion == NULL) - InitrdName = PoolPrint(L"%s\\%s", Path, DirEntry->FileName); + InitrdName = PoolPrint(L"%s%s", Path, DirEntry->FileName); } // if/else if (InitrdVersion != NULL) FreePool(InitrdVersion); @@ -340,7 +355,7 @@ VOID GenerateSubScreen(LOADER_ENTRY *Entry, IN REFIT_VOLUME *Volume) { Entry->Title = NULL; } SubScreen = InitializeSubScreen(Entry); - + // loader-specific submenu entries if (Entry->OSType == 'M') { // entries for Mac OS X #if defined(EFIX64) @@ -367,7 +382,7 @@ VOID GenerateSubScreen(LOADER_ENTRY *Entry, IN REFIT_VOLUME *Volume) { SubEntry->LoadOptions = L"-v"; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); } // if - + #if defined(EFIX64) SubEntry = InitializeLoaderEntry(Entry); if (SubEntry != NULL) { @@ -385,7 +400,7 @@ VOID GenerateSubScreen(LOADER_ENTRY *Entry, IN REFIT_VOLUME *Volume) { AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); } #endif - + SubEntry = InitializeLoaderEntry(Entry); if (SubEntry != NULL) { SubEntry->me.Title = L"Boot Mac OS X in single user mode"; @@ -467,7 +482,7 @@ VOID GenerateSubScreen(LOADER_ENTRY *Entry, IN REFIT_VOLUME *Volume) { AddMenuInfoLine(SubScreen, L"NOTE: This is an example. Entries"); AddMenuInfoLine(SubScreen, L"marked with (*) may not work."); - + } else if (Entry->OSType == 'X') { // entries for xom.efi // by default, skip the built-in selection and boot from hard disk only Entry->LoadOptions = L"-s -h"; @@ -521,18 +536,21 @@ static CHAR16 * GetMainLinuxOptions(IN CHAR16 * LoaderPath, IN REFIT_VOLUME *Vol // that will (with luck) work fairly automatically. VOID SetLoaderDefaults(LOADER_ENTRY *Entry, CHAR16 *LoaderPath, IN REFIT_VOLUME *Volume) { CHAR16 IconFileName[256]; - CHAR16 *FileName, *OSIconName = NULL, *Temp; + CHAR16 *FileName, *PathOnly, *OSIconName = NULL, *Temp; CHAR16 ShortcutLetter = 0; FileName = Basename(LoaderPath); - + PathOnly = FindPath(LoaderPath); + // locate a custom icon for the loader StrCpy(IconFileName, LoaderPath); ReplaceExtension(IconFileName, L".icns"); if (FileExists(Volume->RootDir, IconFileName)) { Entry->me.Image = LoadIcns(Volume->RootDir, IconFileName, 128); - } // if - + } else if ((StrLen(PathOnly) == 0) && (Volume->VolIconImage != NULL)) { + Entry->me.Image = Volume->VolIconImage; + } // icon matched to loader or volume + Temp = FindLastDirName(LoaderPath); MergeStrings(&OSIconName, Temp, L','); FreePool(Temp); @@ -552,6 +570,9 @@ VOID SetLoaderDefaults(LOADER_ENTRY *Entry, CHAR16 *LoaderPath, IN REFIT_VOLUME Entry->OSType = 'R'; ShortcutLetter = 'R'; } else if (StriCmp(LoaderPath, MACOSX_LOADER_PATH) == 0) { + if (Volume->VolIconImage != NULL) { // custom icon file found + Entry->me.Image = Volume->VolIconImage; + } MergeStrings(&OSIconName, L"mac", L','); Entry->UseGraphicsMode = TRUE; Entry->OSType = 'M'; @@ -581,13 +602,16 @@ VOID SetLoaderDefaults(LOADER_ENTRY *Entry, CHAR16 *LoaderPath, IN REFIT_VOLUME Entry->me.ShortcutLetter = ShortcutLetter; if (Entry->me.Image == NULL) Entry->me.Image = LoadOSIcon(OSIconName, L"unknown", FALSE); + if (PathOnly != NULL) + FreePool(PathOnly); } // VOID SetLoaderDefaults() - + // 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; + CleanUpPathNameSlashes(LoaderPath); Entry = InitializeLoaderEntry(NULL); if (Entry != NULL) { Entry->Title = StrDuplicate(LoaderTitle); @@ -601,7 +625,7 @@ LOADER_ENTRY * AddLoaderEntry(IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle, IN GenerateSubScreen(Entry, Volume); AddMenuEntry(&MainMenu, (REFIT_MENU_ENTRY *)Entry); } - + return(Entry); } // LOADER_ENTRY * AddLoaderEntry() @@ -612,12 +636,18 @@ static VOID ScanLoaderDir(IN REFIT_VOLUME *Volume, IN CHAR16 *Path) EFI_STATUS Status; REFIT_DIR_ITER DirIter; EFI_FILE_INFO *DirEntry; - CHAR16 FileName[256]; + CHAR16 FileName[256], *SelfPath; + UINTN i = 0; - // Note: SelfDirPath includes a leading backslash ('\'), but Path - // doesn't, so we rejigger the string to compensate.... - if (!SelfDirPath || !Path || ((StriCmp(Path, &SelfDirPath[1]) == 0) && Volume != SelfVolume) || - (StriCmp(Path, &SelfDirPath[1]) != 0)) { + // Skip past leading slashes, which are sometimes (but not always) included + // in SelfDirPath, to get a path that's known to never include this feature. + while ((SelfDirPath != NULL) && (SelfDirPath[i] == L'\\')) { + i++; + } + SelfPath = &SelfDirPath[i]; // NOTE: *DO NOT* call FreePool() on SelfPath!!! + + if (!SelfPath || !Path || ((StriCmp(Path, SelfPath) == 0) && Volume != SelfVolume) || + (StriCmp(Path, SelfPath) != 0)) { // look through contents of the directory DirIterOpen(Volume->RootDir, Path, &DirIter); while (DirIterNext(&DirIter, 2, L"*.efi", &DirEntry)) { @@ -649,7 +679,8 @@ static VOID ScanEfiFiles(REFIT_VOLUME *Volume) { EFI_STATUS Status; REFIT_DIR_ITER EfiDirIter; EFI_FILE_INFO *EfiDirEntry; - CHAR16 FileName[256]; + CHAR16 FileName[256], *Directory; + UINTN i, Length; if ((Volume->RootDir != NULL) && (Volume->VolName != NULL)) { // check for Mac OS X boot loader @@ -672,10 +703,6 @@ static VOID ScanEfiFiles(REFIT_VOLUME *Volume) { // scan the root directory for EFI executables ScanLoaderDir(Volume, NULL); - // scan the elilo directory (as used on gimli's first Live CD) - ScanLoaderDir(Volume, L"elilo"); - // scan the boot directory - ScanLoaderDir(Volume, L"boot"); // scan subdirectories of the EFI directory (as per the standard) DirIterOpen(Volume->RootDir, L"EFI", &EfiDirIter); @@ -688,6 +715,20 @@ static VOID ScanEfiFiles(REFIT_VOLUME *Volume) { Status = DirIterClose(&EfiDirIter); if (Status != EFI_NOT_FOUND) CheckError(Status, L"while scanning the EFI directory"); + + // Scan user-specified (or additional default) directories.... + i = 0; + while ((Directory = FindCommaDelimited(GlobalConfig.AlsoScan, i++)) != NULL) { + Length = StrLen(Directory); + // Some EFI implementations won't read a directory if the path ends in + // a backslash, so eliminate this character, if it's present.... + while ((Length > 0) && (Directory[Length - 1] == L'\\')) { + Directory[--Length] = 0; + } // while + if (Length > 0) + ScanLoaderDir(Volume, Directory); + FreePool(Directory); + } // while } // if } // static VOID ScanEfiFiles() @@ -819,7 +860,7 @@ static EFI_STATUS ActivateMbrPartition(IN EFI_BLOCK_IO *BlockIO, IN UINTN Partit if (PartitionIndex < LogicalPartitionIndex) break; // stop the loop, no need to touch further EMBRs } - + } return EFI_SUCCESS; @@ -903,7 +944,7 @@ static VOID StartLegacy(IN LEGACY_ENTRY *Entry) ExtractLegacyLoaderPaths(DiscoveredPathList, MAX_DISCOVERED_PATHS, LegacyLoaderList); - Status = StartEFIImageList(DiscoveredPathList, Entry->LoadOptions, NULL, L"legacy loader", &ErrorInStep); + Status = StartEFIImageList(DiscoveredPathList, Entry->LoadOptions, NULL, L"legacy loader", &ErrorInStep, TRUE); if (Status == EFI_NOT_FOUND) { if (ErrorInStep == 1) { Print(L"\nPlease make sure that you have the latest firmware update installed.\n"); @@ -960,7 +1001,7 @@ static LEGACY_ENTRY * AddLegacyEntry(IN CHAR16 *LoaderTitle, IN REFIT_VOLUME *Vo SubEntry->Volume = Entry->Volume; SubEntry->LoadOptions = Entry->LoadOptions; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); - + AddMenuEntry(SubScreen, &MenuEntryReturn); Entry->me.SubScreen = SubScreen; AddMenuEntry(&MainMenu, (REFIT_MENU_ENTRY *)Entry); @@ -1047,7 +1088,7 @@ static VOID StartTool(IN LOADER_ENTRY *Entry) { BeginExternalScreen(Entry->UseGraphicsMode, Entry->me.Title + 6); // assumes "Start " as assigned below StartEFIImage(Entry->DevicePath, Entry->LoadOptions, Basename(Entry->LoaderPath), - Basename(Entry->LoaderPath), NULL); + Basename(Entry->LoaderPath), NULL, TRUE); FinishExternalScreen(); } /* static VOID StartTool() */ @@ -1071,70 +1112,55 @@ static LOADER_ENTRY * AddToolEntry(IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle return Entry; } /* static LOADER_ENTRY * AddToolEntry() */ -#ifdef DEBIAN_ENABLE_EFI110 // // pre-boot driver functions // -static VOID ScanDriverDir(IN CHAR16 *Path) +static UINTN ScanDriverDir(IN CHAR16 *Path) { EFI_STATUS Status; REFIT_DIR_ITER DirIter; + UINTN NumFound = 0; EFI_FILE_INFO *DirEntry; CHAR16 FileName[256]; - + // look through contents of the directory DirIterOpen(SelfRootDir, Path, &DirIter); - while (DirIterNext(&DirIter, 2, L"*.EFI", &DirEntry)) { + while (DirIterNext(&DirIter, 2, L"*.efi", &DirEntry)) { if (DirEntry->FileName[0] == '.') continue; // skip this - + SPrint(FileName, 255, L"%s\\%s", Path, DirEntry->FileName); + NumFound++; Status = StartEFIImage(FileDevicePath(SelfLoadedImage->DeviceHandle, FileName), - L"", DirEntry->FileName, DirEntry->FileName, NULL); + L"", DirEntry->FileName, DirEntry->FileName, NULL, FALSE); } Status = DirIterClose(&DirIter); if (Status != EFI_NOT_FOUND) { SPrint(FileName, 255, L"while scanning the %s directory", Path); CheckError(Status, FileName); } + return (NumFound); } -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) { - EFI_STATUS Status; - UINTN AllHandleCount; - EFI_HANDLE *AllHandleBuffer; - UINTN Index; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - UINT32 *HandleType; - UINTN HandleIndex; - BOOLEAN Parent; - BOOLEAN Device; - + EFI_STATUS Status; + UINTN AllHandleCount; + EFI_HANDLE *AllHandleBuffer; + UINTN Index; + UINTN HandleCount; + EFI_HANDLE *HandleBuffer; + UINT32 *HandleType; + UINTN HandleIndex; + BOOLEAN Parent; + BOOLEAN Device; + + // GNU EFI's EFI_BOOT_SERVICES data structure is truncated, but all the + // items are in memory, so point a more complete data structure to it + // so that we can use items not in GNU EFI's implementation.... +// gBS = (MY_BOOT_SERVICES*) BS; + Status = LibLocateHandle(AllHandles, NULL, NULL, @@ -1142,7 +1168,7 @@ static EFI_STATUS ConnectAllDriversToAllControllers(VOID) &AllHandleBuffer); if (EFI_ERROR(Status)) return Status; - + for (Index = 0; Index < AllHandleCount; Index++) { // // Scan the handle database @@ -1156,55 +1182,68 @@ static EFI_STATUS ConnectAllDriversToAllControllers(VOID) &HandleType); if (EFI_ERROR (Status)) goto Done; - + Device = TRUE; if (HandleType[Index] & EFI_HANDLE_TYPE_DRIVER_BINDING_HANDLE) Device = FALSE; if (HandleType[Index] & EFI_HANDLE_TYPE_IMAGE_HANDLE) Device = FALSE; - + if (Device) { Parent = FALSE; for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) { if (HandleType[HandleIndex] & EFI_HANDLE_TYPE_PARENT_HANDLE) Parent = TRUE; - } - + } // for + if (!Parent) { if (HandleType[Index] & EFI_HANDLE_TYPE_DEVICE_HANDLE) { - Status = refit_call4_wrapper(BS->ConnectController, - AllHandleBuffer[Index], - NULL, - NULL, - TRUE); + Status = refit_call4_wrapper(BS->ConnectController, + AllHandleBuffer[Index], + NULL, + NULL, + TRUE); } } } - + FreePool (HandleBuffer); FreePool (HandleType); } - + Done: FreePool (AllHandleBuffer); return Status; -} +} /* EFI_STATUS ConnectAllDriversToAllControllers() */ static VOID LoadDrivers(VOID) { - CHAR16 DirName[256]; - - // load drivers from /efi/refind/drivers - SPrint(DirName, 255, L"%s\\drivers", SelfDirPath); - ScanDriverDir(DirName); - - // load drivers from /efi/tools/drivers - ScanDriverDir(L"\\efi\\tools\\drivers"); + CHAR16 *Directory; + UINTN i = 0, Length, NumFound = 0; + + // load drivers from the "drivers" subdirectory of rEFInd's home directory + Directory = StrDuplicate(SelfDirPath); + MergeStrings(&Directory, L"drivers", L'\\'); +// SPrint(DirName, 255, L"%s\\drivers", SelfDirPath); + NumFound += ScanDriverDir(Directory); + + // Scan additional user-specified driver directories.... + while ((Directory = FindCommaDelimited(GlobalConfig.DriverDirs, i++)) != NULL) { + Length = StrLen(Directory); + // Some EFI implementations won't read a directory if the path ends in + // a backslash, so eliminate this character, if it's present.... + while ((Length > 0) && (Directory[Length - 1] == L'\\')) { + Directory[--Length] = 0; + } // while + if (Length > 0) + NumFound += ScanDriverDir(Directory); + FreePool(Directory); + } // while // connect all devices - ConnectAllDriversToAllControllers(); + if (NumFound > 0) + ConnectAllDriversToAllControllers(); } -#endif /* DEBIAN_ENABLE_EFI110 */ static VOID ScanForBootloaders(VOID) { UINTN i; @@ -1253,7 +1292,7 @@ static VOID ScanForBootloaders(VOID) { // assign shortcut keys for (i = 0; i < MainMenu.EntryCount && MainMenu.Entries[i]->Row == 0 && i < 9; i++) MainMenu.Entries[i]->ShortcutDigit = (CHAR16)('1' + i); - + // wait for user ACK when there were errors FinishTextScreen(FALSE); } // static VOID ScanForBootloaders() @@ -1334,15 +1373,13 @@ efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) // further bootstrap (now with config available) SetupScreen(); -#ifdef DEBIAN_ENABLE_EFI110 LoadDrivers(); -#endif /* DEBIAN_ENABLE_EFI110 */ ScanForBootloaders(); ScanForTools(); while (MainLoopRunning) { MenuExit = RunMainMenu(&MainMenu, GlobalConfig.DefaultSelection, &ChosenEntry); - + // We don't allow exiting the main menu with the Escape key. if (MenuExit == MENU_EXIT_ESCAPE) { // Commented-out below: Was part of an attempt to get rEFInd to @@ -1353,7 +1390,7 @@ efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) // SetupScreen(); continue; } - + switch (ChosenEntry->Tag) { case TAG_REBOOT: // Reboot @@ -1361,25 +1398,25 @@ efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) refit_call4_wrapper(RT->ResetSystem, EfiResetCold, EFI_SUCCESS, 0, NULL); MainLoopRunning = FALSE; // just in case we get this far break; - + case TAG_SHUTDOWN: // Shut Down TerminateScreen(); refit_call4_wrapper(RT->ResetSystem, EfiResetShutdown, EFI_SUCCESS, 0, NULL); MainLoopRunning = FALSE; // just in case we get this far break; - + case TAG_ABOUT: // About rEFInd AboutrEFInd(); break; - + case TAG_LOADER: // Boot OS via .EFI loader StartLoader((LOADER_ENTRY *)ChosenEntry); break; - + case TAG_LEGACY: // Boot legacy OS StartLegacy((LEGACY_ENTRY *)ChosenEntry); break; - + case TAG_TOOL: // Start a EFI tool StartTool((LOADER_ENTRY *)ChosenEntry); break; @@ -1388,7 +1425,7 @@ efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) BeginTextScreen(L" "); return EFI_SUCCESS; break; - + } } @@ -1396,6 +1433,6 @@ efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) // fails, go into an endless loop. refit_call4_wrapper(RT->ResetSystem, EfiResetCold, EFI_SUCCESS, 0, NULL); EndlessIdleLoop(); - + return EFI_SUCCESS; } /* efi_main() */