Add PE message resource printing, fix parsing

This commit is contained in:
Matt Nadareski
2022-11-11 16:20:17 -08:00
parent eeb555a6ce
commit ecd1c93bb9
3 changed files with 61 additions and 7 deletions

View File

@@ -1167,7 +1167,7 @@ namespace BurnOutSharp.Builder
// Message resource entries
if (messageResourceData.Blocks != null && messageResourceData.Blocks.Length != 0)
{
var messageResourceEntries = new List<Models.PortableExecutable.MessageResourceEntry>();
var messageResourceEntries = new Dictionary<uint, Models.PortableExecutable.MessageResourceEntry>();
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;

View File

@@ -1,4 +1,6 @@
namespace BurnOutSharp.Models.PortableExecutable
using System.Collections.Generic;
namespace BurnOutSharp.Models.PortableExecutable
{
/// <summary>
/// Contains information about formatted text for display as an error message or in a message
@@ -20,6 +22,6 @@
/// <summary>
/// Message resource entries
/// </summary>
public MessageResourceEntry[] Entries;
public Dictionary<uint, MessageResourceEntry> Entries;
}
}

View File

@@ -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");