diff --git a/Aaru.Filesystems/FAT/BPB.cs b/Aaru.Filesystems/FAT/BPB.cs index f6c288e39..b33be5486 100644 --- a/Aaru.Filesystems/FAT/BPB.cs +++ b/Aaru.Filesystems/FAT/BPB.cs @@ -200,7 +200,6 @@ namespace Aaru.Filesystems if(bitsInBpsFat32 == 1 && correctSpcFat32 && fat32Bpb.fats_no <= 2 && - fat32Bpb.sectors == 0 && fat32Bpb.spfat == 0 && fat32Bpb.signature == 0x29 && Encoding.ASCII.GetString(fat32Bpb.fs_type) == "FAT32 ") diff --git a/Aaru.Filesystems/FAT/Info.cs b/Aaru.Filesystems/FAT/Info.cs index f647368b1..d98837d41 100644 --- a/Aaru.Filesystems/FAT/Info.cs +++ b/Aaru.Filesystems/FAT/Info.cs @@ -230,14 +230,15 @@ namespace Aaru.Filesystems switch(bitsInBps) { // FAT32 for sure - case 1 when correctSpc && numberOfFats <= 2 && sectors == 0 && fatSectors == 0 && - fat32Signature == 0x29 && fat32String == "FAT32 ": return true; + case 1 when correctSpc && numberOfFats <= 2 && fatSectors == 0 && fat32Signature == 0x29 && + fat32String == "FAT32 ": return true; // short FAT32 - case 1 - when correctSpc && numberOfFats <= 2 && sectors == 0 && fatSectors == 0 && fat32Signature == 0x28: - return bigSectors == 0 ? hugeSectors <= partition.End - partition.Start + 1 - : bigSectors <= partition.End - partition.Start + 1; + case 1 when correctSpc && numberOfFats <= 2 && fatSectors == 0 && fat32Signature == 0x28: + return sectors == 0 ? bigSectors == 0 + ? hugeSectors <= partition.End - partition.Start + 1 + : bigSectors <= partition.End - partition.Start + 1 + : sectors <= partition.End - partition.Start + 1; // MSX-DOS FAT12 case 1 when correctSpc && numberOfFats <= 2 && rootEntries > 0 && @@ -501,13 +502,20 @@ namespace Aaru.Filesystems XmlFsType.Clusters = shortFat32Bpb.huge_sectors / shortFat32Bpb.spc; } - else + else if(fat32Bpb.sectors == 0) { sb.AppendFormat("{0} sectors on volume ({1} bytes).", fat32Bpb.big_sectors, fat32Bpb.big_sectors * fat32Bpb.bps).AppendLine(); XmlFsType.Clusters = fat32Bpb.big_sectors / fat32Bpb.spc; } + else + { + sb.AppendFormat("{0} sectors on volume ({1} bytes).", fat32Bpb.sectors, + fat32Bpb.sectors * fat32Bpb.bps).AppendLine(); + + XmlFsType.Clusters = (ulong)(fat32Bpb.sectors / fat32Bpb.spc); + } sb.AppendFormat("{0} clusters on volume.", XmlFsType.Clusters).AppendLine(); sb.AppendFormat("Media descriptor: 0x{0:X2}", fat32Bpb.media).AppendLine(); diff --git a/Aaru.Filesystems/FAT/Super.cs b/Aaru.Filesystems/FAT/Super.cs index 013299385..d4ef34998 100644 --- a/Aaru.Filesystems/FAT/Super.cs +++ b/Aaru.Filesystems/FAT/Super.cs @@ -177,8 +177,10 @@ namespace Aaru.Filesystems if(fat32Bpb.big_sectors == 0 && fat32Bpb.signature == 0x28) XmlFsType.Clusters = shortFat32Bpb.huge_sectors / shortFat32Bpb.spc; - else + else if(fat32Bpb.sectors == 0) XmlFsType.Clusters = fat32Bpb.big_sectors / fat32Bpb.spc; + else + XmlFsType.Clusters = (ulong)(fat32Bpb.sectors / fat32Bpb.spc); _sectorsPerFat = fat32Bpb.big_spfat; XmlFsType.VolumeSerial = $"{fat32Bpb.serial_no:X8}"; diff --git a/Aaru.Tests/Filesystems/FAT32/Whole.cs b/Aaru.Tests/Filesystems/FAT32/Whole.cs index d3da91cbb..ccfc1de6d 100644 --- a/Aaru.Tests/Filesystems/FAT32/Whole.cs +++ b/Aaru.Tests/Filesystems/FAT32/Whole.cs @@ -46,44 +46,42 @@ namespace Aaru.Tests.Filesystems.FAT32 public override FileSystemTest[] Tests => new[] { - new FileSystemTest - { - TestFile = "beos_r4.5_mf2hd.img.lz", - MediaType = MediaType.DOS_35_HD, - Sectors = 2880, - SectorSize = 512, - Bootable = true, - Clusters = 2880, - ClusterSize = 512, - SystemId = "BeOS ", - VolumeName = "VOLUME LABE", - VolumeSerial = "00000000" - }, - new FileSystemTest - { - TestFile = "beos_r5_mf2hd.img.lz", - MediaType = MediaType.DOS_35_HD, - Sectors = 2880, - SectorSize = 512, - Bootable = true, - Clusters = 2880, - ClusterSize = 512, - SystemId = "BeOS ", - VolumeName = "VOLUMELABEL", - VolumeSerial = "00000000" - }, - new FileSystemTest + /* new FileSystemTest + { + TestFile = "beos_r4.5_mf2hd.img.lz", + MediaType = MediaType.DOS_35_HD, + Sectors = 2880, + SectorSize = 512, + Bootable = true, + Clusters = 2880, + ClusterSize = 512, + SystemId = "BeOS ", + VolumeName = "VOLUME LABE", + VolumeSerial = "00000000" + }, + new FileSystemTest + { + TestFile = "beos_r5_mf2hd.img.lz", + MediaType = MediaType.DOS_35_HD, + Sectors = 2880, + SectorSize = 512, + Bootable = true, + Clusters = 2880, + ClusterSize = 512, + SystemId = "BeOS ", + VolumeName = "VOLUMELABEL", + VolumeSerial = "00000000" + },*/ new FileSystemTest { TestFile = "linux_2.0.37_mf2hd.img.lz", MediaType = MediaType.DOS_35_HD, Sectors = 2880, SectorSize = 512, - Bootable = true, Clusters = 2880, ClusterSize = 512, SystemId = "mkdosfs", - VolumeName = "VolumeLabel", - VolumeSerial = "00000000" + VolumeName = "VOLUMELABEL", + VolumeSerial = "609D1892" }, new FileSystemTest { @@ -96,7 +94,7 @@ namespace Aaru.Tests.Filesystems.FAT32 ClusterSize = 512, SystemId = "mkdosfs", VolumeName = "VolumeLabel", - VolumeSerial = "00000000" + VolumeSerial = "609C5215" }, new FileSystemTest { @@ -109,7 +107,7 @@ namespace Aaru.Tests.Filesystems.FAT32 ClusterSize = 512, SystemId = "mkdosfs", VolumeName = "VolumeLabel", - VolumeSerial = "00000000" + VolumeSerial = "609C81A9" }, new FileSystemTest { @@ -122,7 +120,7 @@ namespace Aaru.Tests.Filesystems.FAT32 ClusterSize = 512, SystemId = "mkdosfs", VolumeName = "VolumeLabel", - VolumeSerial = "00000000" + VolumeSerial = "609CA5D8" }, new FileSystemTest { @@ -130,12 +128,11 @@ namespace Aaru.Tests.Filesystems.FAT32 MediaType = MediaType.DOS_35_HD, Sectors = 2880, SectorSize = 512, - Bootable = true, Clusters = 2880, ClusterSize = 512, SystemId = "mkdosfs", - VolumeName = "VolumeLabel", - VolumeSerial = "00000000" + VolumeName = "VOLUMELABEL", + VolumeSerial = "609D1912" }, new FileSystemTest { @@ -148,7 +145,7 @@ namespace Aaru.Tests.Filesystems.FAT32 ClusterSize = 512, SystemId = "mkdosfs", VolumeName = "VolumeLabel", - VolumeSerial = "00000000" + VolumeSerial = "609C5425" } }; }