]> code.delx.au - refind/blobdiff - refind/main.c
Misc. small changes.
[refind] / refind / main.c
index 1169be56d1b84d41e2b066044e3363a0ca220cb3..250ff1ba63dba933fc6a1134b4bf6019c93adfba 100644 (file)
@@ -147,7 +147,7 @@ static VOID AboutrEFInd(VOID)
 
     if (AboutMenu.EntryCount == 0) {
         AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
-        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.6.12.1");
+        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.7.1.2");
         AddMenuInfoLine(&AboutMenu, L"");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012-2013 Roderick W. Smith");
@@ -377,7 +377,6 @@ static EFI_STATUS RebootIntoFirmware(VOID) {
    refit_call4_wrapper(RT->ResetSystem, EfiResetCold, EFI_SUCCESS, 0, NULL);
    Print(L"Error calling ResetSystem: %r", err);
    PauseForKey();
-//   uefi_call_wrapper(BS->Stall, 1, 3 * 1000 * 1000);
    return err;
 }
 
@@ -926,7 +925,8 @@ VOID SetLoaderDefaults(LOADER_ENTRY *Entry, CHAR16 *LoaderPath, REFIT_VOLUME *Vo
       Entry->UseGraphicsMode = GlobalConfig.GraphicsFor & GRAPHICS_FOR_GRUB;
    } else if (StriCmp(FileName, L"cdboot.efi") == 0 ||
               StriCmp(FileName, L"bootmgr.efi") == 0 ||
-              StriCmp(FileName, L"bootmgfw.efi") == 0) {
+              StriCmp(FileName, L"bootmgfw.efi") == 0 ||
+              StriCmp(FileName, L"bkpbootmgfw.efi") == 0) {
       MergeStrings(&OSIconName, L"win", L',');
       Entry->OSType = 'W';
       ShortcutLetter = 'W';
@@ -1038,7 +1038,7 @@ static VOID CleanUpLoaderList(struct LOADER_LIST *LoaderList) {
 // Returns TRUE if none of these conditions is met -- that is, if the path is
 // eligible for scanning.
 static BOOLEAN ShouldScan(REFIT_VOLUME *Volume, CHAR16 *Path) {
-   CHAR16   *VolName = NULL, *DontScanDir;
+   CHAR16   *VolName = NULL, *DontScanDir, *PathCopy = NULL;
    UINTN    i = 0, VolNum;
    BOOLEAN  ScanIt = TRUE;
 
@@ -1048,6 +1048,25 @@ static BOOLEAN ShouldScan(REFIT_VOLUME *Volume, CHAR16 *Path) {
    if ((StriCmp(Path, SelfDirPath) == 0) && (Volume->DeviceHandle == SelfVolume->DeviceHandle))
       return FALSE;
 
+   // See if Path includes an explicit volume declaration that's NOT Volume....
+   PathCopy = StrDuplicate(Path);
+   if (SplitVolumeAndFilename(&PathCopy, &VolName)) {
+      if (StriCmp(VolName, Volume->VolName) != 0) {
+         if ((StrLen(VolName) > 2) && (VolName[0] == L'f') && (VolName[1] == L's') && (VolName[2] >= L'0') && (VolName[2] <= L'9')) {
+            VolNum = Atoi(VolName + 2);
+            if (VolNum != Volume->VolNumber) {
+               ScanIt = FALSE;
+            }
+         } else {
+            ScanIt = FALSE;
+         }
+      } // if
+   } // if Path includes volume specification
+   MyFreePool(PathCopy);
+   MyFreePool(VolName);
+   VolName = NULL;
+
+   // See if Volume is in GlobalConfig.DontScanDirs....
    while ((DontScanDir = FindCommaDelimited(GlobalConfig.DontScanDirs, i++)) && ScanIt) {
       SplitVolumeAndFilename(&DontScanDir, &VolName);
       CleanUpPathNameSlashes(DontScanDir);
@@ -1064,8 +1083,10 @@ static BOOLEAN ShouldScan(REFIT_VOLUME *Volume, CHAR16 *Path) {
             ScanIt = FALSE;
       }
       MyFreePool(DontScanDir);
+      MyFreePool(VolName);
       DontScanDir = NULL;
-   }
+   } // while()
+
    return ScanIt;
 } // BOOLEAN ShouldScan()
 
@@ -1228,9 +1249,7 @@ static BOOLEAN ScanLoaderDir(IN REFIT_VOLUME *Volume, IN CHAR16 *Path, IN CHAR16
              SPrint(FileName, 255, L"\\%s", DirEntry->FileName);
           CleanUpPathNameSlashes(FileName);
 
-          if( /* (!StriSubCmp(L"vmlinuz", DirEntry->FileName) ||
-              !StriSubCmp(L"bzImage", DirEntry->FileName)) && */
-              !IsValidLoader(Volume, FileName))
+          if(!IsValidLoader(Volume, FileName))
              continue;
 
           NewLoader = AllocateZeroPool(sizeof(struct LOADER_LIST));
@@ -1275,6 +1294,7 @@ static VOID ScanEfiFiles(REFIT_VOLUME *Volume) {
    CHAR16                  FileName[256], *Directory, *MatchPatterns, *VolName = NULL, *SelfPath;
    UINTN                   i, Length;
    BOOLEAN                 ScanFallbackLoader = TRUE;
+   BOOLEAN                 FoundBRBackup = FALSE;
 
    MatchPatterns = StrDuplicate(LOADER_MATCH_PATTERNS);
    if (GlobalConfig.ScanAllLinux)
@@ -1300,13 +1320,24 @@ static VOID ScanEfiFiles(REFIT_VOLUME *Volume) {
       } // if should scan Mac directory
 
       // check for Microsoft boot loader/menu
-      StrCpy(FileName, L"EFI\\Microsoft\\Boot\\bootmgfw.efi");
-      if (FileExists(Volume->RootDir, FileName) && ShouldScan(Volume, L"EFI\\Microsoft\\Boot") &&
-          !IsIn(L"bootmgfw.efi", GlobalConfig.DontScanFiles)) {
-         AddLoaderEntry(FileName, L"Microsoft EFI boot", Volume);
-         if (DuplicatesFallback(Volume, FileName))
-            ScanFallbackLoader = FALSE;
-      }
+      if (ShouldScan(Volume, L"EFI\\Microsoft\\Boot")) {
+         StrCpy(FileName, L"EFI\\Microsoft\\Boot\\bkpbootmgfw.efi");
+         if (FileExists(Volume->RootDir, FileName) &&  !IsIn(L"bkpbootmgfw.efi", GlobalConfig.DontScanFiles)) {
+            AddLoaderEntry(FileName, L"Microsoft EFI boot (Boot Repair backup)", Volume);
+            FoundBRBackup = TRUE;
+            if (DuplicatesFallback(Volume, FileName))
+               ScanFallbackLoader = FALSE;
+         }
+         StrCpy(FileName, L"EFI\\Microsoft\\Boot\\bootmgfw.efi");
+         if (FileExists(Volume->RootDir, FileName) &&  !IsIn(L"bootmgfw.efi", GlobalConfig.DontScanFiles)) {
+            if (FoundBRBackup)
+               AddLoaderEntry(FileName, L"Supposed Microsoft EFI boot (probably GRUB)", Volume);
+            else
+               AddLoaderEntry(FileName, L"Microsoft EFI boot", Volume);
+            if (DuplicatesFallback(Volume, FileName))
+               ScanFallbackLoader = FALSE;
+         }
+      } // if
 
       // scan the root directory for EFI executables
       if (ScanLoaderDir(Volume, L"\\", MatchPatterns))
@@ -1328,11 +1359,13 @@ static VOID ScanEfiFiles(REFIT_VOLUME *Volume) {
       // Scan user-specified (or additional default) directories....
       i = 0;
       while ((Directory = FindCommaDelimited(GlobalConfig.AlsoScan, i++)) != NULL) {
-         SplitVolumeAndFilename(&Directory, &VolName);
-         CleanUpPathNameSlashes(Directory);
-         Length = StrLen(Directory);
-         if ((Length > 0) && ScanLoaderDir(Volume, Directory, MatchPatterns))
-            ScanFallbackLoader = FALSE;
+         if (ShouldScan(Volume, Directory)) {
+            SplitVolumeAndFilename(&Directory, &VolName);
+            CleanUpPathNameSlashes(Directory);
+            Length = StrLen(Directory);
+            if ((Length > 0) && ScanLoaderDir(Volume, Directory, MatchPatterns))
+               ScanFallbackLoader = FALSE;
+         } // if
          MyFreePool(Directory);
          MyFreePool(VolName);
       } // while
@@ -2101,7 +2134,7 @@ static VOID WarnIfLegacyProblems() {
 
 // Locates boot loaders. NOTE: This assumes that GlobalConfig.LegacyType is set correctly.
 static VOID ScanForBootloaders(VOID) {
-   UINTN                     i;
+   UINTN  i;
 
    ScanVolumes();
 
@@ -2342,8 +2375,8 @@ efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
     FindLegacyBootType();
     if (GlobalConfig.LegacyType == LEGACY_TYPE_MAC)
        CopyMem(GlobalConfig.ScanFor, "ihebocm   ", NUM_SCAN_OPTIONS);
-    ScanVolumes();
     ReadConfig(CONFIG_FILE_NAME);
+    ScanVolumes();
 
     InitScreen();
     WarnIfLegacyProblems();