diff --git a/SabreTools.Serialization/Deserializers/BFPK.cs b/SabreTools.Serialization/Deserializers/BFPK.cs index d5146524..99898f34 100644 --- a/SabreTools.Serialization/Deserializers/BFPK.cs +++ b/SabreTools.Serialization/Deserializers/BFPK.cs @@ -19,9 +19,6 @@ namespace SabreTools.Serialization.Deserializers if (data.Position < 0 || data.Position >= data.Length) return null; - // Cache the current offset - int initialOffset = (int)data.Position; - // Create a new archive to fill var archive = new Archive(); @@ -45,11 +42,7 @@ namespace SabreTools.Serialization.Deserializers // Read all entries in turn for (int i = 0; i < header.Files; i++) { - var file = ParseFileEntry(data); - if (file == null) - return null; - - files[i] = file; + files[i] = ParseFileEntry(data); } // Set the files @@ -65,7 +58,7 @@ namespace SabreTools.Serialization.Deserializers /// /// Stream to parse /// Filled file entry on success, null on error - private static FileEntry? ParseFileEntry(Stream data) + private static FileEntry ParseFileEntry(Stream data) { var fileEntry = new FileEntry(); diff --git a/SabreTools.Serialization/Deserializers/CFB.cs b/SabreTools.Serialization/Deserializers/CFB.cs index 0068233a..57b2b3ca 100644 --- a/SabreTools.Serialization/Deserializers/CFB.cs +++ b/SabreTools.Serialization/Deserializers/CFB.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Runtime.InteropServices; using SabreTools.IO.Extensions; using SabreTools.Models.CFB; using static SabreTools.Models.CFB.Constants; @@ -279,41 +280,24 @@ namespace SabreTools.Serialization.Deserializers /// Filled sector full of directory entries on success, null on error private static DirectoryEntry[]? ParseDirectoryEntries(Stream data, ushort sectorShift, ushort majorVersion) { - const int directoryEntrySize = 64 + 2 + 1 + 1 + 4 + 4 + 4 + 16 + 4 + 8 + 8 + 4 + 8; - + int directoryEntrySize = Marshal.SizeOf(); int sectorCount = (int)(Math.Pow(2, sectorShift) / directoryEntrySize); var directoryEntries = new DirectoryEntry[sectorCount]; for (int i = 0; i < directoryEntries.Length; i++) { - var directoryEntry = ParseDirectoryEntry(data, majorVersion); + var directoryEntry = data.ReadType(); if (directoryEntry == null) return null; + // Handle version 3 entries + if (majorVersion == 3) + directoryEntry.StreamSize &= 0x0000FFFF; + directoryEntries[i] = directoryEntry; } return directoryEntries; } - - /// - /// Parse a Stream into a directory entry - /// - /// Stream to parse - /// Major version from the header - /// Filled directory entry on success, null on error - private static DirectoryEntry? ParseDirectoryEntry(Stream data, ushort majorVersion) - { - var directoryEntry = data.ReadType(); - - if (directoryEntry == null) - return null; - - // Handle version 3 entries - if (majorVersion == 3) - directoryEntry.StreamSize &= 0x0000FFFF; - - return directoryEntry; - } } } \ No newline at end of file diff --git a/SabreTools.Serialization/Deserializers/CHD.cs b/SabreTools.Serialization/Deserializers/CHD.cs index a742d19f..79daeaf4 100644 --- a/SabreTools.Serialization/Deserializers/CHD.cs +++ b/SabreTools.Serialization/Deserializers/CHD.cs @@ -83,31 +83,14 @@ namespace SabreTools.Serialization.Deserializers /// private static HeaderV1? ParseHeaderV1(Stream data) { - var header = new HeaderV1(); - - byte[] tagBytes = data.ReadBytes(8); - header.Tag = Encoding.ASCII.GetString(tagBytes); - if (header.Tag != Constants.SignatureString) + var header = data.ReadType(); + if (header?.Tag != Constants.SignatureString) return null; - - header.Length = data.ReadUInt32BigEndian(); if (header.Length != Constants.HeaderV1Size) return null; - - header.Version = data.ReadUInt32BigEndian(); - header.Flags = (Flags)data.ReadUInt32BigEndian(); - header.Compression = (CompressionType)data.ReadUInt32BigEndian(); if (header.Compression > CompressionType.CHDCOMPRESSION_ZLIB) return null; - header.HunkSize = data.ReadUInt32BigEndian(); - header.TotalHunks = data.ReadUInt32BigEndian(); - header.Cylinders = data.ReadUInt32BigEndian(); - header.Heads = data.ReadUInt32BigEndian(); - header.Sectors = data.ReadUInt32BigEndian(); - header.MD5 = data.ReadBytes(16); - header.ParentMD5 = data.ReadBytes(16); - return header; } @@ -116,32 +99,14 @@ namespace SabreTools.Serialization.Deserializers /// private static HeaderV2? ParseHeaderV2(Stream data) { - var header = new HeaderV2(); - - byte[] tagBytes = data.ReadBytes(8); - header.Tag = Encoding.ASCII.GetString(tagBytes); - if (header.Tag != Constants.SignatureString) + var header = data.ReadType(); + if (header?.Tag != Constants.SignatureString) return null; - - header.Length = data.ReadUInt32BigEndian(); if (header.Length != Constants.HeaderV2Size) return null; - - header.Version = data.ReadUInt32BigEndian(); - header.Flags = (Flags)data.ReadUInt32BigEndian(); - header.Compression = (CompressionType)data.ReadUInt32BigEndian(); if (header.Compression > CompressionType.CHDCOMPRESSION_ZLIB) return null; - header.HunkSize = data.ReadUInt32BigEndian(); - header.TotalHunks = data.ReadUInt32BigEndian(); - header.Cylinders = data.ReadUInt32BigEndian(); - header.Heads = data.ReadUInt32BigEndian(); - header.Sectors = data.ReadUInt32BigEndian(); - header.MD5 = data.ReadBytes(16); - header.ParentMD5 = data.ReadBytes(16); - header.BytesPerSector = data.ReadUInt32BigEndian(); - return header; } @@ -150,32 +115,14 @@ namespace SabreTools.Serialization.Deserializers /// private static HeaderV3? ParseHeaderV3(Stream data) { - var header = new HeaderV3(); - - byte[] tagBytes = data.ReadBytes(8); - header.Tag = Encoding.ASCII.GetString(tagBytes); - if (header.Tag != Constants.SignatureString) + var header = data.ReadType(); + if (header?.Tag != Constants.SignatureString) return null; - - header.Length = data.ReadUInt32BigEndian(); if (header.Length != Constants.HeaderV3Size) return null; - - header.Version = data.ReadUInt32BigEndian(); - header.Flags = (Flags)data.ReadUInt32BigEndian(); - header.Compression = (CompressionType)data.ReadUInt32BigEndian(); if (header.Compression > CompressionType.CHDCOMPRESSION_ZLIB_PLUS) return null; - header.TotalHunks = data.ReadUInt32BigEndian(); - header.LogicalBytes = data.ReadUInt64BigEndian(); - header.MetaOffset = data.ReadUInt64BigEndian(); - header.MD5 = data.ReadBytes(16); - header.ParentMD5 = data.ReadBytes(16); - header.HunkBytes = data.ReadUInt32BigEndian(); - header.SHA1 = data.ReadBytes(20); - header.ParentSHA1 = data.ReadBytes(20); - return header; } @@ -184,31 +131,14 @@ namespace SabreTools.Serialization.Deserializers /// private static HeaderV4? ParseHeaderV4(Stream data) { - var header = new HeaderV4(); - - byte[] tagBytes = data.ReadBytes(8); - header.Tag = Encoding.ASCII.GetString(tagBytes); - if (header.Tag != Constants.SignatureString) + var header = data.ReadType(); + if (header?.Tag != Constants.SignatureString) return null; - - header.Length = data.ReadUInt32BigEndian(); if (header.Length != Constants.HeaderV4Size) return null; - - header.Version = data.ReadUInt32BigEndian(); - header.Flags = (Flags)data.ReadUInt32BigEndian(); - header.Compression = (CompressionType)data.ReadUInt32BigEndian(); if (header.Compression > CompressionType.CHDCOMPRESSION_AV) return null; - header.TotalHunks = data.ReadUInt32BigEndian(); - header.LogicalBytes = data.ReadUInt64BigEndian(); - header.MetaOffset = data.ReadUInt64BigEndian(); - header.HunkBytes = data.ReadUInt32BigEndian(); - header.SHA1 = data.ReadBytes(20); - header.ParentSHA1 = data.ReadBytes(20); - header.RawSHA1 = data.ReadBytes(20); - return header; } @@ -217,33 +147,12 @@ namespace SabreTools.Serialization.Deserializers /// private static HeaderV5? ParseHeaderV5(Stream data) { - var header = new HeaderV5(); - - byte[] tagBytes = data.ReadBytes(8); - header.Tag = Encoding.ASCII.GetString(tagBytes); - if (header.Tag != Constants.SignatureString) + var header = data.ReadType(); + if (header?.Tag != Constants.SignatureString) return null; - - header.Length = data.ReadUInt32BigEndian(); if (header.Length != Constants.HeaderV5Size) return null; - header.Version = data.ReadUInt32BigEndian(); - header.Compressors = new CodecType[4]; - for (int i = 0; i < header.Compressors.Length; i++) - { - header.Compressors[i] = (CodecType)data.ReadUInt32BigEndian(); - } - - header.LogicalBytes = data.ReadUInt64BigEndian(); - header.MapOffset = data.ReadUInt64BigEndian(); - header.MetaOffset = data.ReadUInt64BigEndian(); - header.HunkBytes = data.ReadUInt32BigEndian(); - header.UnitBytes = data.ReadUInt32BigEndian(); - header.RawSHA1 = data.ReadBytes(20); - header.SHA1 = data.ReadBytes(20); - header.ParentSHA1 = data.ReadBytes(20); - return header; } } diff --git a/SabreTools.Serialization/Deserializers/CIA.cs b/SabreTools.Serialization/Deserializers/CIA.cs index b5f896a9..d516f091 100644 --- a/SabreTools.Serialization/Deserializers/CIA.cs +++ b/SabreTools.Serialization/Deserializers/CIA.cs @@ -159,29 +159,23 @@ namespace SabreTools.Serialization.Deserializers switch (certificate.SignatureType) { case SignatureType.RSA_4096_SHA1: - certificate.SignatureSize = 0x200; - certificate.PaddingSize = 0x3C; - break; - case SignatureType.RSA_2048_SHA1: - certificate.SignatureSize = 0x100; - certificate.PaddingSize = 0x3C; - break; - case SignatureType.ECDSA_SHA1: - certificate.SignatureSize = 0x3C; - certificate.PaddingSize = 0x40; - break; case SignatureType.RSA_4096_SHA256: certificate.SignatureSize = 0x200; certificate.PaddingSize = 0x3C; break; + + case SignatureType.RSA_2048_SHA1: case SignatureType.RSA_2048_SHA256: certificate.SignatureSize = 0x100; certificate.PaddingSize = 0x3C; break; + + case SignatureType.ECDSA_SHA1: case SignatureType.ECDSA_SHA256: certificate.SignatureSize = 0x3C; certificate.PaddingSize = 0x40; break; + default: return null; } @@ -232,29 +226,23 @@ namespace SabreTools.Serialization.Deserializers switch (ticket.SignatureType) { case SignatureType.RSA_4096_SHA1: - ticket.SignatureSize = 0x200; - ticket.PaddingSize = 0x3C; - break; - case SignatureType.RSA_2048_SHA1: - ticket.SignatureSize = 0x100; - ticket.PaddingSize = 0x3C; - break; - case SignatureType.ECDSA_SHA1: - ticket.SignatureSize = 0x3C; - ticket.PaddingSize = 0x40; - break; case SignatureType.RSA_4096_SHA256: ticket.SignatureSize = 0x200; ticket.PaddingSize = 0x3C; break; + + case SignatureType.RSA_2048_SHA1: case SignatureType.RSA_2048_SHA256: ticket.SignatureSize = 0x100; ticket.PaddingSize = 0x3C; break; + + case SignatureType.ECDSA_SHA1: case SignatureType.ECDSA_SHA256: ticket.SignatureSize = 0x3C; ticket.PaddingSize = 0x40; break; + default: return null; } @@ -330,29 +318,23 @@ namespace SabreTools.Serialization.Deserializers switch (titleMetadata.SignatureType) { case SignatureType.RSA_4096_SHA1: - titleMetadata.SignatureSize = 0x200; - titleMetadata.PaddingSize = 0x3C; - break; - case SignatureType.RSA_2048_SHA1: - titleMetadata.SignatureSize = 0x100; - titleMetadata.PaddingSize = 0x3C; - break; - case SignatureType.ECDSA_SHA1: - titleMetadata.SignatureSize = 0x3C; - titleMetadata.PaddingSize = 0x40; - break; case SignatureType.RSA_4096_SHA256: titleMetadata.SignatureSize = 0x200; titleMetadata.PaddingSize = 0x3C; break; + + case SignatureType.RSA_2048_SHA1: case SignatureType.RSA_2048_SHA256: titleMetadata.SignatureSize = 0x100; titleMetadata.PaddingSize = 0x3C; break; + + case SignatureType.ECDSA_SHA1: case SignatureType.ECDSA_SHA256: titleMetadata.SignatureSize = 0x3C; titleMetadata.PaddingSize = 0x40; break; + default: return null; } diff --git a/SabreTools.Serialization/Deserializers/GCF.cs b/SabreTools.Serialization/Deserializers/GCF.cs index 26d32440..dc87e333 100644 --- a/SabreTools.Serialization/Deserializers/GCF.cs +++ b/SabreTools.Serialization/Deserializers/GCF.cs @@ -18,9 +18,6 @@ namespace SabreTools.Serialization.Deserializers if (data.Position < 0 || data.Position >= data.Length) return null; - // Cache the current offset - long initialOffset = data.Position; - // Create a new Half-Life Game Cache to fill var file = new Models.GCF.File(); @@ -134,7 +131,7 @@ namespace SabreTools.Serialization.Deserializers #endregion // Cache the current offset - initialOffset = data.Position; + long initialOffset = data.Position; #region Directory Header diff --git a/SabreTools.Serialization/Deserializers/IRD.cs b/SabreTools.Serialization/Deserializers/IRD.cs index 5233033c..eaed5caf 100644 --- a/SabreTools.Serialization/Deserializers/IRD.cs +++ b/SabreTools.Serialization/Deserializers/IRD.cs @@ -21,9 +21,6 @@ namespace SabreTools.Serialization.Deserializers var ird = new Models.IRD.File(); ird.Magic = data.ReadBytes(4); - if (ird.Magic == null) - return null; - string magic = Encoding.ASCII.GetString(ird.Magic); if (magic != "3IRD") return null; @@ -32,35 +29,20 @@ namespace SabreTools.Serialization.Deserializers if (ird.Version < 6) return null; - var titleId = data.ReadBytes(9); - if (titleId == null) - return null; - + byte[] titleId = data.ReadBytes(9); ird.TitleID = Encoding.ASCII.GetString(titleId); ird.TitleLength = data.ReadByteValue(); - var title = data.ReadBytes(ird.TitleLength); - if (title == null) - return null; - + byte[] title = data.ReadBytes(ird.TitleLength); ird.Title = Encoding.ASCII.GetString(title); - var systemVersion = data.ReadBytes(4); - if (systemVersion == null) - return null; - + byte[] systemVersion = data.ReadBytes(4); ird.SystemVersion = Encoding.ASCII.GetString(systemVersion); - var gameVersion = data.ReadBytes(5); - if (gameVersion == null) - return null; - + byte[] gameVersion = data.ReadBytes(5); ird.GameVersion = Encoding.ASCII.GetString(gameVersion); - var appVersion = data.ReadBytes(5); - if (appVersion == null) - return null; - + byte[] appVersion = data.ReadBytes(5); ird.AppVersion = Encoding.ASCII.GetString(appVersion); if (ird.Version == 7) diff --git a/SabreTools.Serialization/Deserializers/LinearExecutable.cs b/SabreTools.Serialization/Deserializers/LinearExecutable.cs index 8d3f5e5f..45c39264 100644 --- a/SabreTools.Serialization/Deserializers/LinearExecutable.cs +++ b/SabreTools.Serialization/Deserializers/LinearExecutable.cs @@ -428,13 +428,13 @@ namespace SabreTools.Serialization.Deserializers var entry = new ResidentNamesTableEntry(); entry.Length = data.ReadByteValue(); - if (entry.Length > 0 && data.Position + entry.Length <= data.Length) + if (entry.Length > 0) { byte[] name = data.ReadBytes(entry.Length); entry.Name = Encoding.ASCII.GetString(name).TrimEnd('\0'); } - entry.OrdinalNumber = data.ReadUInt16(); + entry.OrdinalNumber = data.ReadUInt16(); return entry; } @@ -728,7 +728,7 @@ namespace SabreTools.Serialization.Deserializers var entry = new ImportModuleNameTableEntry(); entry.Length = data.ReadByteValue(); - if (entry.Length > 0 && data.Position + entry.Length <= data.Length) + if (entry.Length > 0) { byte[] name = data.ReadBytes(entry.Length); entry.Name = Encoding.ASCII.GetString(name).TrimEnd('\0'); @@ -747,7 +747,7 @@ namespace SabreTools.Serialization.Deserializers var entry = new ImportModuleProcedureNameTableEntry(); entry.Length = data.ReadByteValue(); - if (entry.Length > 0 && data.Position + entry.Length <= data.Length) + if (entry.Length > 0) { byte[] name = data.ReadBytes(entry.Length); entry.Name = Encoding.ASCII.GetString(name).TrimEnd('\0'); @@ -766,13 +766,13 @@ namespace SabreTools.Serialization.Deserializers var entry = new NonResidentNamesTableEntry(); entry.Length = data.ReadByteValue(); - if (entry.Length > 0 && data.Position + entry.Length <= data.Length) + if (entry.Length > 0) { byte[] name = data.ReadBytes(entry.Length); entry.Name = Encoding.ASCII.GetString(name).TrimEnd('\0'); } - entry.OrdinalNumber = data.ReadUInt16(); + entry.OrdinalNumber = data.ReadUInt16(); return entry; } diff --git a/SabreTools.Serialization/Deserializers/MoPaQ.cs b/SabreTools.Serialization/Deserializers/MoPaQ.cs index 30bc3bec..a926754a 100644 --- a/SabreTools.Serialization/Deserializers/MoPaQ.cs +++ b/SabreTools.Serialization/Deserializers/MoPaQ.cs @@ -104,7 +104,8 @@ namespace SabreTools.Serialization.Deserializers } // Version 2 and 3 - else if (archive.ArchiveHeader.FormatVersion == FormatVersion.Format2 || archive.ArchiveHeader.FormatVersion == FormatVersion.Format3) + else if (archive.ArchiveHeader.FormatVersion == FormatVersion.Format2 + || archive.ArchiveHeader.FormatVersion == FormatVersion.Format3) { // If we have a hash table long hashTableOffset = ((uint)archive.ArchiveHeader.HashTablePositionHi << 23) | archive.ArchiveHeader.HashTablePosition; @@ -195,7 +196,8 @@ namespace SabreTools.Serialization.Deserializers } // Version 2 and 3 - else if (archive.ArchiveHeader.FormatVersion == FormatVersion.Format2 || archive.ArchiveHeader.FormatVersion == FormatVersion.Format3) + else if (archive.ArchiveHeader.FormatVersion == FormatVersion.Format2 + || archive.ArchiveHeader.FormatVersion == FormatVersion.Format3) { // If we have a block table long blockTableOffset = ((uint)archive.ArchiveHeader.BlockTablePositionHi << 23) | archive.ArchiveHeader.BlockTablePosition; diff --git a/SabreTools.Serialization/Deserializers/N3DS.cs b/SabreTools.Serialization/Deserializers/N3DS.cs index 39fa141f..64d35d58 100644 --- a/SabreTools.Serialization/Deserializers/N3DS.cs +++ b/SabreTools.Serialization/Deserializers/N3DS.cs @@ -294,10 +294,11 @@ namespace SabreTools.Serialization.Deserializers exeFSHeader.FileHeaders = new ExeFSFileHeader[10]; for (int i = 0; i < 10; i++) { - var exeFsFileHeader = ParseExeFSFileHeader(data); + var exeFsFileHeader = data.ReadType(); if (exeFsFileHeader == null) return null; + exeFsFileHeader.FileName = exeFsFileHeader.FileName?.TrimEnd('\0'); exeFSHeader.FileHeaders[i] = exeFsFileHeader; } exeFSHeader.Reserved = data.ReadBytes(0x20); @@ -309,22 +310,5 @@ namespace SabreTools.Serialization.Deserializers return exeFSHeader; } - - /// - /// Parse a Stream into an ExeFS file header - /// - /// Stream to parse - /// Filled ExeFS file header on success, null on error - public static ExeFSFileHeader? ParseExeFSFileHeader(Stream data) - { - var exeFSFileHeader = new ExeFSFileHeader(); - - byte[] fileName = data.ReadBytes(8); - exeFSFileHeader.FileName = Encoding.ASCII.GetString(fileName).TrimEnd('\0'); - exeFSFileHeader.FileOffset = data.ReadUInt32(); - exeFSFileHeader.FileSize = data.ReadUInt32(); - - return exeFSFileHeader; - } } } \ No newline at end of file