From b91c060dad28d6af205c9f514bb09e507a9a7005 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Thu, 12 Feb 2026 15:50:24 -0500 Subject: [PATCH] Do the same for assembly manifest --- .../Extensions/PortableExecutable.cs | 25 ------------------- .../Readers/PortableExecutable.cs | 20 +++++++++++++++ .../Wrappers/PortableExecutable.Printing.cs | 2 +- .../Wrappers/PortableExecutable.cs | 2 +- 4 files changed, 22 insertions(+), 27 deletions(-) diff --git a/SabreTools.Serialization/Extensions/PortableExecutable.cs b/SabreTools.Serialization/Extensions/PortableExecutable.cs index ed865f3a..b77a0b26 100644 --- a/SabreTools.Serialization/Extensions/PortableExecutable.cs +++ b/SabreTools.Serialization/Extensions/PortableExecutable.cs @@ -1,10 +1,7 @@ using System; using System.Collections.Generic; -using System.IO; -using System.Xml.Serialization; using SabreTools.Data.Models.COFF; using SabreTools.Data.Models.PortableExecutable; -using SabreTools.Data.Models.PortableExecutable.Resource.Entries; using SabreTools.IO.Extensions; #pragma warning disable IDE0017 // Simplify object initialization @@ -151,28 +148,6 @@ namespace SabreTools.Data.Extensions // TODO: Implement other resource types from https://learn.microsoft.com/en-us/windows/win32/menurc/resource-file-formats #region Resources - /// - /// Read resource data as a side-by-side assembly manifest - /// - /// Resource data entry to parse into a side-by-side assembly manifest - /// A filled side-by-side assembly manifest on success, null on error - public static AssemblyManifest? AsAssemblyManifest(this Models.PortableExecutable.Resource.DataEntry? entry) - { - // If we have an invalid entry, just skip - if (entry?.Data is null) - return null; - - try - { - var serializer = new XmlSerializer(typeof(AssemblyManifest)); - return serializer.Deserialize(new MemoryStream(entry.Data)) as AssemblyManifest; - } - catch - { - return null; - } - } - /// /// Read resource data as a string table resource /// diff --git a/SabreTools.Serialization/Readers/PortableExecutable.cs b/SabreTools.Serialization/Readers/PortableExecutable.cs index 2fbf4d31..3e5bebf3 100644 --- a/SabreTools.Serialization/Readers/PortableExecutable.cs +++ b/SabreTools.Serialization/Readers/PortableExecutable.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Text; +using System.Xml.Serialization; using SabreTools.Data.Extensions; using SabreTools.Data.Models.COFF; using SabreTools.Data.Models.COFF.SymbolTableEntries; @@ -521,6 +522,25 @@ namespace SabreTools.Serialization.Readers return obj; } + /// + /// Parse a byte array into an AssemblyManifest + /// + /// Byte array to parse + /// Offset into the byte array + /// Filled AssemblyManifest on success, null on error + public static Data.Models.PortableExecutable.Resource.Entries.AssemblyManifest? ParseAssemblyManifest(byte[] data) + { + try + { + var serializer = new XmlSerializer(typeof(Data.Models.PortableExecutable.Resource.Entries.AssemblyManifest)); + return serializer.Deserialize(new MemoryStream(data)) as Data.Models.PortableExecutable.Resource.Entries.AssemblyManifest; + } + catch + { + return null; + } + } + /// /// Parse a byte array into an attribute certificate table /// diff --git a/SabreTools.Serialization/Wrappers/PortableExecutable.Printing.cs b/SabreTools.Serialization/Wrappers/PortableExecutable.Printing.cs index 6a1da020..dd1e41b1 100644 --- a/SabreTools.Serialization/Wrappers/PortableExecutable.Printing.cs +++ b/SabreTools.Serialization/Wrappers/PortableExecutable.Printing.cs @@ -1645,7 +1645,7 @@ namespace SabreTools.Serialization.Wrappers string padding = new(' ', (level + 1) * 2); AssemblyManifest? assemblyManifest = null; - try { assemblyManifest = entry.AsAssemblyManifest(); } catch { } + try { assemblyManifest = Readers.PortableExecutable.ParseAssemblyManifest(entry.Data); } catch { } if (assemblyManifest is null) { diff --git a/SabreTools.Serialization/Wrappers/PortableExecutable.cs b/SabreTools.Serialization/Wrappers/PortableExecutable.cs index 503b567f..83b605c2 100644 --- a/SabreTools.Serialization/Wrappers/PortableExecutable.cs +++ b/SabreTools.Serialization/Wrappers/PortableExecutable.cs @@ -1940,7 +1940,7 @@ namespace SabreTools.Serialization.Wrappers value = entry.Data; break; case ResourceType.RT_MANIFEST: - _assemblyManifest = entry.AsAssemblyManifest(); + _assemblyManifest = Readers.PortableExecutable.ParseAssemblyManifest(entry.Data); value = _assemblyManifest; break;