From 3a485d34a103f72d34fb69307c3002f03844c2e4 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Thu, 12 Feb 2026 12:27:36 -0500 Subject: [PATCH] Correct a couple of things --- .../Resource/DirectoryEntry.cs | 1 + .../Readers/PortableExecutable.cs | 25 ++++++++----------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/SabreTools.Serialization/Models/PortableExecutable/Resource/DirectoryEntry.cs b/SabreTools.Serialization/Models/PortableExecutable/Resource/DirectoryEntry.cs index b7c2e0a7..1e3f416a 100644 --- a/SabreTools.Serialization/Models/PortableExecutable/Resource/DirectoryEntry.cs +++ b/SabreTools.Serialization/Models/PortableExecutable/Resource/DirectoryEntry.cs @@ -17,6 +17,7 @@ /// IMAGE_DIRECTORY_ENTRY_RESOURCE DataDirectory. /// /// + /// public sealed class DirectoryEntry { #region Offset 0x00 diff --git a/SabreTools.Serialization/Readers/PortableExecutable.cs b/SabreTools.Serialization/Readers/PortableExecutable.cs index 4e28f96e..84106814 100644 --- a/SabreTools.Serialization/Readers/PortableExecutable.cs +++ b/SabreTools.Serialization/Readers/PortableExecutable.cs @@ -326,8 +326,9 @@ namespace SabreTools.Serialization.Readers tableData, ref tableOffset, offset, - (int)optionalHeader.ResourceTable.Size, - pex.ResourceDirectoryTable, pex.SectionTable); + optionalHeader.ResourceTable.Size, + pex.ResourceDirectoryTable, + pex.SectionTable); #region Hidden Resources @@ -1513,21 +1514,16 @@ namespace SabreTools.Serialization.Readers /// /// Byte array to parse /// Offset into the byte array - /// Indicates if the value is a name entry or not /// Filled ResourceDirectoryEntry on success, null on error - public static Data.Models.PortableExecutable.Resource.DirectoryEntry ParseResourceDirectoryEntry(byte[] data, ref int offset, bool nameEntry) + public static Data.Models.PortableExecutable.Resource.DirectoryEntry ParseResourceDirectoryEntry(byte[] data, ref int offset) { var obj = new Data.Models.PortableExecutable.Resource.DirectoryEntry(); - // TODO: Figure out why the high bit is set for names - // The original version of this code also had this fix, but there - // was no comment or documentation as to why. The official MSDN - // documentation makes no mention of the high bit being set here, - // only for the offset below. - if (nameEntry) - obj.NameOffset = data.ReadUInt32LittleEndian(ref offset) & ~0x80000000U; + uint nameField = data.ReadUInt32LittleEndian(ref offset); + if ((nameField & 0x80000000) != 0) + obj.NameOffset = nameField & ~0x80000000U; else - obj.IntegerID = data.ReadUInt32LittleEndian(ref offset); + obj.IntegerID = nameField; uint offsetField = data.ReadUInt32LittleEndian(ref offset); if ((offsetField & 0x80000000) != 0) @@ -1587,11 +1583,10 @@ namespace SabreTools.Serialization.Readers // Perform top-level pass of data for (int i = 0; i < totalEntryCount; i++) { - bool nameEntry = i < obj.NumberOfNameEntries; - obj.Entries[i] = ParseResourceDirectoryEntry(tableData, ref offset, nameEntry); + obj.Entries[i] = ParseResourceDirectoryEntry(tableData, ref offset); // Read the name from the offset, if needed - if (nameEntry && obj.Entries[i].NameOffset > 0 && obj.Entries[i].NameOffset < tableData.Length) + if (obj.Entries[i].NameOffset > 0 && obj.Entries[i].NameOffset < tableData.Length) { int nameOffset = (int)obj.Entries[i].NameOffset; obj.Entries[i].Name = ParseResourceDirectoryString(tableData, ref nameOffset);