mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Add support for FAT32 volumes that uses sectors field in BPB. Fixes #580
This commit is contained in:
@@ -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 ")
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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}";
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user