]> code.delx.au - refind/commitdiff
Fixed bug that caused NTFS filesystems and whole disks to be
authorsrs5694 <srs5694@users.sourceforge.net>
Wed, 4 Feb 2015 02:06:47 +0000 (21:06 -0500)
committersrs5694 <srs5694@users.sourceforge.net>
Wed, 4 Feb 2015 02:06:47 +0000 (21:06 -0500)
misidentified as FAT filesystems.

NEWS.txt
refind/global.h
refind/lib.c
refind/main.c

index b6f164ddf2d3890c4d61b0eca8a386dbb4e16933..5d8a5ae8e08594bd7582806863a317bd4776951e 100644 (file)
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -1,6 +1,10 @@
 0.8.6 (?/??/2016):
 ------------------
 
 0.8.6 (?/??/2016):
 ------------------
 
+- Fixed bug that caused misidentification of both whole disks and NTFS
+  volumes as being FAT. (This bug affected the identification of devices
+  and locations in the rEFInd menu, not actual access to devices.)
+
 - Code refactoring to clear out legacy-boot functions from the
   ever-expanding refind/main.c file.
 
 - Code refactoring to clear out legacy-boot functions from the
   ever-expanding refind/main.c file.
 
index 584b108105551a07477ec11256cd7d8c162256e4..8ad30f5f3303ce15d622a4c51576879b65e3ad00 100644 (file)
 // Filesystem type identifiers. Not all are yet used....
 #define FS_TYPE_UNKNOWN        0
 #define FS_TYPE_FAT            1
 // Filesystem type identifiers. Not all are yet used....
 #define FS_TYPE_UNKNOWN        0
 #define FS_TYPE_FAT            1
-#define FS_TYPE_EXT2           2
-#define FS_TYPE_EXT3           3
-#define FS_TYPE_EXT4           4
-#define FS_TYPE_HFSPLUS        5
-#define FS_TYPE_REISERFS       6
-#define FS_TYPE_BTRFS          7
-#define FS_TYPE_ISO9660        8
+#define FS_TYPE_EXFAT          2
+#define FS_TYPE_NTFS           3
+#define FS_TYPE_EXT2           4
+#define FS_TYPE_EXT3           5
+#define FS_TYPE_EXT4           6
+#define FS_TYPE_HFSPLUS        7
+#define FS_TYPE_REISERFS       8
+#define FS_TYPE_BTRFS          9
+#define FS_TYPE_ISO9660        10
 
 // How to scale banner images
 #define BANNER_NOSCALE         0
 
 // How to scale banner images
 #define BANNER_NOSCALE         0
index 60229c4d695130a516ca9619ac876a8b2da9d478..4b7c970d42f6049994ca017d5d692f211064cb65 100644 (file)
@@ -75,6 +75,7 @@ EFI_DEVICE_PATH EndDevicePath[] = {
 #define REISER2FS_SUPER_MAGIC_STRING     "ReIsEr2Fs"
 #define REISER2FS_JR_SUPER_MAGIC_STRING  "ReIsEr3Fs"
 #define BTRFS_SIGNATURE                  "_BHRfS_M"
 #define REISER2FS_SUPER_MAGIC_STRING     "ReIsEr2Fs"
 #define REISER2FS_JR_SUPER_MAGIC_STRING  "ReIsEr3Fs"
 #define BTRFS_SIGNATURE                  "_BHRfS_M"
+#define NTFS_SIGNATURE                   "NTFS    "
 
 // variables
 
 
 // variables
 
@@ -459,6 +460,9 @@ static CHAR16 *FSTypeName(IN UINT32 TypeCode) {
       case FS_TYPE_ISO9660:
          retval = L" ISO-9660";
          break;
       case FS_TYPE_ISO9660:
          retval = L" ISO-9660";
          break;
+      case FS_TYPE_NTFS:
+         retval = L" NTFS";
+         break;
       default:
          retval = L"";
          break;
       default:
          retval = L"";
          break;
@@ -467,15 +471,16 @@ static CHAR16 *FSTypeName(IN UINT32 TypeCode) {
 } // CHAR16 *FSTypeName()
 
 // Identify the filesystem type and record the filesystem's UUID/serial number,
 } // CHAR16 *FSTypeName()
 
 // Identify the filesystem type and record the filesystem's UUID/serial number,
-// if possible. Expects a Buffer containing the first few (normally 4096) bytes
-// of the filesystem. Sets the filesystem type code in Volume->FSType and the
-// UUID/serial number in Volume->VolUuid. Note that the UUID value is recognized
-// differently for each filesystem, and is currently supported only for
-// ext2/3/4fs and ReiserFS. If the UUID can't be determined, it's set to 0. Also, the UUID
-// is just read directly into memory; it is *NOT* valid when displayed by
-// GuidAsString() or used in other GUID/UUID-manipulating functions. (As I
-// write, it's being used merely to detect partitions that are part of a
-// RAID 1 array.)
+// if possible. Expects a Buffer containing the first few (normally at least
+// 4096) bytes of the filesystem. Sets the filesystem type code in Volume->FSType
+// and the UUID/serial number in Volume->VolUuid. Note that the UUID value is
+// recognized differently for each filesystem, and is currently supported only
+// for NTFS, ext2/3/4fs, and ReiserFS (and for NTFS it's really a 64-bit serial
+// number not a UUID or GUID). If the UUID can't be determined, it's set to 0.
+// Also, the UUID is just read directly into memory; it is *NOT* valid when
+// displayed by GuidAsString() or used in other GUID/UUID-manipulating
+// functions. (As I write, it's being used merely to detect partitions that are
+// part of a RAID 1 array.)
 static VOID SetFilesystemData(IN UINT8 *Buffer, IN UINTN BufferSize, IN OUT REFIT_VOLUME *Volume) {
    UINT32       *Ext2Incompat, *Ext2Compat;
    UINT16       *Magic16;
 static VOID SetFilesystemData(IN UINT8 *Buffer, IN UINTN BufferSize, IN OUT REFIT_VOLUME *Volume) {
    UINT32       *Ext2Incompat, *Ext2Compat;
    UINT16       *Magic16;
@@ -488,10 +493,21 @@ static VOID SetFilesystemData(IN UINT8 *Buffer, IN UINTN BufferSize, IN OUT REFI
       if (BufferSize >= 512) {
          Magic16 = (UINT16*) (Buffer + 510);
          if (*Magic16 == FAT_MAGIC) {
       if (BufferSize >= 512) {
          Magic16 = (UINT16*) (Buffer + 510);
          if (*Magic16 == FAT_MAGIC) {
-            Volume->FSType = FS_TYPE_FAT;
+            MagicString = (char*) (Buffer + 3);
+            if (CompareMem(MagicString, NTFS_SIGNATURE, 8) == 0) {
+               Volume->FSType = FS_TYPE_NTFS;
+               CopyMem(&(Volume->VolUuid), Buffer + 0x48, sizeof(UINT64));
+            } else {
+               // NOTE: This misidentifies a whole disk as a FAT partition
+               // because FAT and MBR share the same 0xaa55 "magic" and
+               // no other distinguishing data. Later code, in ScanVolume(),
+               // resets to FS_TYPE_UNKNOWN if the "filesystem" can't be
+               // read.
+               Volume->FSType = FS_TYPE_FAT;
+            }
             return;
          } // if
             return;
          } // if
-      } // search for FAT magic
+      } // search for FAT and NTFS magic
 
       if (BufferSize >= (1024 + 100)) {
          Magic16 = (UINT16*) (Buffer + 1024 + 56);
 
       if (BufferSize >= (1024 + 100)) {
          Magic16 = (UINT16*) (Buffer + 1024 + 56);
@@ -536,6 +552,7 @@ static VOID SetFilesystemData(IN UINT8 *Buffer, IN UINTN BufferSize, IN OUT REFI
             return;
          }
       } // search for HFS+ magic
             return;
          }
       } // search for HFS+ magic
+
    } // if (Buffer != NULL)
 
 } // UINT32 SetFilesystemData()
    } // if (Buffer != NULL)
 
 } // UINT32 SetFilesystemData()
@@ -955,6 +972,7 @@ VOID ScanVolume(REFIT_VOLUME *Volume)
 
    if (Volume->RootDir == NULL) {
       Volume->IsReadable = FALSE;
 
    if (Volume->RootDir == NULL) {
       Volume->IsReadable = FALSE;
+      Volume->FSType = FS_TYPE_UNKNOWN;
       return;
    } else {
       Volume->IsReadable = TRUE;
       return;
    } else {
       Volume->IsReadable = TRUE;
index c45aa26508e5ea90383f8a0d42c89ce1a0bfe07c..835082608e03874190f2ffd78f81f97aea1ba2e7 100644 (file)
@@ -166,7 +166,7 @@ static VOID AboutrEFInd(VOID)
 
     if (AboutMenu.EntryCount == 0) {
         AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
 
     if (AboutMenu.EntryCount == 0) {
         AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
-        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.8.5.3");
+        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.8.5.4");
         AddMenuInfoLine(&AboutMenu, L"");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012-2015 Roderick W. Smith");
         AddMenuInfoLine(&AboutMenu, L"");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012-2015 Roderick W. Smith");