* 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
#include "../include/refit_call_wrapper.h"
#include "../include/RemovableMedia.h"
#include "gpt.h"
+#include "config.h"
#ifdef __MAKEWITH_GNUEFI
#define EfiReallocatePool ReallocatePool
#define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs"
#define REISER2FS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs"
#define BTRFS_SIGNATURE "_BHRfS_M"
+#define NTFS_SIGNATURE "NTFS "
// variables
case FS_TYPE_ISO9660:
retval = L" ISO-9660";
break;
+ case FS_TYPE_NTFS:
+ retval = L" NTFS";
+ break;
default:
retval = L"";
break;
} // 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;
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);
return;
}
} // search for HFS+ magic
+
} // if (Buffer != NULL)
} // UINT32 SetFilesystemData()
}
// 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",
// 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]);
}
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()
} // if
} // VOID SetPartGuid()
+// Return TRUE if NTFS boot files are found, FALSE otherwise.
+// Assumes Volume is already mounted.
+static BOOLEAN HasWindowsBiosBootFiles(REFIT_VOLUME *Volume) {
+ BOOLEAN FilesFound = TRUE;
+
+ if (Volume->RootDir != NULL) {
+ FilesFound = (FileExists(Volume->RootDir, L"NTLDR") && // Windows XP boot files
+ FileExists(Volume->RootDir, L"ntdetect.com") &&
+ FileExists(Volume->RootDir, L"boot.ini")) ||
+ FileExists(Volume->RootDir, L"Windows"); // Windows 7 ID (imperfect; TODO: Improve)
+ } // if
+ return FilesFound;
+} // static VOID HasWindowsBiosBootFiles()
+
VOID ScanVolume(REFIT_VOLUME *Volume)
{
EFI_STATUS Status;
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;
+ if (Volume->FSType != FS_TYPE_NTFS)
+ Volume->FSType = FS_TYPE_UNKNOWN;
+ return;
+ } else {
+ Volume->IsReadable = TRUE;
+ if ((Volume->FSType == FS_TYPE_NTFS) && Volume->HasBootCode)
+ Volume->HasBootCode = HasWindowsBiosBootFiles(Volume);
+ } // if/else
- // 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)