From 6d989209dbb883211e8d4e9706c9bcbc8ef8c602 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sun, 10 Aug 2025 20:15:49 -0400 Subject: [PATCH] Update NE notes and structure a bit more --- SabreTools.Models/NewExecutable/Enums.cs | 1 + SabreTools.Models/NewExecutable/Executable.cs | 6 ++++ .../NewExecutable/ExecutableHeader.cs | 34 ++++++++++++------- .../NewExecutable/PerSegmentData.cs | 7 ++++ .../ResourceTypeResourceEntry.cs | 3 ++ .../NewExecutable/SegmentTableEntry.cs | 2 ++ 6 files changed, 40 insertions(+), 13 deletions(-) diff --git a/SabreTools.Models/NewExecutable/Enums.cs b/SabreTools.Models/NewExecutable/Enums.cs index fba30a9..f0c68c3 100644 --- a/SabreTools.Models/NewExecutable/Enums.cs +++ b/SabreTools.Models/NewExecutable/Enums.cs @@ -148,6 +148,7 @@ namespace SabreTools.Models.NewExecutable public enum OperatingSystem : byte { + Unknown = 0x00, OS2 = 0x01, WINDOWS = 0x02, EU_MSDOS4 = 0x03, diff --git a/SabreTools.Models/NewExecutable/Executable.cs b/SabreTools.Models/NewExecutable/Executable.cs index f30f126..83bfa84 100644 --- a/SabreTools.Models/NewExecutable/Executable.cs +++ b/SabreTools.Models/NewExecutable/Executable.cs @@ -11,6 +11,7 @@ namespace SabreTools.Models.NewExecutable /// modules in the system and to support dynamic linking. /// /// + /// public sealed class Executable { /// @@ -57,5 +58,10 @@ namespace SabreTools.Models.NewExecutable /// Nonresident-Name table /// public NonResidentNameTableEntry[]? NonResidentNameTable { get; set; } + + /// + /// Segment relocation data + /// + public PerSegmentData[]? SegmentRelocationData { get; set; } } } diff --git a/SabreTools.Models/NewExecutable/ExecutableHeader.cs b/SabreTools.Models/NewExecutable/ExecutableHeader.cs index 2ce2202..9fcb6b3 100644 --- a/SabreTools.Models/NewExecutable/ExecutableHeader.cs +++ b/SabreTools.Models/NewExecutable/ExecutableHeader.cs @@ -8,13 +8,12 @@ namespace SabreTools.Models.NewExecutable /// /// /// + /// [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public sealed class ExecutableHeader { /// - /// Signature word. - /// "N" is low-order byte. - /// "E" is high-order byte. + /// "NE" /// [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)] public string? Magic; @@ -22,20 +21,22 @@ namespace SabreTools.Models.NewExecutable /// /// Version number of the linker. /// + /// Also known as the major linker version public byte LinkerVersion; - + /// /// Revision number of the linker. /// + /// Also known as the minor linker version public byte LinkerRevision; - + /// /// Entry Table file offset, relative to the beginning of the segmented EXE header. /// public ushort EntryTableOffset; - + /// - /// Number of bytes in the entry table. + /// Length of entry table in bytes /// public ushort EntryTableSize; @@ -81,12 +82,15 @@ namespace SabreTools.Models.NewExecutable /// /// Segment number:offset of CS:IP. /// + /// CS:IP entry point, CS is index into segment table public uint InitialCSIPSetting; /// /// Segment number:offset of SS:SP. /// /// + /// SS:SP initial stack pointer, SS is index into segment table + /// /// If SS equals the automatic data segment and SP equals /// zero, the stack pointer is set to the top of the /// automatic data segment just below the additional heap @@ -105,7 +109,7 @@ namespace SabreTools.Models.NewExecutable public ushort ModuleReferenceTableSize; /// - /// Number of bytes in the Non-Resident Name Table. + /// Size of non-resident names table in bytes /// public ushort NonResidentNameTableSize; @@ -166,18 +170,20 @@ namespace SabreTools.Models.NewExecutable /// [MarshalAs(UnmanagedType.U1)] public OperatingSystem TargetOperatingSystem; - + + #region OS/2 Specific + /// /// Other OS/2 flags /// [MarshalAs(UnmanagedType.U1)] public OS2Flag AdditionalFlags; - + /// /// Offset to return thunks or start of gangload area /// public ushort ReturnThunkOffset; - + /// /// Offset to segment reference thunks or size of gangload area /// @@ -187,15 +193,17 @@ namespace SabreTools.Models.NewExecutable /// Minimum code swap area size /// public ushort MinCodeSwapAreaSize; - + /// /// Windows SDK revison number /// public byte WindowsSDKRevision; - + /// /// Windows SDK version number /// public byte WindowsSDKVersion; + + #endregion } } diff --git a/SabreTools.Models/NewExecutable/PerSegmentData.cs b/SabreTools.Models/NewExecutable/PerSegmentData.cs index 1075618..31cc18a 100644 --- a/SabreTools.Models/NewExecutable/PerSegmentData.cs +++ b/SabreTools.Models/NewExecutable/PerSegmentData.cs @@ -7,7 +7,14 @@ /// follow the segment data in the file. The relocation fixup information /// is defined as follows: /// + /// + /// To find the relocation data for a segment, seek to: + /// + /// * (1 << ) + /// + + /// /// + /// public sealed class PerSegmentData { /// diff --git a/SabreTools.Models/NewExecutable/ResourceTypeResourceEntry.cs b/SabreTools.Models/NewExecutable/ResourceTypeResourceEntry.cs index dbc3db5..a5cc660 100644 --- a/SabreTools.Models/NewExecutable/ResourceTypeResourceEntry.cs +++ b/SabreTools.Models/NewExecutable/ResourceTypeResourceEntry.cs @@ -7,6 +7,7 @@ namespace SabreTools.Models.NewExecutable /// the format of each resource (8 bytes each): /// /// + /// [StructLayout(LayoutKind.Sequential)] public sealed class ResourceTypeResourceEntry { @@ -16,11 +17,13 @@ namespace SabreTools.Models.NewExecutable /// of the alignment shift count value specified at /// beginning of the resource table. /// + /// Byte offset is: Offset * (1 << ) public ushort Offset; /// /// Length of the resource in the file (in bytes). /// + /// Byte length is: Length * (1 << ) public ushort Length; /// diff --git a/SabreTools.Models/NewExecutable/SegmentTableEntry.cs b/SabreTools.Models/NewExecutable/SegmentTableEntry.cs index 4cf7b08..6ca7e64 100644 --- a/SabreTools.Models/NewExecutable/SegmentTableEntry.cs +++ b/SabreTools.Models/NewExecutable/SegmentTableEntry.cs @@ -9,6 +9,7 @@ namespace SabreTools.Models.NewExecutable /// The following is the structure of a segment table entry. /// /// + /// [StructLayout(LayoutKind.Sequential)] public sealed class SegmentTableEntry { @@ -17,6 +18,7 @@ namespace SabreTools.Models.NewExecutable /// data, relative to the beginning of the file. Zero means no /// file data. /// + /// Byte offset is: Offset * (1 << ) public ushort Offset; ///