From c060047d3109f05eecbc8103ff58b4990a1cee24 Mon Sep 17 00:00:00 2001 From: Not Officer Date: Wed, 13 Jan 2021 21:10:40 +0100 Subject: [PATCH] IoStoreToc PartitionSize fix --- FModel/PakReader/IO/FFileIoStoreReader.cs | 1 + FModel/PakReader/IO/FIoStoreTocHeader.cs | 47 ++++++++++++---------- FModel/PakReader/IO/FIoStoreTocResource.cs | 13 +++--- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/FModel/PakReader/IO/FFileIoStoreReader.cs b/FModel/PakReader/IO/FFileIoStoreReader.cs index e9a66b98..b71e6cc3 100644 --- a/FModel/PakReader/IO/FFileIoStoreReader.cs +++ b/FModel/PakReader/IO/FFileIoStoreReader.cs @@ -57,6 +57,7 @@ namespace FModel.PakReader.IO CaseSensitive = caseSensitive; ContainerFile.FileHandle = containerStream; var tocResource = new FIoStoreTocResource(tocStream, tocReadOptions); + tocStream.Dispose(); TocResource = tocResource; var containerUncompressedSize = tocResource.Header.TocCompressedBlockEntryCount > 0 diff --git a/FModel/PakReader/IO/FIoStoreTocHeader.cs b/FModel/PakReader/IO/FIoStoreTocHeader.cs index 838c141c..8d2568d3 100644 --- a/FModel/PakReader/IO/FIoStoreTocHeader.cs +++ b/FModel/PakReader/IO/FIoStoreTocHeader.cs @@ -4,40 +4,42 @@ using FModel.PakReader.Parsers.Objects; namespace FModel.PakReader.IO { - public enum EIoStoreTocVersion : byte + public enum EIoStoreTocVersion { Invalid = 0, Initial, DirectoryIndex, + PartitionSize, LatestPlusOne, Latest = LatestPlusOne - 1 } - - public class FIoStoreTocHeader - { - public const int SIZE = 144; - public static byte[] TOC_MAGIC = new byte[] - {0x2D, 0x3D, 0x3D, 0x2D, 0x2D, 0x3D, 0x3D, 0x2D, 0x2D, 0x3D, 0x3D, 0x2D, 0x2D, 0x3D, 0x3D, 0x2D}; - public byte[] TocMagic; - public EIoStoreTocVersion Version; - public uint TocHeaderSize; - public uint TocEntryCount; - public uint TocCompressedBlockEntryCount; - public uint TocCompressedBlockEntrySize; // For sanity checking - public uint CompressionMethodNameCount; - public uint CompressionMethodNameLength; - public uint CompressionBlockSize; - public long DirectoryIndexSize; - public FIoContainerId ContainerId; - public FGuid EncryptionKeyGuid; - public EIoContainerFlags ContainerFlags; + public readonly struct FIoStoreTocHeader + { + public static byte[] TOC_MAGIC = { 0x2D, 0x3D, 0x3D, 0x2D, 0x2D, 0x3D, 0x3D, 0x2D, 0x2D, 0x3D, 0x3D, 0x2D, 0x2D, 0x3D, 0x3D, 0x2D }; + + public readonly byte[] TocMagic; + public readonly EIoStoreTocVersion Version; + public readonly uint TocHeaderSize; + public readonly uint TocEntryCount; + public readonly uint TocCompressedBlockEntryCount; + public readonly uint TocCompressedBlockEntrySize; // For sanity checking + public readonly uint CompressionMethodNameCount; + public readonly uint CompressionMethodNameLength; + public readonly uint CompressionBlockSize; + public readonly uint DirectoryIndexSize; + public readonly uint PartitionCount; + public readonly FIoContainerId ContainerId; + public readonly FGuid EncryptionKeyGuid; + public readonly EIoContainerFlags ContainerFlags; public FIoStoreTocHeader(BinaryReader reader) { TocMagic = reader.ReadBytes(16); + if (!TOC_MAGIC.SequenceEqual(TocMagic)) throw new FileLoadException("Invalid utoc magic"); + Version = (EIoStoreTocVersion) reader.ReadInt32(); TocHeaderSize = reader.ReadUInt32(); TocEntryCount = reader.ReadUInt32(); @@ -46,11 +48,12 @@ namespace FModel.PakReader.IO CompressionMethodNameCount = reader.ReadUInt32(); CompressionMethodNameLength = reader.ReadUInt32(); CompressionBlockSize = reader.ReadUInt32(); - DirectoryIndexSize = reader.ReadInt64(); + DirectoryIndexSize = reader.ReadUInt32(); + PartitionCount = reader.ReadUInt32(); ContainerId = new FIoContainerId(reader); EncryptionKeyGuid = new FGuid(reader); ContainerFlags = (EIoContainerFlags) reader.ReadInt32(); - reader.BaseStream.Position += 60; // Padding + //reader.BaseStream.Position += 60; // Padding } } } \ No newline at end of file diff --git a/FModel/PakReader/IO/FIoStoreTocResource.cs b/FModel/PakReader/IO/FIoStoreTocResource.cs index 9a39faab..3325e290 100644 --- a/FModel/PakReader/IO/FIoStoreTocResource.cs +++ b/FModel/PakReader/IO/FIoStoreTocResource.cs @@ -8,11 +8,11 @@ namespace FModel.PakReader.IO public enum EIoStoreTocReadOptions { Default, - ReadDirectoryIndex = (1 << 0), - ReadTocMeta = (1 << 1), - ReadAll = ReadDirectoryIndex | ReadTocMeta - } - + ReadDirectoryIndex = 1 << 0, + ReadTocMeta = 1 << 1, + ReadAll = ReadDirectoryIndex | ReadTocMeta + } + public class FIoStoreTocResource { public readonly FIoStoreTocHeader Header; @@ -30,8 +30,9 @@ namespace FModel.PakReader.IO tocStream.Read(streamBuffer, 0, streamBuffer.Length); using var reader = new BinaryReader(new MemoryStream(streamBuffer)); Header = new FIoStoreTocHeader(reader); + reader.BaseStream.Position = Header.TocHeaderSize; - var totalTocSize = tocStream.Length - FIoStoreTocHeader.SIZE; + var totalTocSize = tocStream.Length - Header.TocHeaderSize; var tocMetaSize = Header.TocEntryCount * FIoStoreTocEntryMeta.SIZE; var defaultTocSize = totalTocSize - Header.DirectoryIndexSize - tocMetaSize;