using System.IO; namespace BurnOutSharp.Wrappers { public class LinearExecutable : WrapperBase { #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_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 Information Block /// public char[] Signature => _executable.InformationBlock.Signature; /// public Models.LinearExecutable.ByteOrder ByteOrder => _executable.InformationBlock.ByteOrder; /// public Models.LinearExecutable.WordOrder WordOrder => _executable.InformationBlock.WordOrder; /// public uint ExecutableFormatLevel => _executable.InformationBlock.ExecutableFormatLevel; /// public Models.LinearExecutable.CPUType CPUType => _executable.InformationBlock.CPUType; /// public Models.LinearExecutable.OperatingSystem ModuleOS => _executable.InformationBlock.ModuleOS; /// public uint ModuleVersion => _executable.InformationBlock.ModuleVersion; /// public Models.LinearExecutable.ModuleFlags ModuleTypeFlags => _executable.InformationBlock.ModuleTypeFlags; /// public uint ModuleNumberPages => _executable.InformationBlock.ModuleNumberPages; /// public uint InitialObjectCS => _executable.InformationBlock.InitialObjectCS; /// public uint InitialEIP => _executable.InformationBlock.InitialEIP; /// public uint InitialObjectSS => _executable.InformationBlock.InitialObjectSS; /// public uint InitialESP => _executable.InformationBlock.InitialESP; /// public uint MemoryPageSize => _executable.InformationBlock.MemoryPageSize; /// public uint BytesOnLastPage => _executable.InformationBlock.BytesOnLastPage; /// public uint FixupSectionSize => _executable.InformationBlock.FixupSectionSize; /// public uint FixupSectionChecksum => _executable.InformationBlock.FixupSectionChecksum; /// public uint LoaderSectionSize => _executable.InformationBlock.LoaderSectionSize; /// public uint LoaderSectionChecksum => _executable.InformationBlock.LoaderSectionChecksum; /// public uint ObjectTableOffset => _executable.InformationBlock.ObjectTableOffset; /// public uint ObjectTableCount => _executable.InformationBlock.ObjectTableCount; /// public uint ObjectPageMapOffset => _executable.InformationBlock.ObjectPageMapOffset; /// public uint ObjectIterateDataMapOffset => _executable.InformationBlock.ObjectIterateDataMapOffset; /// public uint ResourceTableOffset => _executable.InformationBlock.ResourceTableOffset; /// public uint ResourceTableCount => _executable.InformationBlock.ResourceTableCount; /// public uint ResidentNamesTableOffset => _executable.InformationBlock.ResidentNamesTableOffset; /// public uint EntryTableOffset => _executable.InformationBlock.EntryTableOffset; /// public uint ModuleDirectivesTableOffset => _executable.InformationBlock.ModuleDirectivesTableOffset; /// public uint ModuleDirectivesCount => _executable.InformationBlock.ModuleDirectivesCount; /// public uint FixupPageTableOffset => _executable.InformationBlock.FixupPageTableOffset; /// public uint FixupRecordTableOffset => _executable.InformationBlock.FixupRecordTableOffset; /// public uint ImportedModulesNameTableOffset => _executable.InformationBlock.ImportedModulesNameTableOffset; /// public uint ImportedModulesCount => _executable.InformationBlock.ImportedModulesCount; /// public uint ImportProcedureNameTableOffset => _executable.InformationBlock.ImportProcedureNameTableOffset; /// public uint PerPageChecksumTableOffset => _executable.InformationBlock.PerPageChecksumTableOffset; /// public uint DataPagesOffset => _executable.InformationBlock.DataPagesOffset; /// public uint PreloadPageCount => _executable.InformationBlock.PreloadPageCount; /// public uint NonResidentNamesTableOffset => _executable.InformationBlock.NonResidentNamesTableOffset; /// public uint NonResidentNamesTableLength => _executable.InformationBlock.NonResidentNamesTableLength; /// public uint NonResidentNamesTableChecksum => _executable.InformationBlock.NonResidentNamesTableChecksum; /// public uint AutomaticDataObject => _executable.InformationBlock.AutomaticDataObject; /// public uint DebugInformationOffset => _executable.InformationBlock.DebugInformationOffset; /// public uint DebugInformationLength => _executable.InformationBlock.DebugInformationLength; /// public uint PreloadInstancePagesNumber => _executable.InformationBlock.PreloadInstancePagesNumber; /// public uint DemandInstancePagesNumber => _executable.InformationBlock.DemandInstancePagesNumber; /// public uint ExtraHeapAllocation => _executable.InformationBlock.ExtraHeapAllocation; #endregion #region Tables /// public Models.LinearExecutable.ObjectTableEntry[] ObjectTable => _executable.ObjectTable; /// public Models.LinearExecutable.ObjectPageTableEntry[] ObjectPageTable => _executable.ObjectPageTable; // TODO: Object iterate data map table [Does this exist?] /// public Models.LinearExecutable.ResourceTableEntry[] ResourceTable => _executable.ResourceTable; /// public Models.LinearExecutable.ResidentNameTableEntry[] ResidentNameTable => _executable.ResidentNameTable; /// public Models.LinearExecutable.EntryTableEntry[] EntryTable => _executable.EntryTable; /// public Models.LinearExecutable.ModuleFormatDirectivesTableEntry[] ModuleFormatDirectivesTable => _executable.ModuleFormatDirectivesTable; /// public Models.LinearExecutable.VerifyRecordDirectiveTableEntry[] VerifyRecordDirectiveTable => _executable.VerifyRecordDirectiveTable; /// public Models.LinearExecutable.PerPageChecksumTableEntry[] PerPageChecksumTable => _executable.PerPageChecksumTable; /// public Models.LinearExecutable.FixupPageTableEntry[] FixupPageTable => _executable.FixupPageTable; /// public Models.LinearExecutable.FixupRecordTableEntry[] FixupRecordTable => _executable.FixupRecordTable; /// public Models.LinearExecutable.ImportModuleNameTableEntry[] ImportModuleNameTable => _executable.ImportModuleNameTable; /// public Models.LinearExecutable.ImportModuleProcedureNameTableEntry[] ImportModuleProcedureNameTable => _executable.ImportModuleProcedureNameTable; // TODO: Preload Pages // TODO: Demand Load Pages // TODO: Iterated Pages /// public Models.LinearExecutable.NonResidentNameTableEntry[] NonResidentNameTable => _executable.NonResidentNameTable; /// public Models.LinearExecutable.DebugInformation DebugInformation => _executable.DebugInformation; #endregion #endregion #region Extension Properties // TODO: Determine what extension properties are needed #endregion #region Instance Variables /// /// Internal representation of the executable /// private Models.LinearExecutable.Executable _executable; #endregion #region Constructors /// /// Private constructor /// private LinearExecutable() { } /// /// Create an LE/LX executable from a byte array and offset /// /// Byte array representing the executable /// Offset within the array to parse /// An LE/LX executable wrapper on success, null on failure public static LinearExecutable Create(byte[] data, int offset) { var executable = Builder.LinearExecutable.ParseExecutable(data, offset); if (executable == null) return null; var wrapper = new LinearExecutable { _executable = executable, _dataSource = DataSource.ByteArray, _byteArrayData = data, _byteArrayOffset = offset, }; return wrapper; } /// /// Create an LE/LX executable from a Stream /// /// Stream representing the executable /// An LE/LX executable wrapper on success, null on failure public static LinearExecutable Create(Stream data) { var executable = Builder.LinearExecutable.ParseExecutable(data); if (executable == null) return null; var wrapper = new LinearExecutable { _executable = executable, _dataSource = DataSource.Stream, _streamData = data, }; return wrapper; } #endregion #region Printing /// public override void Print() { // TODO: Implement printing } #endregion } }