]> code.delx.au - refind/blobdiff - refind/main.c
Added "windows_recovery" option to "showtools" token and
[refind] / refind / main.c
index be3dca4a0b7a5789ef2ef97f17b40c325896e649..30895bb6d8280b6697b0d456231bde2cce3c26fe 100644 (file)
@@ -56,7 +56,9 @@
 #include "../include/syslinux_mbr.h"
 
 #ifdef __MAKEWITH_GNUEFI
+#ifndef EFI_SECURITY_VIOLATION
 #define EFI_SECURITY_VIOLATION    EFIERR (26)
+#endif
 #else
 #include "../EfiLib/BdsHelper.h"
 #include "../EfiLib/legacy.h"
@@ -130,9 +132,9 @@ static REFIT_MENU_SCREEN MainMenu       = { L"Main Menu", NULL, 0, NULL, 0, NULL
 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, 0, 0, 0, DONT_CHANGE_TEXT_MODE, 20, 0, 0, GRAPHICS_FOR_OSX, LEGACY_TYPE_MAC, 0, 0,
-                              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                              { TAG_SHELL, TAG_MEMTEST, TAG_APPLE_RECOVERY, TAG_MOK_TOOL, TAG_ABOUT, TAG_SHUTDOWN,
-                                TAG_REBOOT, TAG_FIRMWARE, 0, 0, 0, 0, 0, 0 }
+                              NULL, NULL, CONFIG_FILE_NAME, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                              { TAG_SHELL, TAG_MEMTEST, TAG_APPLE_RECOVERY, TAG_WINDOWS_RECOVERY, TAG_MOK_TOOL, TAG_ABOUT,
+                                TAG_SHUTDOWN, TAG_REBOOT, TAG_FIRMWARE, 0, 0, 0, 0, 0, 0 }
                             };
 
 EFI_GUID GlobalGuid = EFI_GLOBAL_VARIABLE;
@@ -153,7 +155,7 @@ static VOID AboutrEFInd(VOID)
 {
     if (AboutMenu.EntryCount == 0) {
         AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
-        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.7.6.1");
+        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.7.6.2");
         AddMenuInfoLine(&AboutMenu, L"");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012-2013 Roderick W. Smith");
@@ -930,7 +932,7 @@ VOID SetLoaderDefaults(LOADER_ENTRY *Entry, CHAR16 *LoaderPath, REFIT_VOLUME *Vo
    } // if
 
    // detect specific loaders
-   if (StriSubCmp(L"bzImage", LoaderPath) || StriSubCmp(L"vmlinuz", LoaderPath)) {
+   if (StriSubCmp(L"bzImage", FileName) || StriSubCmp(L"vmlinuz", FileName)) {
       GuessLinuxDistribution(&OSIconName, Volume, LoaderPath);
       MergeStrings(&OSIconName, L"linux", L',');
       Entry->OSType = 'L';
@@ -2184,7 +2186,7 @@ static VOID ScanForBootloaders(VOID) {
             ScanLegacyExternal();
             break;
          case 'm': case 'M':
-            ScanUserConfigured(CONFIG_FILE_NAME);
+            ScanUserConfigured(GlobalConfig.ConfigFilename);
             break;
          case 'e': case 'E':
             ScanExternal();
@@ -2233,7 +2235,7 @@ static VOID FindTool(CHAR16 *Locations, CHAR16 *Names, CHAR16 *Description, UINT
 // Add the second-row tags containing built-in and external tools (EFI shell,
 // reboot, etc.)
 static VOID ScanForTools(VOID) {
-   CHAR16 *FileName = NULL, *MokLocations, Description[256];
+   CHAR16 *FileName = NULL, *VolName = NULL, *MokLocations, Description[256];
    REFIT_MENU_ENTRY *TempMenuEntry;
    UINTN i, j, VolumeIndex;
    UINT64 osind;
@@ -2311,12 +2313,31 @@ static VOID ScanForTools(VOID) {
                   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);
-               }
+               } // if
             } // for
             MyFreePool(FileName);
             FileName = NULL;
             break;
 
+         case TAG_WINDOWS_RECOVERY:
+            j = 0;
+            while ((FileName = FindCommaDelimited(GlobalConfig.WindowsRecoveryFiles, j++)) != NULL) {
+               SplitVolumeAndFilename(&FileName, &VolName);
+               for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) {
+                  if ((Volumes[VolumeIndex]->RootDir != NULL) && (FileExists(Volumes[VolumeIndex]->RootDir, FileName)) &&
+                      ((VolName == NULL) || (StriCmp(VolName, Volumes[VolumeIndex]->VolName) == 0))) {
+                     SPrint(Description, 255, L"Microsoft Recovery on %s", Volumes[VolumeIndex]->VolName);
+                     AddToolEntry(Volumes[VolumeIndex]->DeviceHandle, FileName, Description,
+                                  BuiltinIcon(BUILTIN_ICON_TOOL_WINDOWS_RESCUE), 'R', TRUE);
+                  } // if
+               } // for
+            } // while
+            MyFreePool(FileName);
+            FileName = NULL;
+            MyFreePool(VolName);
+            VolName = NULL;
+            break;
+
          case TAG_MOK_TOOL:
             FindTool(MokLocations, MOK_NAMES, L"MOK utility utility", BUILTIN_ICON_TOOL_MOK_TOOL);
             break;
@@ -2341,7 +2362,7 @@ VOID RescanAll(VOID) {
    FreeList((VOID ***) &(MainMenu.Entries), &MainMenu.EntryCount);
    MainMenu.Entries = NULL;
    MainMenu.EntryCount = 0;
-   ReadConfig(CONFIG_FILE_NAME);
+   ReadConfig(GlobalConfig.ConfigFilename);
    ConnectAllDriversToAllControllers();
    ScanVolumes();
    ScanForBootloaders();
@@ -2401,6 +2422,37 @@ static BOOLEAN SecureBootUninstall(VOID) {
    return Success;
 } // VOID SecureBootUninstall
 
+// Sets the global configuration filename; will be CONFIG_FILE_NAME unless the
+// "-c" command-line option is set, in which case that takes precedence.
+// If an error is encountered, leaves the value alone (it should be set to
+// CONFIG_FILE_NAME when GlobalConfig is initialized).
+static VOID SetConfigFilename(EFI_HANDLE ImageHandle) {
+   EFI_LOADED_IMAGE *Info;
+   CHAR16 *Options, *FileName;
+   EFI_STATUS Status;
+   INTN Where;
+
+   Status = uefi_call_wrapper(BS->HandleProtocol, 3, ImageHandle,
+                              &LoadedImageProtocol, (VOID **) &Info);
+   if ((Status == EFI_SUCCESS) && (Info->LoadOptionsSize > 0)) {
+      Options = (CHAR16 *) Info->LoadOptions;
+      Where = FindSubString(L" -c ", Options);
+      if (Where >= 0) {
+         FileName = StrDuplicate(&Options[Where + 4]);
+         Where = FindSubString(L" ", FileName);
+         if (Where > 0)
+            FileName[Where] = L'\0';
+
+         if (FileExists(SelfDir, FileName)) {
+            GlobalConfig.ConfigFilename = FileName;
+         } else {
+            Print(L"Specified configuration file (%s) doesn't exist; using\n'refind.conf' default\n", FileName);
+            MyFreePool(FileName);
+         } // if/else
+      } // if
+   } // if
+} // VOID SetConfigFilename()
+
 //
 // main entry point
 //
@@ -2427,7 +2479,8 @@ efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
     FindLegacyBootType();
     if (GlobalConfig.LegacyType == LEGACY_TYPE_MAC)
        CopyMem(GlobalConfig.ScanFor, "ihebocm   ", NUM_SCAN_OPTIONS);
-    ReadConfig(CONFIG_FILE_NAME);
+    SetConfigFilename(ImageHandle);
+    ReadConfig(GlobalConfig.ConfigFilename);
     ScanVolumes();
 
     InitScreen();