From: srs5694 Date: Wed, 4 Feb 2015 02:06:47 +0000 (-0500) Subject: Fixed bug that caused NTFS filesystems and whole disks to be X-Git-Url: https://code.delx.au/refind/commitdiff_plain/f750551a23ac517385f105b7de582b6e45616266 Fixed bug that caused NTFS filesystems and whole disks to be misidentified as FAT filesystems. --- diff --git a/NEWS.txt b/NEWS.txt index b6f164d..5d8a5ae 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -1,6 +1,10 @@ 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. diff --git a/refind/global.h b/refind/global.h index 584b108..8ad30f5 100644 --- a/refind/global.h +++ b/refind/global.h @@ -122,13 +122,15 @@ // 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 diff --git a/refind/lib.c b/refind/lib.c index 60229c4..4b7c970 100644 --- a/refind/lib.c +++ b/refind/lib.c @@ -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 NTFS_SIGNATURE "NTFS " // variables @@ -459,6 +460,9 @@ static CHAR16 *FSTypeName(IN UINT32 TypeCode) { case FS_TYPE_ISO9660: retval = L" ISO-9660"; break; + case FS_TYPE_NTFS: + retval = L" NTFS"; + 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, -// 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; @@ -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) { - 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 - } // search for FAT magic + } // search for FAT and NTFS magic 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 + } // if (Buffer != NULL) } // UINT32 SetFilesystemData() @@ -955,6 +972,7 @@ VOID ScanVolume(REFIT_VOLUME *Volume) if (Volume->RootDir == NULL) { Volume->IsReadable = FALSE; + Volume->FSType = FS_TYPE_UNKNOWN; return; } else { Volume->IsReadable = TRUE; diff --git a/refind/main.c b/refind/main.c index c45aa26..8350826 100644 --- a/refind/main.c +++ b/refind/main.c @@ -166,7 +166,7 @@ static VOID AboutrEFInd(VOID) 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");