diff --git a/TACTSharp/InstallInstance.cs b/TACTSharp/InstallInstance.cs index d12eab8..f1f2578 100644 --- a/TACTSharp/InstallInstance.cs +++ b/TACTSharp/InstallInstance.cs @@ -60,7 +60,7 @@ public unsafe InstallInstance(string path) this.Entries = []; for (var i = 0; i < this.NumEntries; i++) { - var name = installData[offs..].ReadNullTermString(); + var name = installData[offs..].ReadNullTermString().Replace('/', '\\'); offs += name.Length + 1; var contentHash = installData.Slice(offs, this.HashSize).ToArray(); @@ -90,7 +90,7 @@ public struct InstallTagEntry public struct InstallFileEntry { - public string name; + public string name; // Normalized to \, but not enforced upper/lowercase. public byte[] md5; public uint size; public string[] tags; diff --git a/TACTTool/Program.cs b/TACTTool/Program.cs index 8caa670..e7de7f9 100644 --- a/TACTTool/Program.cs +++ b/TACTTool/Program.cs @@ -131,6 +131,9 @@ static async Task Main(string[] args) { var (eKey, decodedSize, fileName) = target; + fileName = fileName.Replace('\\', Path.DirectorySeparatorChar); + fileName = fileName.Replace('/', Path.DirectorySeparatorChar); + Console.WriteLine("Extracting " + Convert.ToHexStringLower(eKey) + " to " + fileName); try @@ -376,7 +379,7 @@ private static void HandleFDID(BuildInstance build, string fdid, string? filenam private static void HandleFileName(BuildInstance build, string filename, string? outputFilename) { - var fileEntries = build.Install.Entries.Where(x => x.name.Equals(filename, StringComparison.InvariantCultureIgnoreCase)).ToList(); + var fileEntries = build.Install.Entries.Where(x => x.name.Equals(filename.Replace('/', '\\'), StringComparison.InvariantCultureIgnoreCase)).ToList(); if (fileEntries.Count == 0) { using (var hasher = new Jenkins96())