From 7a8e997948cc0104efa3f81416b714594833c6ad Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sat, 27 Apr 2019 02:46:29 +0100 Subject: [PATCH] Implement DOS and NT namespaces in FAT. --- DiscImageChef.Filesystems/FAT/Consts.cs | 6 ++++++ DiscImageChef.Filesystems/FAT/Dir.cs | 11 ++++++---- DiscImageChef.Filesystems/FAT/FAT.cs | 7 ++++++- DiscImageChef.Filesystems/FAT/Super.cs | 28 +++++++++++++++++++++---- 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/DiscImageChef.Filesystems/FAT/Consts.cs b/DiscImageChef.Filesystems/FAT/Consts.cs index 342055519..a21cd0270 100644 --- a/DiscImageChef.Filesystems/FAT/Consts.cs +++ b/DiscImageChef.Filesystems/FAT/Consts.cs @@ -205,5 +205,11 @@ namespace DiscImageChef.Filesystems.FAT DecRainbow, Human } + + enum Namespace + { + Dos, + Nt + } } } \ No newline at end of file diff --git a/DiscImageChef.Filesystems/FAT/Dir.cs b/DiscImageChef.Filesystems/FAT/Dir.cs index 815f9b8ba..c035ce472 100644 --- a/DiscImageChef.Filesystems/FAT/Dir.cs +++ b/DiscImageChef.Filesystems/FAT/Dir.cs @@ -154,11 +154,14 @@ namespace DiscImageChef.Filesystems.FAT string name = Encoding.GetString(dirent.filename).TrimEnd(); string extension = Encoding.GetString(dirent.extension).TrimEnd(); - if((dirent.caseinfo & FASTFAT_LOWERCASE_EXTENSION) > 0) - extension = extension.ToLower(CultureInfo.CurrentCulture); + if(@namespace == Namespace.Nt) + { + if((dirent.caseinfo & FASTFAT_LOWERCASE_EXTENSION) > 0) + extension = extension.ToLower(CultureInfo.CurrentCulture); - if((dirent.caseinfo & FASTFAT_LOWERCASE_BASENAME) > 0) - name = name.ToLower(CultureInfo.CurrentCulture); + if((dirent.caseinfo & FASTFAT_LOWERCASE_BASENAME) > 0) + name = name.ToLower(CultureInfo.CurrentCulture); + } if(extension != "") filename = name + "." + extension; else filename = name; diff --git a/DiscImageChef.Filesystems/FAT/FAT.cs b/DiscImageChef.Filesystems/FAT/FAT.cs index 7898831c1..301d1f356 100644 --- a/DiscImageChef.Filesystems/FAT/FAT.cs +++ b/DiscImageChef.Filesystems/FAT/FAT.cs @@ -55,6 +55,7 @@ namespace DiscImageChef.Filesystems.FAT ulong fatFirstSector; ulong firstClusterSector; bool mounted; + Namespace @namespace; uint reservedSectors; Dictionary rootDirectoryCache; uint sectorsPerCluster; @@ -72,7 +73,11 @@ namespace DiscImageChef.Filesystems.FAT public IEnumerable<(string name, Type type, string description)> SupportedOptions => new (string name, Type type, string description)[] { }; - public Dictionary Namespaces => null; + public Dictionary Namespaces => + new Dictionary + { + {"dos", "DOS (8.3 all uppercase)"}, {"nt", "Windows NT (8.3 mixed case, default)"} + }; static Dictionary GetDefaultOptions() => new Dictionary {{"debug", false.ToString()}}; diff --git a/DiscImageChef.Filesystems/FAT/Super.cs b/DiscImageChef.Filesystems/FAT/Super.cs index 143bd4ada..797f69508 100644 --- a/DiscImageChef.Filesystems/FAT/Super.cs +++ b/DiscImageChef.Filesystems/FAT/Super.cs @@ -65,6 +65,20 @@ namespace DiscImageChef.Filesystems.FAT if(options == null) options = GetDefaultOptions(); if(options.TryGetValue("debug", out string debugString)) bool.TryParse(debugString, out debug); + // Default namespace + if(@namespace is null) @namespace = "nt"; + + switch(@namespace.ToLowerInvariant()) + { + case "dos": + this.@namespace = Namespace.Dos; + break; + case "nt": + this.@namespace = Namespace.Nt; + break; + default: return Errno.InvalidArgument; + } + if(imagePlugin.Info.SectorSize < 512) return Errno.InvalidArgument; DicConsole.DebugWriteLine("FAT plugin", "Reading BPB"); @@ -414,7 +428,9 @@ namespace DiscImageChef.Filesystems.FAT Array.Copy(entry.extension, 0, fullname, 8, 3); string volname = Encoding.GetString(fullname).Trim(); if(!string.IsNullOrEmpty(volname)) - XmlFsType.VolumeName = (entry.caseinfo & 0x18) > 0 ? volname.ToLower() : volname; + XmlFsType.VolumeName = (entry.caseinfo & 0x18) > 0 && this.@namespace == Namespace.Nt + ? volname.ToLower() + : volname; if(entry.ctime > 0 && entry.cdate > 0) { @@ -438,10 +454,14 @@ namespace DiscImageChef.Filesystems.FAT string name = Encoding.GetString(entry.filename).TrimEnd(); string extension = Encoding.GetString(entry.extension).TrimEnd(); - if((entry.caseinfo & FASTFAT_LOWERCASE_EXTENSION) > 0) - extension = extension.ToLower(CultureInfo.CurrentCulture); + if(this.@namespace == Namespace.Nt) + { + if((entry.caseinfo & FASTFAT_LOWERCASE_EXTENSION) > 0) + extension = extension.ToLower(CultureInfo.CurrentCulture); - if((entry.caseinfo & FASTFAT_LOWERCASE_BASENAME) > 0) name = name.ToLower(CultureInfo.CurrentCulture); + if((entry.caseinfo & FASTFAT_LOWERCASE_BASENAME) > 0) + name = name.ToLower(CultureInfo.CurrentCulture); + } if(extension != "") filename = name + "." + extension; else filename = name;