Do the same for assembly manifest

This commit is contained in:
Matt Nadareski
2026-02-12 15:50:24 -05:00
parent f0a0fc3137
commit b91c060dad
4 changed files with 22 additions and 27 deletions

View File

@@ -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
/// <summary>
/// Read resource data as a side-by-side assembly manifest
/// </summary>
/// <param name="entry">Resource data entry to parse into a side-by-side assembly manifest</param>
/// <returns>A filled side-by-side assembly manifest on success, null on error</returns>
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;
}
}
/// <summary>
/// Read resource data as a string table resource
/// </summary>

View File

@@ -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;
}
/// <summary>
/// Parse a byte array into an AssemblyManifest
/// </summary>
/// <param name="data">Byte array to parse</param>
/// <param name="offset">Offset into the byte array</param>
/// <returns>Filled AssemblyManifest on success, null on error</returns>
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;
}
}
/// <summary>
/// Parse a byte array into an attribute certificate table
/// </summary>

View File

@@ -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)
{

View File

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