diff --git a/DiscImageChef.Filesystems/FAT/File.cs b/DiscImageChef.Filesystems/FAT/File.cs index 208cde63c..8e3b1033d 100644 --- a/DiscImageChef.Filesystems/FAT/File.cs +++ b/DiscImageChef.Filesystems/FAT/File.cs @@ -192,17 +192,7 @@ namespace DiscImageChef.Filesystems.FAT while(nextCluster > 0 && nextCluster <= FAT16_FORMATTED) { clusters.Add(nextCluster); - - if(currentSector != nextSector) - { - fatData = image.ReadSector(nextSector); - currentSector = nextSector; - } - - nextCluster = BitConverter.ToUInt16(fatData, nextEntry * 2); - nextSector = nextCluster / fatEntriesPerSector + fatFirstSector + - (useFirstFat ? 0 : sectorsPerFat); - nextEntry = (int)(nextCluster % fatEntriesPerSector); + nextCluster = fatEntries[nextCluster]; } else while(nextCluster > 0 && nextCluster <= FAT12_FORMATTED) diff --git a/DiscImageChef.Filesystems/FAT/Super.cs b/DiscImageChef.Filesystems/FAT/Super.cs index 6b30182ea..143bd4ada 100644 --- a/DiscImageChef.Filesystems/FAT/Super.cs +++ b/DiscImageChef.Filesystems/FAT/Super.cs @@ -35,15 +35,16 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using DiscImageChef.CommonTypes; using DiscImageChef.CommonTypes.Enums; using DiscImageChef.CommonTypes.Interfaces; using DiscImageChef.CommonTypes.Structs; using DiscImageChef.Console; -using DiscImageChef.Helpers; using Schemas; using FileSystemInfo = DiscImageChef.CommonTypes.Structs.FileSystemInfo; +using Marshal = DiscImageChef.Helpers.Marshal; namespace DiscImageChef.Filesystems.FAT { @@ -505,6 +506,16 @@ namespace DiscImageChef.Filesystems.FAT fatEntries[pos++] = (ushort)(((fatBytes[i + 1] & 0xF0) >> 4) + (fatBytes[i + 2] << 4)); } } + else if(fat16) + { + DicConsole.DebugWriteLine("FAT plugin", "Reading FAT16"); + + byte[] fatBytes = + imagePlugin.ReadSectors(fatFirstSector + (useFirstFat ? 0 : sectorsPerFat), sectorsPerFat); + + DicConsole.DebugWriteLine("FAT plugin", "Casting FAT"); + fatEntries = MemoryMarshal.Cast(fatBytes).ToArray(); + } // TODO: Check how this affects international filenames cultureInfo = new CultureInfo("en-US", false);