Fix CreateExecutableWrapper

This commit is contained in:
Matt Nadareski
2025-08-19 09:18:50 -04:00
parent cd7e6ff98d
commit 1227ca020a
2 changed files with 9 additions and 6 deletions

View File

@@ -53,7 +53,7 @@ namespace SabreTools.Serialization.Wrappers
foreach (var entry in SegmentTable)
{
// Get end of segment data
long offset = entry.Offset * (1 << Header.SegmentAlignmentShiftCount) + entry.Length;
long offset = _initialPosition + (entry.Offset * (1 << Header.SegmentAlignmentShiftCount)) + entry.Length;
// Read and find the end of the relocation data
if ((entry.FlagWord & SegmentTableEntryFlag.RELOCINFO) != 0)

View File

@@ -75,17 +75,20 @@ namespace SabreTools.Serialization.Wrappers
if (stream == null)
return null;
// Cache the current offset
long initialOffset = stream.Position;
// Try to get an MS-DOS wrapper first
var wrapper = MSDOS.Create(stream);
if (wrapper == null || wrapper is not MSDOS msdos)
return null;
// Check for a valid new executable address
if (msdos.Model.Header?.NewExeHeaderAddr == null || msdos.Model.Header.NewExeHeaderAddr >= stream.Length)
if (msdos.Model.Header?.NewExeHeaderAddr == null || initialOffset + msdos.Model.Header.NewExeHeaderAddr >= stream.Length)
return wrapper;
// Try to read the executable info
stream.Seek(msdos.Model.Header.NewExeHeaderAddr, SeekOrigin.Begin);
stream.Seek(initialOffset + msdos.Model.Header.NewExeHeaderAddr, SeekOrigin.Begin);
var magic = stream.ReadBytes(4);
// If we didn't get valid data at the offset
@@ -97,7 +100,7 @@ namespace SabreTools.Serialization.Wrappers
// New Executable
else if (magic.StartsWith(Models.NewExecutable.Constants.SignatureBytes))
{
stream.Seek(0, SeekOrigin.Begin);
stream.Seek(initialOffset, SeekOrigin.Begin);
return NewExecutable.Create(stream);
}
@@ -105,14 +108,14 @@ namespace SabreTools.Serialization.Wrappers
else if (magic.StartsWith(Models.LinearExecutable.Constants.LESignatureBytes)
|| magic.StartsWith(Models.LinearExecutable.Constants.LXSignatureBytes))
{
stream.Seek(0, SeekOrigin.Begin);
stream.Seek(initialOffset, SeekOrigin.Begin);
return LinearExecutable.Create(stream);
}
// Portable Executable
else if (magic.StartsWith(Models.PortableExecutable.Constants.SignatureBytes))
{
stream.Seek(0, SeekOrigin.Begin);
stream.Seek(initialOffset, SeekOrigin.Begin);
return PortableExecutable.Create(stream);
}