using System.IO; using BurnOutSharp.Models.LinearExecutable; namespace BurnOutSharp.Builder { // TODO: Make Stream Data rely on Byte Data public static class LinearExecutable { #region Byte Data /// /// Parse a byte array into a Linear Executable /// /// Byte array to parse /// Offset into the byte array /// Filled executable on success, null on error public static Executable ParseExecutable(byte[] data, int offset) { // If the data is invalid if (data == null) return null; // If the offset is out of bounds if (offset < 0 || offset >= data.Length) return null; // Cache the current offset int initialOffset = offset; // Create a new executable to fill var executable = new Executable(); // Parse the MS-DOS stub var stub = MSDOS.ParseExecutable(data, offset); if (stub?.Header == null || stub.Header.NewExeHeaderAddr == 0) return null; // Set the MS-DOS stub executable.Stub = stub; // TODO: Implement LE/LX parsing return null; } /// /// Parse a byte array into a Linear Executable information block /// /// Byte array to parse /// Offset into the byte array /// Filled information block on success, null on error private static InformationBlock ParseInformationBlock(byte[] data, int offset) { // TODO: Implement LE/LX information block parsing return null; } #endregion #region Stream Data /// /// Parse a Stream into a Linear Executable /// /// Stream to parse /// Filled executable on success, null on error public static Executable ParseExecutable(Stream data) { // If the data is invalid if (data == null) return null; // If the offset is out of bounds if (data.Position < 0 || data.Position >= data.Length) return null; // Cache the current offset int initialOffset = (int)data.Position; // Create a new executable to fill var executable = new Executable(); // Parse the MS-DOS stub var stub = MSDOS.ParseExecutable(data); if (stub?.Header == null || stub.Header.NewExeHeaderAddr == 0) return null; // Set the MS-DOS stub executable.Stub = stub; // TODO: Implement LE/LX parsing return null; } /// /// Parse a Stream into a Linear Executable information block /// /// Stream to parse /// Filled executable header on success, null on error private static InformationBlock ParseInformationBlock(Stream data) { // TODO: Implement LE/LX information block parsing return null; } #endregion } }