diff --git a/BurnOutSharp.Builder/Extensions.cs b/BurnOutSharp.Builder/Extensions.cs index 5fada02f..a0893db9 100644 --- a/BurnOutSharp.Builder/Extensions.cs +++ b/BurnOutSharp.Builder/Extensions.cs @@ -1167,7 +1167,7 @@ namespace BurnOutSharp.Builder // Message resource entries if (messageResourceData.Blocks != null && messageResourceData.Blocks.Length != 0) { - var messageResourceEntries = new List(); + var messageResourceEntries = new Dictionary(); for (int i = 0; i < messageResourceData.Blocks.Length; i++) { @@ -1182,13 +1182,14 @@ namespace BurnOutSharp.Builder messageResourceEntry.Flags = entry.Data.ReadUInt16(ref offset); Encoding textEncoding = messageResourceEntry.Flags == 0x0001 ? Encoding.Unicode : Encoding.ASCII; - messageResourceEntry.Text = entry.Data.ReadString(ref offset, textEncoding); + byte[] textArray = entry.Data.ReadBytes(ref offset, messageResourceEntry.Length - 4); + messageResourceEntry.Text = textEncoding.GetString(textArray); - messageResourceEntries.Add(messageResourceEntry); + messageResourceEntries[j] = messageResourceEntry; } } - messageResourceData.Entries = messageResourceEntries.ToArray(); + messageResourceData.Entries = messageResourceEntries; } return messageResourceData; diff --git a/BurnOutSharp.Models/PortableExecutable/MessageResourceData.cs b/BurnOutSharp.Models/PortableExecutable/MessageResourceData.cs index fb5b182f..86e30bd0 100644 --- a/BurnOutSharp.Models/PortableExecutable/MessageResourceData.cs +++ b/BurnOutSharp.Models/PortableExecutable/MessageResourceData.cs @@ -1,4 +1,6 @@ -namespace BurnOutSharp.Models.PortableExecutable +using System.Collections.Generic; + +namespace BurnOutSharp.Models.PortableExecutable { /// /// Contains information about formatted text for display as an error message or in a message @@ -20,6 +22,6 @@ /// /// Message resource entries /// - public MessageResourceEntry[] Entries; + public Dictionary Entries; } } diff --git a/ExecutableTest/Program.cs b/ExecutableTest/Program.cs index 50fc5de4..b19cda22 100644 --- a/ExecutableTest/Program.cs +++ b/ExecutableTest/Program.cs @@ -1429,7 +1429,58 @@ namespace ExecutableTest Console.WriteLine($"{padding}Application-defined resource found, not parsed yet"); break; case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_MESSAGETABLE: - Console.WriteLine($"{padding}Message-table entry found, not parsed yet"); + var messageTable = entry.AsMessageResourceData(); + if (messageTable == null) + { + Console.WriteLine($"{padding}Message resource data found, but malformed"); + } + else + { + Console.WriteLine($"{padding}Number of blocks: {messageTable.NumberOfBlocks}"); + Console.WriteLine(); + Console.WriteLine($"{padding}Message resource blocks"); + Console.WriteLine($"{padding}-------------------------"); + if (messageTable.NumberOfBlocks == 0 + || messageTable.Blocks == null + || messageTable.Blocks.Length == 0) + { + Console.WriteLine($"{padding}No message resource blocks"); + } + else + { + for (int i = 0; i < messageTable.Blocks.Length; i++) + { + var messageResourceBlock = messageTable.Blocks[i]; + + Console.WriteLine($"{padding}Message resource block {i}"); + Console.WriteLine($"{padding} Low ID: {messageResourceBlock.LowId}"); + Console.WriteLine($"{padding} High ID: {messageResourceBlock.HighId}"); + Console.WriteLine($"{padding} Offset to entries: {messageResourceBlock.OffsetToEntries}"); + } + } + Console.WriteLine(); + + Console.WriteLine($"{padding}Message resource entries"); + Console.WriteLine($"{padding}-------------------------"); + if (messageTable.Entries == null + || messageTable.Entries.Count == 0) + { + Console.WriteLine($"{padding}No message resource entries"); + } + else + { + foreach (var kvp in messageTable.Entries) + { + uint index = kvp.Key; + var messageResourceEntry = kvp.Value; + + Console.WriteLine($"{padding}Message resource entry {index}"); + Console.WriteLine($"{padding} Length: {messageResourceEntry.Length}"); + Console.WriteLine($"{padding} Flags: {messageResourceEntry.Flags}"); + Console.WriteLine($"{padding} Text: {messageResourceEntry.Text}"); + } + } + } break; case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_GROUP_CURSOR: Console.WriteLine($"{padding}Hardware-independent cursor resource found, not parsed yet");