diff --git a/SabreTools.Serialization/Extensions/PortableExecutable.cs b/SabreTools.Serialization/Extensions/PortableExecutable.cs index cbebdd36..ad4152b7 100644 --- a/SabreTools.Serialization/Extensions/PortableExecutable.cs +++ b/SabreTools.Serialization/Extensions/PortableExecutable.cs @@ -149,80 +149,6 @@ namespace SabreTools.Data.Extensions #endregion - #region Overlay - - /// - /// Parse a byte array into a SecuROMAddD - /// - /// Data to parse into overlay data - /// Offset into the byte array - /// A filled SecuROMAddD on success, null on error - public static AddD? ParseSecuROMAddD(this byte[] data, ref int offset) - { - // Read in the table - var obj = new AddD(); - - obj.Signature = data.ReadUInt32LittleEndian(ref offset); - if (obj.Signature != 0x44646441) - return null; - - int originalOffset = offset; - - obj.EntryCount = data.ReadUInt32LittleEndian(ref offset); - obj.Version = data.ReadNullTerminatedAnsiString(ref offset); - if (string.IsNullOrEmpty(obj.Version)) - offset = originalOffset + 0x10; - - var buildBytes = data.ReadBytes(ref offset, 4); - var buildChars = Array.ConvertAll(buildBytes, b => (char)b); - obj.Build = buildChars; - - // Distinguish between v1 and v2 - int bytesToRead = 112; // v2 - if (string.IsNullOrEmpty(obj.Version) - || obj.Version!.StartsWith("3") - || obj.Version.StartsWith("4.47")) - { - bytesToRead = 44; - } - - obj.Unknown14h = data.ReadBytes(ref offset, bytesToRead); - - obj.Entries = new AddDEntry[obj.EntryCount]; - for (int i = 0; i < obj.EntryCount; i++) - { - obj.Entries[i] = ParseSecuROMAddDEntry(data, ref offset); - } - - return obj; - } - - /// - /// Parse a byte array into a SecuROMAddDEntry - /// - /// Data to parse - /// Offset into the byte array - /// Filled SecuROMAddDEntry on success, null on error - public static AddDEntry ParseSecuROMAddDEntry(this byte[] data, ref int offset) - { - var obj = new AddDEntry(); - - obj.PhysicalOffset = data.ReadUInt32LittleEndian(ref offset); - obj.Length = data.ReadUInt32LittleEndian(ref offset); - obj.Unknown08h = data.ReadUInt32LittleEndian(ref offset); - obj.Unknown0Ch = data.ReadUInt32LittleEndian(ref offset); - obj.Unknown10h = data.ReadUInt32LittleEndian(ref offset); - obj.Unknown14h = data.ReadUInt32LittleEndian(ref offset); - obj.Unknown18h = data.ReadUInt32LittleEndian(ref offset); - obj.Unknown1Ch = data.ReadUInt32LittleEndian(ref offset); - obj.FileName = data.ReadNullTerminatedAnsiString(ref offset); - obj.Unknown2Ch = data.ReadUInt32LittleEndian(ref offset); - - return obj; - } - - #endregion - // TODO: Implement other resource types from https://learn.microsoft.com/en-us/windows/win32/menurc/resource-file-formats #region Resources diff --git a/SabreTools.Serialization/Models/SecuROM/AddD.cs b/SabreTools.Serialization/Models/SecuROM/AddD.cs index 0709578b..e1761801 100644 --- a/SabreTools.Serialization/Models/SecuROM/AddD.cs +++ b/SabreTools.Serialization/Models/SecuROM/AddD.cs @@ -1,6 +1,4 @@ -using System.Runtime.InteropServices; - -namespace SabreTools.Data.Models.SecuROM +namespace SabreTools.Data.Models.SecuROM { /// /// Overlay data associated with SecuROM executables @@ -27,16 +25,16 @@ namespace SabreTools.Data.Models.SecuROM public uint EntryCount { get; set; } /// - /// Version, always 8 bytes? + /// Version, null-terminated /// - [MarshalAs(UnmanagedType.LPStr)] - public string? Version; + /// Always 8 bytes? + public string? Version { get; set; } /// - /// Unknown (Build? Formatted as a string) + /// Build number /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public char[]? Build; + /// 4 bytes + public string? Build { get; set; } /// /// Unknown (0x14h), Variable number of bytes before entry table @@ -45,13 +43,13 @@ namespace SabreTools.Data.Models.SecuROM /// 44 bytes in EXPUNGED, 3.17.00.0017, 3.17.00.0019, 4.47.00.0039 /// 112 bytes in 4.84.00.0054, 4.84.69.0037, 4.84.76.7966, 4.84.76.7968, 4.85.07.0009 /// 112 byte range contains a fixed-length string at 0x2C, possibly a product ID? - /// "801400-001" in 4.84.00.0054 - /// "594130-001" in 4.84.69.0037 - /// "554900-001" in 4.84.76.7966 - /// "554900-001" in 4.84.76.7968 - /// "548520-001" in 4.85.07.0009 + /// "801400-001" in 4.84.00.0054 + /// "594130-001" in 4.84.69.0037 + /// "554900-001" in 4.84.76.7966 + /// "554900-001" in 4.84.76.7968 + /// "548520-001" in 4.85.07.0009 /// - public byte[]? Unknown14h { get; set; } + public byte[]? Unknown { get; set; } /// /// Entry table diff --git a/SabreTools.Serialization/Readers/SecuROMAddD.cs b/SabreTools.Serialization/Readers/SecuROMAddD.cs index 2b081640..771c4e06 100644 --- a/SabreTools.Serialization/Readers/SecuROMAddD.cs +++ b/SabreTools.Serialization/Readers/SecuROMAddD.cs @@ -19,7 +19,7 @@ namespace SabreTools.Serialization.Readers // Cache the current offset long initialOffset = data.Position; - var addD = ParseSecuROMAddD(data); + var addD = ParseAddD(data); if (addD.Signature != 0x44646441) return null; @@ -33,11 +33,11 @@ namespace SabreTools.Serialization.Readers } /// - /// Parse a Stream into an SecuROMAddD + /// Parse a Stream into an AddD /// /// Stream to parse - /// Filled SecuROMAddD on success, null on error - private static AddD ParseSecuROMAddD(Stream data) + /// Filled AddD on success, null on error + private static AddD ParseAddD(Stream data) { var obj = new AddD(); @@ -45,14 +45,15 @@ namespace SabreTools.Serialization.Readers obj.EntryCount = data.ReadUInt32LittleEndian(); obj.Version = data.ReadNullTerminatedAnsiString(); byte[] buildBytes = data.ReadBytes(4); - string buildStr = Encoding.ASCII.GetString(buildBytes); - obj.Build = buildStr.ToCharArray(); - obj.Unknown14h = data.ReadBytes(1); // TODO: Figure out how to determine how many bytes are here consistently + obj.Build = Encoding.ASCII.GetString(buildBytes); + + // TODO: Figure out how to determine how many bytes are here consistently + obj.Unknown = data.ReadBytes(1); obj.Entries = new AddDEntry[obj.EntryCount]; for (int i = 0; i < obj.Entries.Length; i++) { - var entry = ParseSecuROMAddDEntry(data); + var entry = ParseAddDEntry(data); obj.Entries[i] = entry; } @@ -60,11 +61,11 @@ namespace SabreTools.Serialization.Readers } /// - /// Parse a Stream into an SecuROMAddDEntry + /// Parse a Stream into an AddDEntry /// /// Stream to parse - /// Filled SecuROMAddDEntry on success, null on error - private static AddDEntry ParseSecuROMAddDEntry(Stream data) + /// Filled AddDEntry on success, null on error + private static AddDEntry ParseAddDEntry(Stream data) { var obj = new AddDEntry();