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