diff --git a/SabreTools.Serialization/Deserializers/PortableExecutable.cs b/SabreTools.Serialization/Deserializers/PortableExecutable.cs
index 273947c8..a0558dee 100644
--- a/SabreTools.Serialization/Deserializers/PortableExecutable.cs
+++ b/SabreTools.Serialization/Deserializers/PortableExecutable.cs
@@ -276,7 +276,7 @@ namespace SabreTools.Serialization.Deserializers
pex.ResourceDirectoryTable = ParseResourceDirectoryTable(tableData, ref tableOffset);
// Parse the resource data, if possible
- ParseResourceData(data, initialOffset, pex.ResourceDirectoryTable, pex.SectionTable);
+ ParseResourceData(tableData, ref tableOffset, offset, pex.ResourceDirectoryTable, pex.SectionTable);
#region Hidden Resources
@@ -1519,13 +1519,16 @@ namespace SabreTools.Serialization.Deserializers
///
/// Fill in resource data
///
- /// Stream to parse
- /// Initial offset to use in address comparisons
+ /// Byte array to parse
+ /// Offset into the byte array
+ /// Offset to the start of the table
/// Resource table to fill in
/// Section table to use for virtual address translation
/// Filled ResourceDataEntry on success, null on error
- public static void ParseResourceData(Stream data, long initialOffset, ResourceDirectoryTable? table, SectionHeader[] sections)
+ public static void ParseResourceData(byte[]? data, ref int dataOffset, long tableStart, ResourceDirectoryTable? table, SectionHeader[] sections)
{
+ if (data == null)
+ return;
if (table?.Entries == null)
return;
@@ -1535,14 +1538,14 @@ namespace SabreTools.Serialization.Deserializers
if (entry.DataEntry != null && entry.DataEntry.Size > 0)
{
// Read the data from the offset
- long dataOffset = initialOffset + entry.DataEntry.DataRVA.ConvertVirtualAddress(sections);
- if (dataOffset > initialOffset && dataOffset + entry.DataEntry.Size < data.Length)
- entry.DataEntry.Data = data.ReadFrom(dataOffset, (int)entry.DataEntry.Size, retainPosition: false);
+ dataOffset = (int)(entry.DataEntry.DataRVA.ConvertVirtualAddress(sections) - tableStart);
+ if (dataOffset > 0 && dataOffset + entry.DataEntry.Size < data.Length)
+ entry.DataEntry.Data = data.ReadBytes(ref dataOffset, (int)entry.DataEntry.Size);
}
// Handle subdirectories by recursion
else if (entry.Subdirectory != null)
- ParseResourceData(data, initialOffset, entry.Subdirectory, sections);
+ ParseResourceData(data, ref dataOffset, tableStart, entry.Subdirectory, sections);
}
}