mirror of
https://github.com/SabreTools/SabreTools.Serialization.git
synced 2026-07-08 18:06:41 +00:00
Clean up some things around AddD
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user