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 ///