]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
Support NTFS with large cluster size (greater than 64KB).
authorlongpanda <admin@ventoy.net>
Tue, 28 Mar 2023 03:38:46 +0000 (11:38 +0800)
committerlongpanda <admin@ventoy.net>
Tue, 28 Mar 2023 03:38:46 +0000 (11:38 +0800)
GRUB2/MOD_SRC/grub-2.04/grub-core/fs/ntfs.c

index e28b82aa9e69fb1cf2896a3581547bea62c290e3..986ef755d1823447babee3ce7b399b2131a72329 100644 (file)
@@ -889,6 +889,7 @@ grub_ntfs_mount (grub_disk_t disk)
   struct grub_ntfs_bpb bpb;
   struct grub_ntfs_data *data = 0;
   grub_uint32_t spc;
+  grub_uint32_t sectors_per_cluster;
 
   if (!disk)
     goto fail;
@@ -903,14 +904,18 @@ grub_ntfs_mount (grub_disk_t disk)
   if (grub_disk_read (disk, 0, 0, sizeof (bpb), &bpb))
     goto fail;
 
+  sectors_per_cluster = bpb.sectors_per_cluster;
+  if (sectors_per_cluster > 0x80)
+    sectors_per_cluster = 1U << (256U - bpb.sectors_per_cluster);
+
   if (grub_memcmp ((char *) &bpb.oem_name, "NTFS", 4) != 0
-      || bpb.sectors_per_cluster == 0
-      || (bpb.sectors_per_cluster & (bpb.sectors_per_cluster - 1)) != 0
+      || sectors_per_cluster == 0
+      || (sectors_per_cluster & (sectors_per_cluster - 1)) != 0
       || bpb.bytes_per_sector == 0
       || (bpb.bytes_per_sector & (bpb.bytes_per_sector - 1)) != 0)
     goto fail;
 
-  spc = (((grub_uint32_t) bpb.sectors_per_cluster
+  spc = (((grub_uint32_t) sectors_per_cluster
          * (grub_uint32_t) grub_le_to_cpu16 (bpb.bytes_per_sector))
         >> GRUB_NTFS_BLK_SHR);
   if (spc == 0)