From 64f52698c39f2e12cf5606ff4c5135bcbda93f9a Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sat, 10 Dec 2022 22:36:02 -0800 Subject: [PATCH] Add extension to convert byte array --- BurnOutSharp.Builder/Extensions.cs | 56 +++++++++++++++++++ .../PortableExecutable/SecuROMAddD.cs | 4 +- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/BurnOutSharp.Builder/Extensions.cs b/BurnOutSharp.Builder/Extensions.cs index 9fef7997..2d6b6243 100644 --- a/BurnOutSharp.Builder/Extensions.cs +++ b/BurnOutSharp.Builder/Extensions.cs @@ -391,6 +391,62 @@ namespace BurnOutSharp.Builder return 0; } + /// + /// Read resource data as a SecuROM AddD overlay data + /// + /// Data to parse into a resource header + /// Offset into the byte array + /// A filled SecuROM AddD overlay data on success, null on error + public static Models.PortableExecutable.SecuROMAddD AsSecuROMAddD(this byte[] data, ref int offset) + { + // If we have data that's invalid, we can't do anything + if (data == null) + return null; + + // Read in the table + var addD = new Models.PortableExecutable.SecuROMAddD(); + + addD.Signature = data.ReadUInt32(ref offset); + if (addD.Signature != 0x44646441) + return null; + + addD.EntryCount = data.ReadUInt32(ref offset); + addD.Version = data.ReadString(ref offset, Encoding.ASCII); + addD.Build = data.ReadBytes(ref offset, 4).Select(b => (char)b).ToArray(); + addD.Unknown14h = data.ReadUInt32(ref offset); + addD.Unknown18h = data.ReadUInt32(ref offset); + addD.Unknown1Ch = data.ReadUInt32(ref offset); + addD.Unknown20h = data.ReadUInt32(ref offset); + addD.Unknown24h = data.ReadUInt32(ref offset); + addD.Unknown28h = data.ReadUInt32(ref offset); + addD.Unknown2Ch = data.ReadUInt32(ref offset); + addD.Unknown30h = data.ReadUInt32(ref offset); + addD.Unknown34h = data.ReadUInt32(ref offset); + addD.Unknown38h = data.ReadUInt32(ref offset); + addD.Unknown3Ch = data.ReadUInt32(ref offset); + + addD.Entries = new Models.PortableExecutable.SecuROMAddDEntry[addD.EntryCount]; + for (int i = 0; i < addD.EntryCount; i++) + { + var addDEntry = new Models.PortableExecutable.SecuROMAddDEntry(); + + addDEntry.PhysicalOffset = data.ReadUInt32(ref offset); + addDEntry.Length = data.ReadUInt32(ref offset); + addDEntry.Unknown08h = data.ReadUInt32(ref offset); + addDEntry.Unknown0Ch = data.ReadUInt32(ref offset); + addDEntry.Unknown10h = data.ReadUInt32(ref offset); + addDEntry.Unknown14h = data.ReadUInt32(ref offset); + addDEntry.Unknown18h = data.ReadUInt32(ref offset); + addDEntry.Unknown1Ch = data.ReadUInt32(ref offset); + addDEntry.FileName = data.ReadString(ref offset, Encoding.ASCII); + addDEntry.Unknown2Ch = data.ReadUInt32(ref offset); + + addD.Entries[i] = addDEntry; + } + + return addD; + } + /// /// Read resource data as a resource header /// diff --git a/BurnOutSharp.Models/PortableExecutable/SecuROMAddD.cs b/BurnOutSharp.Models/PortableExecutable/SecuROMAddD.cs index 206f5b26..eb344ae5 100644 --- a/BurnOutSharp.Models/PortableExecutable/SecuROMAddD.cs +++ b/BurnOutSharp.Models/PortableExecutable/SecuROMAddD.cs @@ -16,7 +16,7 @@ namespace BurnOutSharp.Models.PortableExecutable /// /// "AddD", Identifier? /// - public uint AddD; + public uint Signature; /// /// Unknown (Entry count?) @@ -31,7 +31,7 @@ namespace BurnOutSharp.Models.PortableExecutable /// /// Unknown (Build? Formatted as a string) /// - public uint Build; + public char[] Build; /// /// Unknown (0x14)