Clean up some things around AddD

This commit is contained in:
Matt Nadareski
2025-09-27 21:46:03 -04:00
parent 2b9a527743
commit 46b1838d72
3 changed files with 25 additions and 100 deletions

View File

@@ -149,80 +149,6 @@ namespace SabreTools.Data.Extensions
#endregion
#region Overlay
/// <summary>
/// Parse a byte array into a SecuROMAddD
/// </summary>
/// <param name="data">Data to parse into overlay data</param>
/// <param name="offset">Offset into the byte array</param>
/// <returns>A filled SecuROMAddD on success, null on error</returns>
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;
}
/// <summary>
/// Parse a byte array into a SecuROMAddDEntry
/// </summary>
/// <param name="data">Data to parse</param>
/// <param name="offset">Offset into the byte array</param>
/// <returns>Filled SecuROMAddDEntry on success, null on error</returns>
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

View File

@@ -1,6 +1,4 @@
using System.Runtime.InteropServices;
namespace SabreTools.Data.Models.SecuROM
namespace SabreTools.Data.Models.SecuROM
{
/// <summary>
/// Overlay data associated with SecuROM executables
@@ -27,16 +25,16 @@ namespace SabreTools.Data.Models.SecuROM
public uint EntryCount { get; set; }
/// <summary>
/// Version, always 8 bytes?
/// Version, null-terminated
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public string? Version;
/// <remarks>Always 8 bytes?</remarks>
public string? Version { get; set; }
/// <summary>
/// Unknown (Build? Formatted as a string)
/// Build number
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public char[]? Build;
/// <remarks>4 bytes</remarks>
public string? Build { get; set; }
/// <summary>
/// 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
/// </remarks>
public byte[]? Unknown14h { get; set; }
public byte[]? Unknown { get; set; }
/// <summary>
/// Entry table

View File

@@ -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
}
/// <summary>
/// Parse a Stream into an SecuROMAddD
/// Parse a Stream into an AddD
/// </summary>
/// <param name="data">Stream to parse</param>
/// <returns>Filled SecuROMAddD on success, null on error</returns>
private static AddD ParseSecuROMAddD(Stream data)
/// <returns>Filled AddD on success, null on error</returns>
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
}
/// <summary>
/// Parse a Stream into an SecuROMAddDEntry
/// Parse a Stream into an AddDEntry
/// </summary>
/// <param name="data">Stream to parse</param>
/// <returns>Filled SecuROMAddDEntry on success, null on error</returns>
private static AddDEntry ParseSecuROMAddDEntry(Stream data)
/// <returns>Filled AddDEntry on success, null on error</returns>
private static AddDEntry ParseAddDEntry(Stream data)
{
var obj = new AddDEntry();