diff --git a/SabreTools.Serialization/Extensions.PortableExecutable.cs b/SabreTools.Serialization/Extensions.PortableExecutable.cs index b1604ead..d24e1815 100644 --- a/SabreTools.Serialization/Extensions.PortableExecutable.cs +++ b/SabreTools.Serialization/Extensions.PortableExecutable.cs @@ -92,6 +92,65 @@ namespace SabreTools.Serialization return -1; } + #region Debug + + /// + /// Read debug data as an NB10 Program Database + /// + /// Data to parse into a database + /// Offset into the byte array + /// A filled NB10 Program Database on success, null on error + public static NB10ProgramDatabase? AsNB10ProgramDatabase(this byte[] data, ref int offset) + { + // If we have data that's invalid, we can't do anything + if (data == null) + return null; + + var nb10ProgramDatabase = new NB10ProgramDatabase(); + + nb10ProgramDatabase.Signature = data.ReadUInt32(ref offset); + if (nb10ProgramDatabase.Signature != 0x3031424E) + return null; + + nb10ProgramDatabase.Offset = data.ReadUInt32(ref offset); + nb10ProgramDatabase.Timestamp = data.ReadUInt32(ref offset); + nb10ProgramDatabase.Age = data.ReadUInt32(ref offset); + nb10ProgramDatabase.PdbFileName = data.ReadString(ref offset, Encoding.ASCII); // TODO: Actually null-terminated UTF-8? + + return nb10ProgramDatabase; + } + + /// + /// Read debug data as an RSDS Program Database + /// + /// Data to parse into a database + /// Offset into the byte array + /// A filled RSDS Program Database on success, null on error + public static RSDSProgramDatabase? AsRSDSProgramDatabase(this byte[]? data, ref int offset) + { + // If we have data that's invalid, we can't do anything + if (data == null) + return null; + + var rsdsProgramDatabase = new RSDSProgramDatabase(); + + rsdsProgramDatabase.Signature = data.ReadUInt32(ref offset); + if (rsdsProgramDatabase.Signature != 0x53445352) + return null; + + var guid = data.ReadBytes(ref offset, 0x10); + if (guid != null) + rsdsProgramDatabase.GUID = new Guid(guid); + rsdsProgramDatabase.Age = data.ReadUInt32(ref offset); + rsdsProgramDatabase.PathAndFileName = data.ReadString(ref offset, Encoding.ASCII); // TODO: Actually null-terminated UTF-8 + + return rsdsProgramDatabase; + } + + #endregion + + #region Overlay + /// /// Read overlay data as a SecuROM AddD overlay data /// @@ -153,61 +212,6 @@ namespace SabreTools.Serialization return addD; } - #region Debug - - /// - /// Read debug data as an NB10 Program Database - /// - /// Data to parse into a database - /// Offset into the byte array - /// A filled NB10 Program Database on success, null on error - public static NB10ProgramDatabase? AsNB10ProgramDatabase(this byte[] data, ref int offset) - { - // If we have data that's invalid, we can't do anything - if (data == null) - return null; - - var nb10ProgramDatabase = new NB10ProgramDatabase(); - - nb10ProgramDatabase.Signature = data.ReadUInt32(ref offset); - if (nb10ProgramDatabase.Signature != 0x3031424E) - return null; - - nb10ProgramDatabase.Offset = data.ReadUInt32(ref offset); - nb10ProgramDatabase.Timestamp = data.ReadUInt32(ref offset); - nb10ProgramDatabase.Age = data.ReadUInt32(ref offset); - nb10ProgramDatabase.PdbFileName = data.ReadString(ref offset, Encoding.ASCII); // TODO: Actually null-terminated UTF-8? - - return nb10ProgramDatabase; - } - - /// - /// Read debug data as an RSDS Program Database - /// - /// Data to parse into a database - /// Offset into the byte array - /// A filled RSDS Program Database on success, null on error - public static RSDSProgramDatabase? AsRSDSProgramDatabase(this byte[]? data, ref int offset) - { - // If we have data that's invalid, we can't do anything - if (data == null) - return null; - - var rsdsProgramDatabase = new RSDSProgramDatabase(); - - rsdsProgramDatabase.Signature = data.ReadUInt32(ref offset); - if (rsdsProgramDatabase.Signature != 0x53445352) - return null; - - var guid = data.ReadBytes(ref offset, 0x10); - if (guid != null) - rsdsProgramDatabase.GUID = new Guid(guid); - rsdsProgramDatabase.Age = data.ReadUInt32(ref offset); - rsdsProgramDatabase.PathAndFileName = data.ReadString(ref offset, Encoding.ASCII); // TODO: Actually null-terminated UTF-8 - - return rsdsProgramDatabase; - } - #endregion // TODO: Implement other resource types from https://learn.microsoft.com/en-us/windows/win32/menurc/resource-file-formats