diff --git a/BurnOutSharp.Builder/Extensions.cs b/BurnOutSharp.Builder/Extensions.cs
index ff03bc30..5fada02f 100644
--- a/BurnOutSharp.Builder/Extensions.cs
+++ b/BurnOutSharp.Builder/Extensions.cs
@@ -1127,6 +1127,73 @@ namespace BurnOutSharp.Builder
return menuResource;
}
+ ///
+ /// Read resource data as a message table resource
+ ///
+ /// Resource data entry to parse into a message table resource
+ /// A filled message table resource on success, null on error
+ public static Models.PortableExecutable.MessageResourceData AsMessageResourceData(this Models.PortableExecutable.ResourceDataEntry entry)
+ {
+ // If we have an invalid entry, just skip
+ if (entry?.Data == null)
+ return null;
+
+ // Initialize the iterator
+ int offset = 0;
+
+ // Create the output object
+ var messageResourceData = new Models.PortableExecutable.MessageResourceData();
+
+ // Message resource blocks
+ messageResourceData.NumberOfBlocks = entry.Data.ReadUInt32(ref offset);
+ if (messageResourceData.NumberOfBlocks > 0)
+ {
+ var messageResourceBlocks = new List();
+
+ for (int i = 0; i < messageResourceData.NumberOfBlocks; i++)
+ {
+ var messageResourceBlock = new Models.PortableExecutable.MessageResourceBlock();
+
+ messageResourceBlock.LowId = entry.Data.ReadUInt32(ref offset);
+ messageResourceBlock.HighId = entry.Data.ReadUInt32(ref offset);
+ messageResourceBlock.OffsetToEntries = entry.Data.ReadUInt32(ref offset);
+
+ messageResourceBlocks.Add(messageResourceBlock);
+ }
+
+ messageResourceData.Blocks = messageResourceBlocks.ToArray();
+ }
+
+ // Message resource entries
+ if (messageResourceData.Blocks != null && messageResourceData.Blocks.Length != 0)
+ {
+ var messageResourceEntries = new List();
+
+ for (int i = 0; i < messageResourceData.Blocks.Length; i++)
+ {
+ var messageResourceBlock = messageResourceData.Blocks[i];
+ offset = (int)messageResourceBlock.OffsetToEntries;
+
+ for (uint j = messageResourceBlock.LowId; j <= messageResourceBlock.HighId; j++)
+ {
+ var messageResourceEntry = new Models.PortableExecutable.MessageResourceEntry();
+
+ messageResourceEntry.Length = entry.Data.ReadUInt16(ref offset);
+ messageResourceEntry.Flags = entry.Data.ReadUInt16(ref offset);
+
+ Encoding textEncoding = messageResourceEntry.Flags == 0x0001 ? Encoding.Unicode : Encoding.ASCII;
+ messageResourceEntry.Text = entry.Data.ReadString(ref offset, textEncoding);
+
+ messageResourceEntries.Add(messageResourceEntry);
+ }
+ }
+
+ messageResourceData.Entries = messageResourceEntries.ToArray();
+ }
+
+ return messageResourceData;
+ }
+
///
/// Read resource data as a string table resource
///