mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Fix cluster numbering calculations in FAT12 and FAT16.
This commit is contained in:
@@ -115,7 +115,8 @@ namespace DiscImageChef.Filesystems.FAT
|
||||
|
||||
for(int i = 0; i < clusters.Length; i++)
|
||||
{
|
||||
byte[] buffer = image.ReadSectors(firstClusterSector + (clusters[i] - 2) * sectorsPerCluster,
|
||||
byte[] buffer =
|
||||
image.ReadSectors(firstClusterSector + (ulong)((clusters[i] - (fat32 ? 2 : 0)) * sectorsPerCluster),
|
||||
sectorsPerCluster);
|
||||
Array.Copy(buffer, 0, directoryBuffer, i * bytesPerCluster, bytesPerCluster);
|
||||
}
|
||||
|
||||
@@ -56,7 +56,8 @@ namespace DiscImageChef.Filesystems.FAT
|
||||
|
||||
if(fileBlock >= clusters.Length) return Errno.InvalidArgument;
|
||||
|
||||
deviceBlock = (long)(firstClusterSector + (clusters[fileBlock] - 2) * sectorsPerCluster);
|
||||
deviceBlock = (long)(firstClusterSector +
|
||||
(ulong)((clusters[fileBlock] - (fat32 ? 2 : 0)) * sectorsPerCluster));
|
||||
|
||||
return Errno.NoError;
|
||||
}
|
||||
@@ -103,7 +104,7 @@ namespace DiscImageChef.Filesystems.FAT
|
||||
if(i + firstCluster >= clusters.Length) return Errno.InvalidArgument;
|
||||
|
||||
byte[] buffer =
|
||||
image.ReadSectors(firstClusterSector + (clusters[i + firstCluster] - 2) * sectorsPerCluster,
|
||||
image.ReadSectors(firstClusterSector + (ulong)((clusters[i + firstCluster] - (fat32 ? 2 : 0)) * sectorsPerCluster),
|
||||
sectorsPerCluster);
|
||||
|
||||
ms.Write(buffer, 0, buffer.Length);
|
||||
@@ -143,7 +144,9 @@ namespace DiscImageChef.Filesystems.FAT
|
||||
if(entry.attributes.HasFlag(FatAttributes.Subdirectory))
|
||||
{
|
||||
stat.Attributes |= FileAttributes.Directory;
|
||||
stat.Blocks = fat32 ? GetClusters((uint)((entry.ea_handle << 16) + entry.start_cluster)).Length : GetClusters(entry.start_cluster).Length;
|
||||
stat.Blocks = fat32
|
||||
? GetClusters((uint)((entry.ea_handle << 16) + entry.start_cluster)).Length
|
||||
: GetClusters(entry.start_cluster).Length;
|
||||
stat.Length = stat.Blocks * stat.BlockSize;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user