using System.Collections.Generic; using System.IO; namespace BurnOutSharp.Wrappers { public class NewExecutable { #region Pass-Through Properties #region MS-DOS Stub #region Standard Fields /// public byte[] Stub_Magic => _executable.Stub.Header.Magic; /// public ushort Stub_LastPageBytes => _executable.Stub.Header.LastPageBytes; /// public ushort Stub_Pages => _executable.Stub.Header.Pages; /// public ushort Stub_RelocationItems => _executable.Stub.Header.RelocationItems; /// public ushort Stub_HeaderParagraphSize => _executable.Stub.Header.HeaderParagraphSize; /// public ushort Stub_MinimumExtraParagraphs => _executable.Stub.Header.MinimumExtraParagraphs; /// public ushort Stub_MaximumExtraParagraphs => _executable.Stub.Header.MaximumExtraParagraphs; /// public ushort Stub_InitialSSValue => _executable.Stub.Header.InitialSSValue; /// public ushort Stub_Stub_InitialSPValue => _executable.Stub.Header.InitialSPValue; /// public ushort Stub_Checksum => _executable.Stub.Header.Checksum; /// public ushort Stub_InitialIPValue => _executable.Stub.Header.InitialIPValue; /// public ushort Stub_InitialCSValue => _executable.Stub.Header.InitialCSValue; /// public ushort Stub_RelocationTableAddr => _executable.Stub.Header.RelocationTableAddr; /// public ushort Stub_OverlayNumber => _executable.Stub.Header.OverlayNumber; #endregion #region PE Extensions /// public ushort[] Stub_Reserved1 => _executable.Stub.Header.Reserved1; /// public ushort Stub_OEMIdentifier => _executable.Stub.Header.OEMIdentifier; /// public ushort Stub_OEMInformation => _executable.Stub.Header.OEMInformation; /// public ushort[] Stub_Reserved2 => _executable.Stub.Header.Reserved2; /// public uint Stub_NewExeHeaderAddr => _executable.Stub.Header.NewExeHeaderAddr; #endregion #endregion #region Header /// public byte[] Magic => _executable.Header.Magic; /// public byte LinkerVersion => _executable.Header.LinkerVersion; /// public byte LinkerRevision => _executable.Header.LinkerRevision; /// public ushort EntryTableOffset => _executable.Header.EntryTableOffset; /// public ushort EntryTableSize => _executable.Header.EntryTableSize; /// public uint CrcChecksum => _executable.Header.CrcChecksum; /// public Models.NewExecutable.HeaderFlag FlagWord => _executable.Header.FlagWord; /// public ushort AutomaticDataSegmentNumber => _executable.Header.AutomaticDataSegmentNumber; /// public ushort InitialHeapAlloc => _executable.Header.InitialHeapAlloc; /// public ushort InitialStackAlloc => _executable.Header.InitialStackAlloc; /// public uint InitialCSIPSetting => _executable.Header.InitialCSIPSetting; /// public uint InitialSSSPSetting => _executable.Header.InitialSSSPSetting; /// public ushort FileSegmentCount => _executable.Header.FileSegmentCount; /// public ushort ModuleReferenceTableSize => _executable.Header.ModuleReferenceTableSize; /// public ushort NonResidentNameTableSize => _executable.Header.NonResidentNameTableSize; /// public ushort SegmentTableOffset => _executable.Header.SegmentTableOffset; /// public ushort ResourceTableOffset => _executable.Header.ResourceTableOffset; /// public ushort ResidentNameTableOffset => _executable.Header.ResidentNameTableOffset; /// public ushort ModuleReferenceTableOffset => _executable.Header.ModuleReferenceTableOffset; /// public ushort ImportedNamesTableOffset => _executable.Header.ImportedNamesTableOffset; /// public uint NonResidentNamesTableOffset => _executable.Header.NonResidentNamesTableOffset; /// public ushort MovableEntriesCount => _executable.Header.MovableEntriesCount; /// public ushort SegmentAlignmentShiftCount => _executable.Header.SegmentAlignmentShiftCount; /// public ushort ResourceEntriesCount => _executable.Header.ResourceEntriesCount; /// public Models.NewExecutable.OperatingSystem TargetOperatingSystem => _executable.Header.TargetOperatingSystem; /// public Models.NewExecutable.OS2Flag AdditionalFlags => _executable.Header.AdditionalFlags; /// public ushort ReturnThunkOffset => _executable.Header.ReturnThunkOffset; /// public ushort SegmentReferenceThunkOffset => _executable.Header.SegmentReferenceThunkOffset; /// public ushort MinCodeSwapAreaSize => _executable.Header.MinCodeSwapAreaSize; /// public byte WindowsSDKRevision => _executable.Header.WindowsSDKRevision; /// public byte WindowsSDKVersion => _executable.Header.WindowsSDKVersion; #endregion #region Tables /// public Models.NewExecutable.SegmentTableEntry[] SegmentTable => _executable.SegmentTable; /// public Models.NewExecutable.ResourceTable ResourceTable => _executable.ResourceTable; /// public Models.NewExecutable.ResidentNameTableEntry[] ResidentNameTable => _executable.ResidentNameTable; /// public Models.NewExecutable.ModuleReferenceTableEntry[] ModuleReferenceTable => _executable.ModuleReferenceTable; /// public Dictionary ImportedNameTable => _executable.ImportedNameTable; /// public Models.NewExecutable.EntryTableBundle[] EntryTable => _executable.EntryTable; /// public Models.NewExecutable.NonResidentNameTableEntry[] NonResidentNameTable => _executable.NonResidentNameTable; #endregion #endregion #region Extension Properties // TODO: Determine what extension properties are needed #endregion #region Instance Variables /// /// Internal representation of the executable /// private Models.NewExecutable.Executable _executable; #endregion /// /// Private constructor /// private NewExecutable() { } /// /// Create an NE executable from a byte array and offset /// /// Byte array representing the executable /// Offset within the array to parse /// An NE executable wrapper on success, null on failure public static NewExecutable Create(byte[] data, int offset) { var executable = Builder.NewExecutable.ParseExecutable(data, offset); if (executable == null) return null; var wrapper = new NewExecutable { _executable = executable }; return wrapper; } /// /// Create an NE executable from a Stream /// /// Stream representing the executable /// An NE executable wrapper on success, null on failure public static NewExecutable Create(Stream data) { var executable = Builder.NewExecutable.ParseExecutable(data); if (executable == null) return null; var wrapper = new NewExecutable { _executable = executable }; return wrapper; } } }