From 957326d7a3fe30281216439a4b1a3a58be1c48a1 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sat, 27 Apr 2019 13:24:49 +0100 Subject: [PATCH] Fix reading FAT32 files starting beyond cluster 65536. --- DiscImageChef.Filesystems/FAT/Dir.cs | 2 ++ DiscImageChef.Filesystems/FAT/File.cs | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/DiscImageChef.Filesystems/FAT/Dir.cs b/DiscImageChef.Filesystems/FAT/Dir.cs index 970f2a977..70b2ca8e0 100644 --- a/DiscImageChef.Filesystems/FAT/Dir.cs +++ b/DiscImageChef.Filesystems/FAT/Dir.cs @@ -103,6 +103,8 @@ namespace DiscImageChef.Filesystems.FAT currentPath = p == 0 ? pieces[0] : $"{currentPath}/{pieces[p]}"; uint currentCluster = entry.Value.start_cluster; + if(fat32) currentCluster += (uint)(entry.Value.ea_handle << 16); + if(directoryCache.TryGetValue(currentPath, out currentDirectory)) continue; uint[] clusters = GetClusters(currentCluster); diff --git a/DiscImageChef.Filesystems/FAT/File.cs b/DiscImageChef.Filesystems/FAT/File.cs index e2a530c79..a99009c7f 100644 --- a/DiscImageChef.Filesystems/FAT/File.cs +++ b/DiscImageChef.Filesystems/FAT/File.cs @@ -130,7 +130,7 @@ namespace DiscImageChef.Filesystems.FAT Blocks = entry.size / bytesPerCluster, BlockSize = bytesPerCluster, Length = entry.size, - Inode = entry.start_cluster, + Inode = (ulong)(fat32 ? (entry.ea_handle << 16) + entry.start_cluster : entry.start_cluster), Links = 1, CreationTime = DateHandlers.DosToDateTime(entry.cdate, entry.ctime), LastWriteTime = DateHandlers.DosToDateTime(entry.mdate, entry.mtime) @@ -143,7 +143,7 @@ namespace DiscImageChef.Filesystems.FAT if(entry.attributes.HasFlag(FatAttributes.Subdirectory)) { stat.Attributes |= FileAttributes.Directory; - stat.Blocks = 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; }