X-Git-Url: https://code.delx.au/refind/blobdiff_plain/83e1f5a6803d47d7d6ef9bbd23e8467e5e4346e1..f750551a23ac517385f105b7de582b6e45616266:/refind/lib.c diff --git a/refind/lib.c b/refind/lib.c index 893f62c..4b7c970 100644 --- a/refind/lib.c +++ b/refind/lib.c @@ -34,7 +34,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* - * Modifications copyright (c) 2012-2014 Roderick W. Smith + * Modifications copyright (c) 2012-2015 Roderick W. Smith * * Modifications distributed under the terms of the GNU General Public * License (GPL) version 3 (GPLv3), a copy of which must be distributed @@ -49,6 +49,7 @@ #include "../include/refit_call_wrapper.h" #include "../include/RemovableMedia.h" #include "gpt.h" +#include "config.h" #ifdef __MAKEWITH_GNUEFI #define EfiReallocatePool ReallocatePool @@ -74,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 @@ -458,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; @@ -466,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; @@ -487,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); @@ -535,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() @@ -653,7 +671,7 @@ static VOID ScanVolumeBootcode(REFIT_VOLUME *Volume, BOOLEAN *Bootable) } // NOTE: If you add an operating system with a name that starts with 'W' or 'L', you - // need to fix AddLegacyEntry in main.c. + // need to fix AddLegacyEntry in refind/legacy.c. #if REFIT_DEBUG > 0 Print(L" Result of bootcode detection: %s %s (%s)\n", @@ -698,6 +716,9 @@ static VOID ScanVolumeBootcode(REFIT_VOLUME *Volume, BOOLEAN *Bootable) // Set default volume badge icon based on /.VolumeBadge.{icns|png} file or disk kind VOID SetVolumeBadgeIcon(REFIT_VOLUME *Volume) { + if (GlobalConfig.HideUIFlags & HIDEUI_FLAG_BADGES) + return; + if (Volume->VolBadgeImage == NULL) { Volume->VolBadgeImage = egLoadIconAnyType(Volume->RootDir, L"", L".VolumeBadge", GlobalConfig.IconSizes[ICON_SIZE_BADGE]); } @@ -713,6 +734,9 @@ VOID SetVolumeBadgeIcon(REFIT_VOLUME *Volume) case DISK_KIND_OPTICAL: Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_OPTICAL); break; + case DISK_KIND_NET: + Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_NET); + break; } // switch() } } // VOID SetVolumeBadgeIcon() @@ -930,32 +954,33 @@ VOID ScanVolume(REFIT_VOLUME *Volume) DevicePath = NextDevicePath; } // while - if (!Bootable) { + if (!Bootable) { #if REFIT_DEBUG > 0 - if (Volume->HasBootCode) - Print(L" Volume considered non-bootable, but boot code is present\n"); + if (Volume->HasBootCode) + Print(L" Volume considered non-bootable, but boot code is present\n"); #endif - Volume->HasBootCode = FALSE; - } + Volume->HasBootCode = FALSE; + } - // open the root directory of the volume - Volume->RootDir = LibOpenRoot(Volume->DeviceHandle); + // open the root directory of the volume + Volume->RootDir = LibOpenRoot(Volume->DeviceHandle); - // Set volume icon based on .VolumeBadge icon or disk kind - SetVolumeBadgeIcon(Volume); + // Set volume icon based on .VolumeBadge icon or disk kind + SetVolumeBadgeIcon(Volume); - Volume->VolName = GetVolumeName(Volume); + Volume->VolName = GetVolumeName(Volume); - if (Volume->RootDir == NULL) { - Volume->IsReadable = FALSE; - return; - } else { - Volume->IsReadable = TRUE; - } + if (Volume->RootDir == NULL) { + Volume->IsReadable = FALSE; + Volume->FSType = FS_TYPE_UNKNOWN; + return; + } else { + Volume->IsReadable = TRUE; + } - // get custom volume icons if present - if (!Volume->VolIconImage) - Volume->VolIconImage = egLoadIconAnyType(Volume->RootDir, L"", L".VolumeIcon", GlobalConfig.IconSizes[ICON_SIZE_BIG]); + // get custom volume icons if present + if (!Volume->VolIconImage) + Volume->VolIconImage = egLoadIconAnyType(Volume->RootDir, L"", L".VolumeIcon", GlobalConfig.IconSizes[ICON_SIZE_BIG]); } // ScanVolume() static VOID ScanExtendedPartition(REFIT_VOLUME *WholeDiskVolume, MBR_PARTITION_INFO *MbrEntry)