diff --git a/SabreTools.Serialization/Wrappers/NewExecutable.cs b/SabreTools.Serialization/Wrappers/NewExecutable.cs index dc9ff4f4..7413922f 100644 --- a/SabreTools.Serialization/Wrappers/NewExecutable.cs +++ b/SabreTools.Serialization/Wrappers/NewExecutable.cs @@ -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) diff --git a/SabreTools.Serialization/Wrappers/WrapperFactory.cs b/SabreTools.Serialization/Wrappers/WrapperFactory.cs index cc4641bc..6fc6222e 100644 --- a/SabreTools.Serialization/Wrappers/WrapperFactory.cs +++ b/SabreTools.Serialization/Wrappers/WrapperFactory.cs @@ -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); }