diff --git a/BinaryObjectScanner.Wrappers/AACSMediaKeyBlock.cs b/BinaryObjectScanner.Wrappers/AACSMediaKeyBlock.cs index ea0d23ec..ab58d713 100644 --- a/BinaryObjectScanner.Wrappers/AACSMediaKeyBlock.cs +++ b/BinaryObjectScanner.Wrappers/AACSMediaKeyBlock.cs @@ -4,12 +4,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class AACSMediaKeyBlock : WrapperBase + public class AACSMediaKeyBlock : WrapperBase { #region Descriptive Properties /// - public override string Description => "AACS Media Key Block"; + public override string DescriptionString => "AACS Media Key Block"; #endregion @@ -18,27 +18,35 @@ namespace BinaryObjectScanner.Wrappers #region Records /// - public SabreTools.Models.AACS.Record[] Records => _mediaKeyBlock.Records; + public SabreTools.Models.AACS.Record[] Records => _model.Records; #endregion #endregion - #region Instance Variables - - /// - /// Internal representation of the AACS media key block - /// - private SabreTools.Models.AACS.MediaKeyBlock _mediaKeyBlock; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private AACSMediaKeyBlock() { } + /// +#if NET48 + public AACSMediaKeyBlock(SabreTools.Models.AACS.MediaKeyBlock model, byte[] data, int offset) +#else + public AACSMediaKeyBlock(SabreTools.Models.AACS.MediaKeyBlock? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public AACSMediaKeyBlock(SabreTools.Models.AACS.MediaKeyBlock model, Stream data) +#else + public AACSMediaKeyBlock(SabreTools.Models.AACS.MediaKeyBlock? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create an AACS media key block from a byte array and offset @@ -76,13 +84,14 @@ namespace BinaryObjectScanner.Wrappers if (mediaKeyBlock == null) return null; - var wrapper = new AACSMediaKeyBlock + try { - _mediaKeyBlock = mediaKeyBlock, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new AACSMediaKeyBlock(mediaKeyBlock, data); + } + catch + { + return null; + } } #endregion @@ -284,7 +293,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_mediaKeyBlock, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/BDPlusSVM.cs b/BinaryObjectScanner.Wrappers/BDPlusSVM.cs index e67bc7e7..13c46ed4 100644 --- a/BinaryObjectScanner.Wrappers/BDPlusSVM.cs +++ b/BinaryObjectScanner.Wrappers/BDPlusSVM.cs @@ -4,58 +4,66 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class BDPlusSVM : WrapperBase + public class BDPlusSVM : WrapperBase { #region Descriptive Properties /// - public override string Description => "BD+ SVM"; + public override string DescriptionString => "BD+ SVM"; #endregion #region Pass-Through Properties /// - public string Signature => _svm.Signature; + public string Signature => _model.Signature; /// - public byte[] Unknown1 => _svm.Unknown1; + public byte[] Unknown1 => _model.Unknown1; /// - public ushort Year => _svm.Year; + public ushort Year => _model.Year; /// - public byte Month => _svm.Month; + public byte Month => _model.Month; /// - public byte Day => _svm.Day; + public byte Day => _model.Day; /// - public byte[] Unknown2 => _svm.Unknown2; + public byte[] Unknown2 => _model.Unknown2; /// - public uint Length => _svm.Length; + public uint Length => _model.Length; /// - public byte[] Data => _svm.Data; - - #endregion - - #region Instance Variables - - /// - /// Internal representation of the SVM - /// - private SabreTools.Models.BDPlus.SVM _svm; + public byte[] Data => _model.Data; #endregion #region Constructors - /// - /// Private constructor - /// - private BDPlusSVM() { } + /// +#if NET48 + public BDPlusSVM(SabreTools.Models.BDPlus.SVM model, byte[] data, int offset) +#else + public BDPlusSVM(SabreTools.Models.BDPlus.SVM? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public BDPlusSVM(SabreTools.Models.BDPlus.SVM model, Stream data) +#else + public BDPlusSVM(SabreTools.Models.BDPlus.SVM? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a BD+ SVM from a byte array and offset @@ -93,13 +101,14 @@ namespace BinaryObjectScanner.Wrappers if (svm == null) return null; - var wrapper = new BDPlusSVM + try { - _svm = svm, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new BDPlusSVM(svm, data); + } + catch + { + return null; + } } #endregion @@ -142,7 +151,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_svm, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/BFPK.cs b/BinaryObjectScanner.Wrappers/BFPK.cs index 9c340489..b9f5bd68 100644 --- a/BinaryObjectScanner.Wrappers/BFPK.cs +++ b/BinaryObjectScanner.Wrappers/BFPK.cs @@ -5,12 +5,12 @@ using SharpCompress.Compressors.Deflate; namespace BinaryObjectScanner.Wrappers { - public class BFPK : WrapperBase + public class BFPK : WrapperBase { #region Descriptive Properties /// - public override string Description => "BFPK Archive"; + public override string DescriptionString => "BFPK Archive"; #endregion @@ -19,40 +19,48 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public string Magic => _archive.Header.Magic; + public string Magic => _model.Header.Magic; /// - public int Version => _archive.Header.Version; + public int Version => _model.Header.Version; /// - public int Files => _archive.Header.Files; + public int Files => _model.Header.Files; #endregion #region Files /// - public SabreTools.Models.BFPK.FileEntry[] FileTable => _archive.Files; + public SabreTools.Models.BFPK.FileEntry[] FileTable => _model.Files; #endregion #endregion - #region Instance Variables - - /// - /// Internal representation of the archive - /// - private SabreTools.Models.BFPK.Archive _archive; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private BFPK() { } + /// +#if NET48 + public BFPK(SabreTools.Models.BFPK.Archive model, byte[] data, int offset) +#else + public BFPK(SabreTools.Models.BFPK.Archive? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public BFPK(SabreTools.Models.BFPK.Archive model, Stream data) +#else + public BFPK(SabreTools.Models.BFPK.Archive? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a BFPK archive from a byte array and offset @@ -90,13 +98,14 @@ namespace BinaryObjectScanner.Wrappers if (archive == null) return null; - var wrapper = new BFPK + try { - _archive = archive, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new BFPK(archive, data); + } + catch + { + return null; + } } #endregion @@ -251,7 +260,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_archive, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/BSP.cs b/BinaryObjectScanner.Wrappers/BSP.cs index 729c05f1..91de16ca 100644 --- a/BinaryObjectScanner.Wrappers/BSP.cs +++ b/BinaryObjectScanner.Wrappers/BSP.cs @@ -6,12 +6,12 @@ using static SabreTools.Models.BSP.Constants; namespace BinaryObjectScanner.Wrappers { - public class BSP : WrapperBase + public class BSP : WrapperBase { #region Descriptive Properties /// - public override string Description => "Half-Life Level (BSP)"; + public override string DescriptionString => "Half-Life Level (BSP)"; #endregion @@ -20,51 +20,59 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public uint Version => _file.Header.Version; + public uint Version => _model.Header.Version; #endregion #region Lumps /// - public SabreTools.Models.BSP.Lump[] Lumps => _file.Lumps; + public SabreTools.Models.BSP.Lump[] Lumps => _model.Lumps; #endregion #region Texture Header /// - public uint TextureCount => _file.TextureHeader.TextureCount; + public uint TextureCount => _model.TextureHeader.TextureCount; /// - public uint[] Offsets => _file.TextureHeader.Offsets; + public uint[] Offsets => _model.TextureHeader.Offsets; #endregion #region Textures /// - public SabreTools.Models.BSP.Texture[] Textures => _file.Textures; + public SabreTools.Models.BSP.Texture[] Textures => _model.Textures; #endregion #endregion - #region Instance Variables - - /// - /// Internal representation of the BSP - /// - private SabreTools.Models.BSP.File _file; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private BSP() { } + /// +#if NET48 + public BSP(SabreTools.Models.BSP.File model, byte[] data, int offset) +#else + public BSP(SabreTools.Models.BSP.File? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public BSP(SabreTools.Models.BSP.File model, Stream data) +#else + public BSP(SabreTools.Models.BSP.File? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a BSP from a byte array and offset @@ -102,13 +110,14 @@ namespace BinaryObjectScanner.Wrappers if (file == null) return null; - var wrapper = new BSP + try { - _file = file, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new BSP(file, data); + } + catch + { + return null; + } } #endregion @@ -234,7 +243,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_file, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/CFB.cs b/BinaryObjectScanner.Wrappers/CFB.cs index 5f1c765f..9fc494e4 100644 --- a/BinaryObjectScanner.Wrappers/CFB.cs +++ b/BinaryObjectScanner.Wrappers/CFB.cs @@ -5,12 +5,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class CFB : WrapperBase + public class CFB : WrapperBase { #region Descriptive Properties /// - public override string Description => "Compact File Binary"; + public override string DescriptionString => "Compact File Binary"; #endregion @@ -19,61 +19,61 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public ulong Signature => _binary.Header.Signature; + public ulong Signature => _model.Header.Signature; /// - public Guid CLSID => _binary.Header.CLSID; + public Guid CLSID => _model.Header.CLSID; /// - public ushort MinorVersion => _binary.Header.MinorVersion; + public ushort MinorVersion => _model.Header.MinorVersion; /// - public ushort MajorVersion => _binary.Header.MajorVersion; + public ushort MajorVersion => _model.Header.MajorVersion; /// - public ushort ByteOrder => _binary.Header.ByteOrder; + public ushort ByteOrder => _model.Header.ByteOrder; /// - public ushort SectorShift => _binary.Header.SectorShift; + public ushort SectorShift => _model.Header.SectorShift; /// - public ushort MiniSectorShift => _binary.Header.MiniSectorShift; + public ushort MiniSectorShift => _model.Header.MiniSectorShift; /// - public byte[] Reserved => _binary.Header.Reserved; + public byte[] Reserved => _model.Header.Reserved; /// - public uint NumberOfDirectorySectors => _binary.Header.NumberOfDirectorySectors; + public uint NumberOfDirectorySectors => _model.Header.NumberOfDirectorySectors; /// - public uint NumberOfFATSectors => _binary.Header.NumberOfFATSectors; + public uint NumberOfFATSectors => _model.Header.NumberOfFATSectors; /// - public uint FirstDirectorySectorLocation => _binary.Header.FirstDirectorySectorLocation; + public uint FirstDirectorySectorLocation => _model.Header.FirstDirectorySectorLocation; /// - public uint TransactionSignatureNumber => _binary.Header.TransactionSignatureNumber; + public uint TransactionSignatureNumber => _model.Header.TransactionSignatureNumber; /// - public uint MiniStreamCutoffSize => _binary.Header.MiniStreamCutoffSize; + public uint MiniStreamCutoffSize => _model.Header.MiniStreamCutoffSize; /// - public uint FirstMiniFATSectorLocation => _binary.Header.FirstMiniFATSectorLocation; + public uint FirstMiniFATSectorLocation => _model.Header.FirstMiniFATSectorLocation; /// - public uint NumberOfMiniFATSectors => _binary.Header.NumberOfMiniFATSectors; + public uint NumberOfMiniFATSectors => _model.Header.NumberOfMiniFATSectors; /// - public uint FirstDIFATSectorLocation => _binary.Header.FirstDIFATSectorLocation; + public uint FirstDIFATSectorLocation => _model.Header.FirstDIFATSectorLocation; /// - public uint NumberOfDIFATSectors => _binary.Header.NumberOfDIFATSectors; + public uint NumberOfDIFATSectors => _model.Header.NumberOfDIFATSectors; /// #if NET48 - public SabreTools.Models.CFB.SectorNumber[] DIFAT => _binary.Header.DIFAT; + public SabreTools.Models.CFB.SectorNumber[] DIFAT => _model.Header.DIFAT; #else - public SabreTools.Models.CFB.SectorNumber?[] DIFAT => _binary.Header.DIFAT; + public SabreTools.Models.CFB.SectorNumber?[] DIFAT => _model.Header.DIFAT; #endif #endregion @@ -82,9 +82,9 @@ namespace BinaryObjectScanner.Wrappers /// #if NET48 - public SabreTools.Models.CFB.SectorNumber[] FATSectorNumbers => _binary.FATSectorNumbers; + public SabreTools.Models.CFB.SectorNumber[] FATSectorNumbers => _model.FATSectorNumbers; #else - public SabreTools.Models.CFB.SectorNumber?[] FATSectorNumbers => _binary.FATSectorNumbers; + public SabreTools.Models.CFB.SectorNumber?[] FATSectorNumbers => _model.FATSectorNumbers; #endif #endregion @@ -93,9 +93,9 @@ namespace BinaryObjectScanner.Wrappers /// #if NET48 - public SabreTools.Models.CFB.SectorNumber[] MiniFATSectorNumbers => _binary.MiniFATSectorNumbers; + public SabreTools.Models.CFB.SectorNumber[] MiniFATSectorNumbers => _model.MiniFATSectorNumbers; #else - public SabreTools.Models.CFB.SectorNumber?[] MiniFATSectorNumbers => _binary.MiniFATSectorNumbers; + public SabreTools.Models.CFB.SectorNumber?[] MiniFATSectorNumbers => _model.MiniFATSectorNumbers; #endif #endregion @@ -104,9 +104,9 @@ namespace BinaryObjectScanner.Wrappers /// #if NET48 - public SabreTools.Models.CFB.SectorNumber[] DIFATSectorNumbers => _binary.DIFATSectorNumbers; + public SabreTools.Models.CFB.SectorNumber[] DIFATSectorNumbers => _model.DIFATSectorNumbers; #else - public SabreTools.Models.CFB.SectorNumber?[] DIFATSectorNumbers => _binary.DIFATSectorNumbers; + public SabreTools.Models.CFB.SectorNumber?[] DIFATSectorNumbers => _model.DIFATSectorNumbers; #endif #endregion @@ -115,9 +115,9 @@ namespace BinaryObjectScanner.Wrappers /// #if NET48 - public SabreTools.Models.CFB.DirectoryEntry[] DirectoryEntries => _binary.DirectoryEntries; + public SabreTools.Models.CFB.DirectoryEntry[] DirectoryEntries => _model.DirectoryEntries; #else - public SabreTools.Models.CFB.DirectoryEntry?[] DirectoryEntries => _binary.DirectoryEntries; + public SabreTools.Models.CFB.DirectoryEntry?[] DirectoryEntries => _model.DirectoryEntries; #endif #endregion @@ -138,21 +138,29 @@ namespace BinaryObjectScanner.Wrappers #endregion - #region Instance Variables - - /// - /// Internal representation of the file - /// - private SabreTools.Models.CFB.Binary _binary; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private CFB() { } + /// +#if NET48 + public CFB(SabreTools.Models.CFB.Binary model, byte[] data, int offset) +#else + public CFB(SabreTools.Models.CFB.Binary? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public CFB(SabreTools.Models.CFB.Binary model, Stream data) +#else + public CFB(SabreTools.Models.CFB.Binary? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a Compound File Binary from a byte array and offset @@ -190,13 +198,14 @@ namespace BinaryObjectScanner.Wrappers if (binary == null) return null; - var wrapper = new CFB + try { - _binary = binary, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new CFB(binary, data); + } + catch + { + return null; + } } #endregion @@ -551,7 +560,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_binary, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/CIA.cs b/BinaryObjectScanner.Wrappers/CIA.cs index dee2c104..371e40d0 100644 --- a/BinaryObjectScanner.Wrappers/CIA.cs +++ b/BinaryObjectScanner.Wrappers/CIA.cs @@ -4,12 +4,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class CIA : WrapperBase + public class CIA : WrapperBase { #region Descriptive Properties /// - public override string Description => "CTR Importable Archive (CIA)"; + public override string DescriptionString => "CTR Importable Archive (CIA)"; #endregion @@ -18,263 +18,271 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public uint HeaderSize => _cia.Header.HeaderSize; + public uint HeaderSize => _model.Header.HeaderSize; /// - public ushort Type => _cia.Header.Type; + public ushort Type => _model.Header.Type; /// - public ushort Version => _cia.Header.Version; + public ushort Version => _model.Header.Version; /// - public uint CertificateChainSize => _cia.Header.CertificateChainSize; + public uint CertificateChainSize => _model.Header.CertificateChainSize; /// - public uint TicketSize => _cia.Header.TicketSize; + public uint TicketSize => _model.Header.TicketSize; /// - public uint TMDFileSize => _cia.Header.TMDFileSize; + public uint TMDFileSize => _model.Header.TMDFileSize; /// - public uint MetaSize => _cia.Header.MetaSize; + public uint MetaSize => _model.Header.MetaSize; /// - public ulong ContentSize => _cia.Header.ContentSize; + public ulong ContentSize => _model.Header.ContentSize; /// - public byte[] ContentIndex => _cia.Header.ContentIndex; + public byte[] ContentIndex => _model.Header.ContentIndex; #endregion #region Certificate Chain /// - public SabreTools.Models.N3DS.Certificate[] CertificateChain => _cia.CertificateChain; + public SabreTools.Models.N3DS.Certificate[] CertificateChain => _model.CertificateChain; #endregion #region Ticket /// - public SabreTools.Models.N3DS.SignatureType T_SignatureType => _cia.Ticket.SignatureType; + public SabreTools.Models.N3DS.SignatureType T_SignatureType => _model.Ticket.SignatureType; /// - public ushort T_SignatureSize => _cia.Ticket.SignatureSize; + public ushort T_SignatureSize => _model.Ticket.SignatureSize; /// - public byte T_PaddingSize => _cia.Ticket.PaddingSize; + public byte T_PaddingSize => _model.Ticket.PaddingSize; /// - public byte[] T_Signature => _cia.Ticket.Signature; + public byte[] T_Signature => _model.Ticket.Signature; /// - public byte[] T_Padding => _cia.Ticket.Padding; + public byte[] T_Padding => _model.Ticket.Padding; /// - public string T_Issuer => _cia.Ticket.Issuer; + public string T_Issuer => _model.Ticket.Issuer; /// - public byte[] T_ECCPublicKey => _cia.Ticket.ECCPublicKey; + public byte[] T_ECCPublicKey => _model.Ticket.ECCPublicKey; /// - public byte T_Version => _cia.Ticket.Version; + public byte T_Version => _model.Ticket.Version; /// - public byte T_CaCrlVersion => _cia.Ticket.CaCrlVersion; + public byte T_CaCrlVersion => _model.Ticket.CaCrlVersion; /// - public byte T_SignerCrlVersion => _cia.Ticket.SignerCrlVersion; + public byte T_SignerCrlVersion => _model.Ticket.SignerCrlVersion; /// - public byte[] T_TitleKey => _cia.Ticket.TitleKey; + public byte[] T_TitleKey => _model.Ticket.TitleKey; /// - public byte T_Reserved1 => _cia.Ticket.Reserved1; + public byte T_Reserved1 => _model.Ticket.Reserved1; /// - public ulong T_TicketID => _cia.Ticket.TicketID; + public ulong T_TicketID => _model.Ticket.TicketID; /// - public uint T_ConsoleID => _cia.Ticket.ConsoleID; + public uint T_ConsoleID => _model.Ticket.ConsoleID; /// - public ulong T_TitleID => _cia.Ticket.TitleID; + public ulong T_TitleID => _model.Ticket.TitleID; /// - public byte[] T_Reserved2 => _cia.Ticket.Reserved2; + public byte[] T_Reserved2 => _model.Ticket.Reserved2; /// - public ushort T_TicketTitleVersion => _cia.Ticket.TicketTitleVersion; + public ushort T_TicketTitleVersion => _model.Ticket.TicketTitleVersion; /// - public byte[] T_Reserved3 => _cia.Ticket.Reserved3; + public byte[] T_Reserved3 => _model.Ticket.Reserved3; /// - public byte T_LicenseType => _cia.Ticket.LicenseType; + public byte T_LicenseType => _model.Ticket.LicenseType; /// - public byte T_CommonKeyYIndex => _cia.Ticket.CommonKeyYIndex; + public byte T_CommonKeyYIndex => _model.Ticket.CommonKeyYIndex; /// - public byte[] T_Reserved4 => _cia.Ticket.Reserved4; + public byte[] T_Reserved4 => _model.Ticket.Reserved4; /// - public uint T_eShopAccountID => _cia.Ticket.eShopAccountID; + public uint T_eShopAccountID => _model.Ticket.eShopAccountID; /// - public byte T_Reserved5 => _cia.Ticket.Reserved5; + public byte T_Reserved5 => _model.Ticket.Reserved5; /// - public byte T_Audit => _cia.Ticket.Audit; + public byte T_Audit => _model.Ticket.Audit; /// - public byte[] T_Reserved6 => _cia.Ticket.Reserved6; + public byte[] T_Reserved6 => _model.Ticket.Reserved6; /// - public uint[] T_Limits => _cia.Ticket.Limits; + public uint[] T_Limits => _model.Ticket.Limits; /// - public uint T_ContentIndexSize => _cia.Ticket.ContentIndexSize; + public uint T_ContentIndexSize => _model.Ticket.ContentIndexSize; /// - public byte[] T_ContentIndex => _cia.Ticket.ContentIndex; + public byte[] T_ContentIndex => _model.Ticket.ContentIndex; /// - public SabreTools.Models.N3DS.Certificate[] T_CertificateChain => _cia.Ticket.CertificateChain; + public SabreTools.Models.N3DS.Certificate[] T_CertificateChain => _model.Ticket.CertificateChain; #endregion #region Title Metadata /// - public SabreTools.Models.N3DS.SignatureType TMD_SignatureType => _cia.TMDFileData.SignatureType; + public SabreTools.Models.N3DS.SignatureType TMD_SignatureType => _model.TMDFileData.SignatureType; /// - public ushort TMD_SignatureSize => _cia.TMDFileData.SignatureSize; + public ushort TMD_SignatureSize => _model.TMDFileData.SignatureSize; /// - public byte TMD_PaddingSize => _cia.TMDFileData.PaddingSize; + public byte TMD_PaddingSize => _model.TMDFileData.PaddingSize; /// - public byte[] TMD_Signature => _cia.TMDFileData.Signature; + public byte[] TMD_Signature => _model.TMDFileData.Signature; /// - public byte[] TMD_Padding1 => _cia.TMDFileData.Padding1; + public byte[] TMD_Padding1 => _model.TMDFileData.Padding1; /// - public string TMD_Issuer => _cia.TMDFileData.Issuer; + public string TMD_Issuer => _model.TMDFileData.Issuer; /// - public byte TMD_Version => _cia.TMDFileData.Version; + public byte TMD_Version => _model.TMDFileData.Version; /// - public byte TMD_CaCrlVersion => _cia.TMDFileData.CaCrlVersion; + public byte TMD_CaCrlVersion => _model.TMDFileData.CaCrlVersion; /// - public byte TMD_SignerCrlVersion => _cia.TMDFileData.SignerCrlVersion; + public byte TMD_SignerCrlVersion => _model.TMDFileData.SignerCrlVersion; /// - public byte TMD_Reserved1 => _cia.TMDFileData.Reserved1; + public byte TMD_Reserved1 => _model.TMDFileData.Reserved1; /// - public ulong TMD_SystemVersion => _cia.TMDFileData.SystemVersion; + public ulong TMD_SystemVersion => _model.TMDFileData.SystemVersion; /// - public ulong TMD_TitleID => _cia.TMDFileData.TitleID; + public ulong TMD_TitleID => _model.TMDFileData.TitleID; /// - public uint TMD_TitleType => _cia.TMDFileData.TitleType; + public uint TMD_TitleType => _model.TMDFileData.TitleType; /// - public ushort TMD_GroupID => _cia.TMDFileData.GroupID; + public ushort TMD_GroupID => _model.TMDFileData.GroupID; /// - public uint TMD_SaveDataSize => _cia.TMDFileData.SaveDataSize; + public uint TMD_SaveDataSize => _model.TMDFileData.SaveDataSize; /// - public uint TMD_SRLPrivateSaveDataSize => _cia.TMDFileData.SRLPrivateSaveDataSize; + public uint TMD_SRLPrivateSaveDataSize => _model.TMDFileData.SRLPrivateSaveDataSize; /// - public byte[] TMD_Reserved2 => _cia.TMDFileData.Reserved2; + public byte[] TMD_Reserved2 => _model.TMDFileData.Reserved2; /// - public byte TMD_SRLFlag => _cia.TMDFileData.SRLFlag; + public byte TMD_SRLFlag => _model.TMDFileData.SRLFlag; /// - public byte[] TMD_Reserved3 => _cia.TMDFileData.Reserved3; + public byte[] TMD_Reserved3 => _model.TMDFileData.Reserved3; /// - public uint TMD_AccessRights => _cia.TMDFileData.AccessRights; + public uint TMD_AccessRights => _model.TMDFileData.AccessRights; /// - public ushort TMD_TitleVersion => _cia.TMDFileData.TitleVersion; + public ushort TMD_TitleVersion => _model.TMDFileData.TitleVersion; /// - public ushort TMD_ContentCount => _cia.TMDFileData.ContentCount; + public ushort TMD_ContentCount => _model.TMDFileData.ContentCount; /// - public ushort TMD_BootContent => _cia.TMDFileData.BootContent; + public ushort TMD_BootContent => _model.TMDFileData.BootContent; /// - public byte[] TMD_Padding2 => _cia.TMDFileData.Padding2; + public byte[] TMD_Padding2 => _model.TMDFileData.Padding2; /// - public byte[] TMD_SHA256HashContentInfoRecords => _cia.TMDFileData.SHA256HashContentInfoRecords; + public byte[] TMD_SHA256HashContentInfoRecords => _model.TMDFileData.SHA256HashContentInfoRecords; /// - public SabreTools.Models.N3DS.ContentInfoRecord[] TMD_ContentInfoRecords => _cia.TMDFileData.ContentInfoRecords; + public SabreTools.Models.N3DS.ContentInfoRecord[] TMD_ContentInfoRecords => _model.TMDFileData.ContentInfoRecords; /// - public SabreTools.Models.N3DS.ContentChunkRecord[] TMD_ContentChunkRecords => _cia.TMDFileData.ContentChunkRecords; + public SabreTools.Models.N3DS.ContentChunkRecord[] TMD_ContentChunkRecords => _model.TMDFileData.ContentChunkRecords; /// - public SabreTools.Models.N3DS.Certificate[] TMD_CertificateChain => _cia.TMDFileData.CertificateChain; + public SabreTools.Models.N3DS.Certificate[] TMD_CertificateChain => _model.TMDFileData.CertificateChain; #endregion #region Partitions /// - public SabreTools.Models.N3DS.NCCHHeader[] Partitions => _cia.Partitions; + public SabreTools.Models.N3DS.NCCHHeader[] Partitions => _model.Partitions; #endregion #region Meta Data /// - public byte[] MD_TitleIDDependencyList => _cia.MetaData?.TitleIDDependencyList; + public byte[] MD_TitleIDDependencyList => _model.MetaData?.TitleIDDependencyList; /// - public byte[] MD_Reserved1 => _cia.MetaData?.Reserved1; + public byte[] MD_Reserved1 => _model.MetaData?.Reserved1; /// - public uint? MD_CoreVersion => _cia.MetaData?.CoreVersion; + public uint? MD_CoreVersion => _model.MetaData?.CoreVersion; /// - public byte[] MD_Reserved2 => _cia.MetaData?.Reserved2; + public byte[] MD_Reserved2 => _model.MetaData?.Reserved2; /// - public byte[] MD_IconData => _cia.MetaData?.IconData; + public byte[] MD_IconData => _model.MetaData?.IconData; #endregion #endregion - #region Instance Variables - - /// - /// Internal representation of the cart - /// - private SabreTools.Models.N3DS.CIA _cia; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private CIA() { } + /// +#if NET48 + public CIA(SabreTools.Models.N3DS.CIA model, byte[] data, int offset) +#else + public CIA(SabreTools.Models.N3DS.CIA? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public CIA(SabreTools.Models.N3DS.CIA model, Stream data) +#else + public CIA(SabreTools.Models.N3DS.CIA? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a CIA archive from a byte array and offset @@ -312,13 +320,14 @@ namespace BinaryObjectScanner.Wrappers if (archive == null) return null; - var wrapper = new CIA + try { - _cia = archive, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new CIA(archive, data); + } + catch + { + return null; + } } #endregion @@ -708,7 +717,7 @@ namespace BinaryObjectScanner.Wrappers { builder.AppendLine(" Meta Data Information:"); builder.AppendLine(" -------------------------"); - if (_cia.MetaData == null || MetaSize == 0) + if (_model.MetaData == null || MetaSize == 0) { builder.AppendLine(value: " No meta file data"); } @@ -726,7 +735,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_cia, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/GCF.cs b/BinaryObjectScanner.Wrappers/GCF.cs index 273938c2..a60ef78f 100644 --- a/BinaryObjectScanner.Wrappers/GCF.cs +++ b/BinaryObjectScanner.Wrappers/GCF.cs @@ -5,12 +5,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class GCF : WrapperBase + public class GCF : WrapperBase { #region Descriptive Properties /// - public override string Description => "Half-Life Game Cache File (GCF)"; + public override string DescriptionString => "Half-Life Game Cache File (GCF)"; #endregion @@ -19,288 +19,288 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public uint Dummy0 => _file.Header.Dummy0; + public uint Dummy0 => _model.Header.Dummy0; /// - public uint MajorVersion => _file.Header.MajorVersion; + public uint MajorVersion => _model.Header.MajorVersion; /// - public uint MinorVersion => _file.Header.MinorVersion; + public uint MinorVersion => _model.Header.MinorVersion; /// - public uint CacheID => _file.Header.CacheID; + public uint CacheID => _model.Header.CacheID; /// - public uint LastVersionPlayed => _file.Header.LastVersionPlayed; + public uint LastVersionPlayed => _model.Header.LastVersionPlayed; /// - public uint Dummy1 => _file.Header.Dummy1; + public uint Dummy1 => _model.Header.Dummy1; /// - public uint Dummy2 => _file.Header.Dummy2; + public uint Dummy2 => _model.Header.Dummy2; /// - public uint FileSize => _file.Header.FileSize; + public uint FileSize => _model.Header.FileSize; /// - public uint BlockSize => _file.Header.BlockSize; + public uint BlockSize => _model.Header.BlockSize; /// - public uint BlockCount => _file.Header.BlockCount; + public uint BlockCount => _model.Header.BlockCount; /// - public uint Dummy3 => _file.Header.Dummy3; + public uint Dummy3 => _model.Header.Dummy3; #endregion #region Block Entry Header /// - public uint BEH_BlockCount => _file.BlockEntryHeader.BlockCount; + public uint BEH_BlockCount => _model.BlockEntryHeader.BlockCount; /// - public uint BEH_BlocksUsed => _file.BlockEntryHeader.BlocksUsed; + public uint BEH_BlocksUsed => _model.BlockEntryHeader.BlocksUsed; /// - public uint BEH_Dummy0 => _file.BlockEntryHeader.Dummy0; + public uint BEH_Dummy0 => _model.BlockEntryHeader.Dummy0; /// - public uint BEH_Dummy1 => _file.BlockEntryHeader.Dummy1; + public uint BEH_Dummy1 => _model.BlockEntryHeader.Dummy1; /// - public uint BEH_Dummy2 => _file.BlockEntryHeader.Dummy2; + public uint BEH_Dummy2 => _model.BlockEntryHeader.Dummy2; /// - public uint BEH_Dummy3 => _file.BlockEntryHeader.Dummy3; + public uint BEH_Dummy3 => _model.BlockEntryHeader.Dummy3; /// - public uint BEH_Dummy4 => _file.BlockEntryHeader.Dummy4; + public uint BEH_Dummy4 => _model.BlockEntryHeader.Dummy4; /// - public uint BEH_Checksum => _file.BlockEntryHeader.Checksum; + public uint BEH_Checksum => _model.BlockEntryHeader.Checksum; #endregion #region Block Entries /// - public SabreTools.Models.GCF.BlockEntry[] BlockEntries => _file.BlockEntries; + public SabreTools.Models.GCF.BlockEntry[] BlockEntries => _model.BlockEntries; #endregion #region Fragmentation Map Header /// - public uint FMH_BlockCount => _file.FragmentationMapHeader.BlockCount; + public uint FMH_BlockCount => _model.FragmentationMapHeader.BlockCount; /// - public uint FMH_FirstUnusedEntry => _file.FragmentationMapHeader.FirstUnusedEntry; + public uint FMH_FirstUnusedEntry => _model.FragmentationMapHeader.FirstUnusedEntry; /// - public uint FMH_Terminator => _file.FragmentationMapHeader.Terminator; + public uint FMH_Terminator => _model.FragmentationMapHeader.Terminator; /// - public uint FMH_Checksum => _file.FragmentationMapHeader.Checksum; + public uint FMH_Checksum => _model.FragmentationMapHeader.Checksum; #endregion #region Fragmentation Maps /// - public SabreTools.Models.GCF.FragmentationMap[] FragmentationMaps => _file.FragmentationMaps; + public SabreTools.Models.GCF.FragmentationMap[] FragmentationMaps => _model.FragmentationMaps; #endregion #region Block Entry Map Header /// - public uint? BEMH_BlockCount => _file.BlockEntryMapHeader?.BlockCount; + public uint? BEMH_BlockCount => _model.BlockEntryMapHeader?.BlockCount; /// - public uint? BEMH_FirstBlockEntryIndex => _file.BlockEntryMapHeader?.FirstBlockEntryIndex; + public uint? BEMH_FirstBlockEntryIndex => _model.BlockEntryMapHeader?.FirstBlockEntryIndex; /// - public uint? BEMH_LastBlockEntryIndex => _file.BlockEntryMapHeader?.LastBlockEntryIndex; + public uint? BEMH_LastBlockEntryIndex => _model.BlockEntryMapHeader?.LastBlockEntryIndex; /// - public uint? BEMH_Dummy0 => _file.BlockEntryMapHeader?.Dummy0; + public uint? BEMH_Dummy0 => _model.BlockEntryMapHeader?.Dummy0; /// - public uint? BEMH_Checksum => _file.BlockEntryMapHeader?.Checksum; + public uint? BEMH_Checksum => _model.BlockEntryMapHeader?.Checksum; #endregion #region Block Entry Maps /// - public SabreTools.Models.GCF.BlockEntryMap[] BlockEntryMaps => _file.BlockEntryMaps; + public SabreTools.Models.GCF.BlockEntryMap[] BlockEntryMaps => _model.BlockEntryMaps; #endregion #region Directory Header /// - public uint DH_Dummy0 => _file.DirectoryHeader.Dummy0; + public uint DH_Dummy0 => _model.DirectoryHeader.Dummy0; /// - public uint DH_CacheID => _file.DirectoryHeader.CacheID; + public uint DH_CacheID => _model.DirectoryHeader.CacheID; /// - public uint DH_LastVersionPlayed => _file.DirectoryHeader.LastVersionPlayed; + public uint DH_LastVersionPlayed => _model.DirectoryHeader.LastVersionPlayed; /// - public uint DH_ItemCount => _file.DirectoryHeader.ItemCount; + public uint DH_ItemCount => _model.DirectoryHeader.ItemCount; /// - public uint DH_FileCount => _file.DirectoryHeader.FileCount; + public uint DH_FileCount => _model.DirectoryHeader.FileCount; /// - public uint DH_Dummy1 => _file.DirectoryHeader.Dummy1; + public uint DH_Dummy1 => _model.DirectoryHeader.Dummy1; /// - public uint DH_DirectorySize => _file.DirectoryHeader.DirectorySize; + public uint DH_DirectorySize => _model.DirectoryHeader.DirectorySize; /// - public uint DH_NameSize => _file.DirectoryHeader.NameSize; + public uint DH_NameSize => _model.DirectoryHeader.NameSize; /// - public uint DH_Info1Count => _file.DirectoryHeader.Info1Count; + public uint DH_Info1Count => _model.DirectoryHeader.Info1Count; /// - public uint DH_CopyCount => _file.DirectoryHeader.CopyCount; + public uint DH_CopyCount => _model.DirectoryHeader.CopyCount; /// - public uint DH_LocalCount => _file.DirectoryHeader.LocalCount; + public uint DH_LocalCount => _model.DirectoryHeader.LocalCount; /// - public uint DH_Dummy2 => _file.DirectoryHeader.Dummy2; + public uint DH_Dummy2 => _model.DirectoryHeader.Dummy2; /// - public uint DH_Dummy3 => _file.DirectoryHeader.Dummy3; + public uint DH_Dummy3 => _model.DirectoryHeader.Dummy3; /// - public uint DH_Checksum => _file.DirectoryHeader.Checksum; + public uint DH_Checksum => _model.DirectoryHeader.Checksum; #endregion #region Directory Entries /// - public SabreTools.Models.GCF.DirectoryEntry[] DirectoryEntries => _file.DirectoryEntries; + public SabreTools.Models.GCF.DirectoryEntry[] DirectoryEntries => _model.DirectoryEntries; #endregion #region Directory Names /// - public System.Collections.Generic.Dictionary DirectoryNames => _file.DirectoryNames; + public System.Collections.Generic.Dictionary DirectoryNames => _model.DirectoryNames; #endregion #region Directory Info 1 Entries /// - public SabreTools.Models.GCF.DirectoryInfo1Entry[] DirectoryInfo1Entries => _file.DirectoryInfo1Entries; + public SabreTools.Models.GCF.DirectoryInfo1Entry[] DirectoryInfo1Entries => _model.DirectoryInfo1Entries; #endregion #region Directory Info 2 Entries /// - public SabreTools.Models.GCF.DirectoryInfo2Entry[] DirectoryInfo2Entries => _file.DirectoryInfo2Entries; + public SabreTools.Models.GCF.DirectoryInfo2Entry[] DirectoryInfo2Entries => _model.DirectoryInfo2Entries; #endregion #region Directory Copy Entries /// - public SabreTools.Models.GCF.DirectoryCopyEntry[] DirectoryCopyEntries => _file.DirectoryCopyEntries; + public SabreTools.Models.GCF.DirectoryCopyEntry[] DirectoryCopyEntries => _model.DirectoryCopyEntries; #endregion #region Directory Local Entries /// - public SabreTools.Models.GCF.DirectoryLocalEntry[] DirectoryLocalEntries => _file.DirectoryLocalEntries; + public SabreTools.Models.GCF.DirectoryLocalEntry[] DirectoryLocalEntries => _model.DirectoryLocalEntries; #endregion #region Directory Map Header /// - public uint? DMH_Dummy0 => _file.DirectoryMapHeader?.Dummy0; + public uint? DMH_Dummy0 => _model.DirectoryMapHeader?.Dummy0; /// - public uint? DMH_Dummy1 => _file.DirectoryMapHeader?.Dummy1; + public uint? DMH_Dummy1 => _model.DirectoryMapHeader?.Dummy1; #endregion #region Directory Map Entries /// - public SabreTools.Models.GCF.DirectoryMapEntry[] DirectoryMapEntries => _file.DirectoryMapEntries; + public SabreTools.Models.GCF.DirectoryMapEntry[] DirectoryMapEntries => _model.DirectoryMapEntries; #endregion #region Checksum Header /// - public uint CH_Dummy0 => _file.ChecksumHeader.Dummy0; + public uint CH_Dummy0 => _model.ChecksumHeader.Dummy0; /// - public uint CH_ChecksumSize => _file.ChecksumHeader.ChecksumSize; + public uint CH_ChecksumSize => _model.ChecksumHeader.ChecksumSize; #endregion #region Checksum Map Header /// - public uint CMH_Dummy0 => _file.ChecksumMapHeader.Dummy0; + public uint CMH_Dummy0 => _model.ChecksumMapHeader.Dummy0; /// - public uint CMH_Dummy1 => _file.ChecksumMapHeader.Dummy1; + public uint CMH_Dummy1 => _model.ChecksumMapHeader.Dummy1; /// - public uint CMH_ItemCount => _file.ChecksumMapHeader.ItemCount; + public uint CMH_ItemCount => _model.ChecksumMapHeader.ItemCount; /// - public uint CMH_ChecksumCount => _file.ChecksumMapHeader.ChecksumCount; + public uint CMH_ChecksumCount => _model.ChecksumMapHeader.ChecksumCount; #endregion #region Checksum Map Entries /// - public SabreTools.Models.GCF.ChecksumMapEntry[] ChecksumMapEntries => _file.ChecksumMapEntries; + public SabreTools.Models.GCF.ChecksumMapEntry[] ChecksumMapEntries => _model.ChecksumMapEntries; #endregion #region Checksum Entries /// - public SabreTools.Models.GCF.ChecksumEntry[] ChecksumEntries => _file.ChecksumEntries; + public SabreTools.Models.GCF.ChecksumEntry[] ChecksumEntries => _model.ChecksumEntries; #endregion #region Data Block Header /// - public uint DBH_LastVersionPlayed => _file.DataBlockHeader.LastVersionPlayed; + public uint DBH_LastVersionPlayed => _model.DataBlockHeader.LastVersionPlayed; /// - public uint DBH_BlockCount => _file.DataBlockHeader.BlockCount; + public uint DBH_BlockCount => _model.DataBlockHeader.BlockCount; /// - public uint DBH_BlockSize => _file.DataBlockHeader.BlockSize; + public uint DBH_BlockSize => _model.DataBlockHeader.BlockSize; /// - public uint DBH_FirstBlockOffset => _file.DataBlockHeader.FirstBlockOffset; + public uint DBH_FirstBlockOffset => _model.DataBlockHeader.FirstBlockOffset; /// - public uint DBH_BlocksUsed => _file.DataBlockHeader.BlocksUsed; + public uint DBH_BlocksUsed => _model.DataBlockHeader.BlocksUsed; /// - public uint DBH_Checksum => _file.DataBlockHeader.Checksum; + public uint DBH_Checksum => _model.DataBlockHeader.Checksum; #endregion @@ -403,11 +403,6 @@ namespace BinaryObjectScanner.Wrappers #region Instance Variables - /// - /// Internal representation of the GCF - /// - private SabreTools.Models.GCF.File _file; - /// /// Set of all files and their information /// @@ -422,10 +417,27 @@ namespace BinaryObjectScanner.Wrappers #region Constructors - /// - /// Private constructor - /// - private GCF() { } + /// +#if NET48 + public GCF(SabreTools.Models.GCF.File model, byte[] data, int offset) +#else + public GCF(SabreTools.Models.GCF.File? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public GCF(SabreTools.Models.GCF.File model, Stream data) +#else + public GCF(SabreTools.Models.GCF.File? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create an GCF from a byte array and offset @@ -463,13 +475,14 @@ namespace BinaryObjectScanner.Wrappers if (file == null) return null; - var wrapper = new GCF + try { - _file = file, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new GCF(file, data); + } + catch + { + return null; + } } #endregion @@ -641,7 +654,7 @@ namespace BinaryObjectScanner.Wrappers { builder.AppendLine(" Block Entry Map Header Information:"); builder.AppendLine(" -------------------------"); - if (_file.BlockEntryMapHeader == null) + if (_model.BlockEntryMapHeader == null) { builder.AppendLine($" No block entry map header"); } @@ -841,7 +854,7 @@ namespace BinaryObjectScanner.Wrappers { builder.AppendLine(" Directory Map Header Information:"); builder.AppendLine(" -------------------------"); - if (_file.DirectoryMapHeader == null) + if (_model.DirectoryMapHeader == null) { builder.AppendLine($" No directory map header"); } @@ -974,7 +987,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_file, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/IWrapper.cs b/BinaryObjectScanner.Wrappers/IWrapper.cs new file mode 100644 index 00000000..9687819e --- /dev/null +++ b/BinaryObjectScanner.Wrappers/IWrapper.cs @@ -0,0 +1,24 @@ +using System.Text; + +namespace BinaryObjectScanner.Wrappers +{ + public interface IWrapper + { + /// + /// Get a human-readable description of the wrapper + /// + string Description(); + + /// + /// Export the item information as pretty-printed text + /// + StringBuilder PrettyPrint(); + +#if NET6_0_OR_GREATER + /// + /// Export the item information as JSON + /// + string ExportJSON(); +#endif + } +} \ No newline at end of file diff --git a/BinaryObjectScanner.Wrappers/InstallShieldCabinet.cs b/BinaryObjectScanner.Wrappers/InstallShieldCabinet.cs index 9a12e0e2..6d3a3f35 100644 --- a/BinaryObjectScanner.Wrappers/InstallShieldCabinet.cs +++ b/BinaryObjectScanner.Wrappers/InstallShieldCabinet.cs @@ -5,12 +5,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public partial class InstallShieldCabinet : WrapperBase + public partial class InstallShieldCabinet : WrapperBase { #region Descriptive Properties /// - public override string Description => "InstallShield Cabinet"; + public override string DescriptionString => "InstallShield Cabinet"; #endregion @@ -19,193 +19,193 @@ namespace BinaryObjectScanner.Wrappers #region Common Header /// - public string Signature => _cabinet.CommonHeader.Signature; + public string Signature => _model.CommonHeader.Signature; /// - public uint Version => _cabinet.CommonHeader.Version; + public uint Version => _model.CommonHeader.Version; /// - public uint VolumeInfo => _cabinet.CommonHeader.VolumeInfo; + public uint VolumeInfo => _model.CommonHeader.VolumeInfo; /// - public uint DescriptorOffset => _cabinet.CommonHeader.DescriptorOffset; + public uint DescriptorOffset => _model.CommonHeader.DescriptorOffset; /// - public uint DescriptorSize => _cabinet.CommonHeader.DescriptorSize; + public uint DescriptorSize => _model.CommonHeader.DescriptorSize; #endregion #region Volume Header /// - public uint DataOffset => _cabinet.VolumeHeader.DataOffset; + public uint DataOffset => _model.VolumeHeader.DataOffset; /// - public uint DataOffsetHigh => _cabinet.VolumeHeader.DataOffsetHigh; + public uint DataOffsetHigh => _model.VolumeHeader.DataOffsetHigh; /// - public uint FirstFileIndex => _cabinet.VolumeHeader.FirstFileIndex; + public uint FirstFileIndex => _model.VolumeHeader.FirstFileIndex; /// - public uint LastFileIndex => _cabinet.VolumeHeader.LastFileIndex; + public uint LastFileIndex => _model.VolumeHeader.LastFileIndex; /// - public uint FirstFileOffset => _cabinet.VolumeHeader.FirstFileOffset; + public uint FirstFileOffset => _model.VolumeHeader.FirstFileOffset; /// - public uint FirstFileOffsetHigh => _cabinet.VolumeHeader.FirstFileOffsetHigh; + public uint FirstFileOffsetHigh => _model.VolumeHeader.FirstFileOffsetHigh; /// - public uint FirstFileSizeExpanded => _cabinet.VolumeHeader.FirstFileSizeExpanded; + public uint FirstFileSizeExpanded => _model.VolumeHeader.FirstFileSizeExpanded; /// - public uint FirstFileSizeExpandedHigh => _cabinet.VolumeHeader.FirstFileSizeExpandedHigh; + public uint FirstFileSizeExpandedHigh => _model.VolumeHeader.FirstFileSizeExpandedHigh; /// - public uint FirstFileSizeCompressed => _cabinet.VolumeHeader.FirstFileSizeCompressed; + public uint FirstFileSizeCompressed => _model.VolumeHeader.FirstFileSizeCompressed; /// - public uint FirstFileSizeCompressedHigh => _cabinet.VolumeHeader.FirstFileSizeCompressedHigh; + public uint FirstFileSizeCompressedHigh => _model.VolumeHeader.FirstFileSizeCompressedHigh; /// - public uint LastFileOffset => _cabinet.VolumeHeader.LastFileOffset; + public uint LastFileOffset => _model.VolumeHeader.LastFileOffset; /// - public uint LastFileOffsetHigh => _cabinet.VolumeHeader.LastFileOffsetHigh; + public uint LastFileOffsetHigh => _model.VolumeHeader.LastFileOffsetHigh; /// - public uint LastFileSizeExpanded => _cabinet.VolumeHeader.LastFileSizeExpanded; + public uint LastFileSizeExpanded => _model.VolumeHeader.LastFileSizeExpanded; /// - public uint LastFileSizeExpandedHigh => _cabinet.VolumeHeader.LastFileSizeExpandedHigh; + public uint LastFileSizeExpandedHigh => _model.VolumeHeader.LastFileSizeExpandedHigh; /// - public uint LastFileSizeCompressed => _cabinet.VolumeHeader.LastFileSizeCompressed; + public uint LastFileSizeCompressed => _model.VolumeHeader.LastFileSizeCompressed; /// - public uint LastFileSizeCompressedHigh => _cabinet.VolumeHeader.LastFileSizeCompressedHigh; + public uint LastFileSizeCompressedHigh => _model.VolumeHeader.LastFileSizeCompressedHigh; #endregion #region Descriptor /// - public uint StringsOffset => _cabinet.Descriptor.StringsOffset; + public uint StringsOffset => _model.Descriptor.StringsOffset; /// - public byte[] Reserved0 => _cabinet.Descriptor.Reserved0; + public byte[] Reserved0 => _model.Descriptor.Reserved0; /// - public uint ComponentListOffset => _cabinet.Descriptor.ComponentListOffset; + public uint ComponentListOffset => _model.Descriptor.ComponentListOffset; /// - public uint FileTableOffset => _cabinet.Descriptor.FileTableOffset; + public uint FileTableOffset => _model.Descriptor.FileTableOffset; /// - public byte[] Reserved1 => _cabinet.Descriptor.Reserved1; + public byte[] Reserved1 => _model.Descriptor.Reserved1; /// - public uint FileTableSize => _cabinet.Descriptor.FileTableSize; + public uint FileTableSize => _model.Descriptor.FileTableSize; /// - public uint FileTableSize2 => _cabinet.Descriptor.FileTableSize2; + public uint FileTableSize2 => _model.Descriptor.FileTableSize2; /// - public ushort DirectoryCount => _cabinet.Descriptor.DirectoryCount; + public ushort DirectoryCount => _model.Descriptor.DirectoryCount; /// - public byte[] Reserved2 => _cabinet.Descriptor.Reserved2; + public byte[] Reserved2 => _model.Descriptor.Reserved2; /// - public byte[] Reserved3 => _cabinet.Descriptor.Reserved3; + public byte[] Reserved3 => _model.Descriptor.Reserved3; /// - public byte[] Reserved4 => _cabinet.Descriptor.Reserved4; + public byte[] Reserved4 => _model.Descriptor.Reserved4; /// - public uint FileCount => _cabinet.Descriptor.FileCount; + public uint FileCount => _model.Descriptor.FileCount; /// - public uint FileTableOffset2 => _cabinet.Descriptor.FileTableOffset2; + public uint FileTableOffset2 => _model.Descriptor.FileTableOffset2; /// - public ushort ComponentTableInfoCount => _cabinet.Descriptor.ComponentTableInfoCount; + public ushort ComponentTableInfoCount => _model.Descriptor.ComponentTableInfoCount; /// - public uint ComponentTableOffset => _cabinet.Descriptor.ComponentTableOffset; + public uint ComponentTableOffset => _model.Descriptor.ComponentTableOffset; /// - public byte[] Reserved5 => _cabinet.Descriptor.Reserved5; + public byte[] Reserved5 => _model.Descriptor.Reserved5; /// - public byte[] Reserved6 => _cabinet.Descriptor.Reserved6; + public byte[] Reserved6 => _model.Descriptor.Reserved6; /// - public uint[] D_FileGroupOffsets => _cabinet.Descriptor.FileGroupOffsets; + public uint[] D_FileGroupOffsets => _model.Descriptor.FileGroupOffsets; /// - public uint[] D_ComponentOffsets => _cabinet.Descriptor.ComponentOffsets; + public uint[] D_ComponentOffsets => _model.Descriptor.ComponentOffsets; /// - public uint SetupTypesOffset => _cabinet.Descriptor.SetupTypesOffset; + public uint SetupTypesOffset => _model.Descriptor.SetupTypesOffset; /// - public uint SetupTableOffset => _cabinet.Descriptor.SetupTableOffset; + public uint SetupTableOffset => _model.Descriptor.SetupTableOffset; /// - public byte[] Reserved7 => _cabinet.Descriptor.Reserved7; + public byte[] Reserved7 => _model.Descriptor.Reserved7; /// - public byte[] Reserved8 => _cabinet.Descriptor.Reserved8; + public byte[] Reserved8 => _model.Descriptor.Reserved8; #endregion #region File Descriptor Offsets /// - public uint[] FileDescriptorOffsets => _cabinet.FileDescriptorOffsets; + public uint[] FileDescriptorOffsets => _model.FileDescriptorOffsets; #endregion #region Directory Descriptors /// - public string[] DirectoryNames => _cabinet.DirectoryNames; + public string[] DirectoryNames => _model.DirectoryNames; #endregion #region File Descriptors /// - public SabreTools.Models.InstallShieldCabinet.FileDescriptor[] FileDescriptors => _cabinet.FileDescriptors; + public SabreTools.Models.InstallShieldCabinet.FileDescriptor[] FileDescriptors => _model.FileDescriptors; #endregion #region File Group Offsets /// - public Dictionary FileGroupOffsets => _cabinet.FileGroupOffsets; + public Dictionary FileGroupOffsets => _model.FileGroupOffsets; #endregion #region File Groups /// - public SabreTools.Models.InstallShieldCabinet.FileGroup[] FileGroups => _cabinet.FileGroups; + public SabreTools.Models.InstallShieldCabinet.FileGroup[] FileGroups => _model.FileGroups; #endregion #region Component Offsets /// - public Dictionary ComponentOffsets => _cabinet.ComponentOffsets; + public Dictionary ComponentOffsets => _model.ComponentOffsets; #endregion #region Components /// - public SabreTools.Models.InstallShieldCabinet.Component[] Components => _cabinet.Components; + public SabreTools.Models.InstallShieldCabinet.Component[] Components => _model.Components; #endregion @@ -238,21 +238,29 @@ namespace BinaryObjectScanner.Wrappers #endregion - #region Instance Variables - - /// - /// Internal representation of the cabinet - /// - private SabreTools.Models.InstallShieldCabinet.Cabinet _cabinet; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private InstallShieldCabinet() { } + /// +#if NET48 + public InstallShieldCabinet(SabreTools.Models.InstallShieldCabinet.Cabinet model, byte[] data, int offset) +#else + public InstallShieldCabinet(SabreTools.Models.InstallShieldCabinet.Cabinet? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public InstallShieldCabinet(SabreTools.Models.InstallShieldCabinet.Cabinet model, Stream data) +#else + public InstallShieldCabinet(SabreTools.Models.InstallShieldCabinet.Cabinet? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create an InstallShield Cabinet from a byte array and offset @@ -290,13 +298,14 @@ namespace BinaryObjectScanner.Wrappers if (cabinet == null) return null; - var wrapper = new InstallShieldCabinet + try { - _cabinet = cabinet, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new InstallShieldCabinet(cabinet, data); + } + catch + { + return null; + } } #endregion @@ -743,7 +752,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_cabinet, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/LinearExecutable.cs b/BinaryObjectScanner.Wrappers/LinearExecutable.cs index fba16e90..cfec7ea0 100644 --- a/BinaryObjectScanner.Wrappers/LinearExecutable.cs +++ b/BinaryObjectScanner.Wrappers/LinearExecutable.cs @@ -4,12 +4,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class LinearExecutable : WrapperBase + public class LinearExecutable : WrapperBase { #region Descriptive Properties /// - public override string Description => "Linear Executable (LE/LX)"; + public override string DescriptionString => "Linear Executable (LE/LX)"; #endregion @@ -20,65 +20,65 @@ namespace BinaryObjectScanner.Wrappers #region Standard Fields /// - public string Stub_Magic => _executable.Stub.Header.Magic; + public string Stub_Magic => _model.Stub.Header.Magic; /// - public ushort Stub_LastPageBytes => _executable.Stub.Header.LastPageBytes; + public ushort Stub_LastPageBytes => _model.Stub.Header.LastPageBytes; /// - public ushort Stub_Pages => _executable.Stub.Header.Pages; + public ushort Stub_Pages => _model.Stub.Header.Pages; /// - public ushort Stub_RelocationItems => _executable.Stub.Header.RelocationItems; + public ushort Stub_RelocationItems => _model.Stub.Header.RelocationItems; /// - public ushort Stub_HeaderParagraphSize => _executable.Stub.Header.HeaderParagraphSize; + public ushort Stub_HeaderParagraphSize => _model.Stub.Header.HeaderParagraphSize; /// - public ushort Stub_MinimumExtraParagraphs => _executable.Stub.Header.MinimumExtraParagraphs; + public ushort Stub_MinimumExtraParagraphs => _model.Stub.Header.MinimumExtraParagraphs; /// - public ushort Stub_MaximumExtraParagraphs => _executable.Stub.Header.MaximumExtraParagraphs; + public ushort Stub_MaximumExtraParagraphs => _model.Stub.Header.MaximumExtraParagraphs; /// - public ushort Stub_InitialSSValue => _executable.Stub.Header.InitialSSValue; + public ushort Stub_InitialSSValue => _model.Stub.Header.InitialSSValue; /// - public ushort Stub_InitialSPValue => _executable.Stub.Header.InitialSPValue; + public ushort Stub_InitialSPValue => _model.Stub.Header.InitialSPValue; /// - public ushort Stub_Checksum => _executable.Stub.Header.Checksum; + public ushort Stub_Checksum => _model.Stub.Header.Checksum; /// - public ushort Stub_InitialIPValue => _executable.Stub.Header.InitialIPValue; + public ushort Stub_InitialIPValue => _model.Stub.Header.InitialIPValue; /// - public ushort Stub_InitialCSValue => _executable.Stub.Header.InitialCSValue; + public ushort Stub_InitialCSValue => _model.Stub.Header.InitialCSValue; /// - public ushort Stub_RelocationTableAddr => _executable.Stub.Header.RelocationTableAddr; + public ushort Stub_RelocationTableAddr => _model.Stub.Header.RelocationTableAddr; /// - public ushort Stub_OverlayNumber => _executable.Stub.Header.OverlayNumber; + public ushort Stub_OverlayNumber => _model.Stub.Header.OverlayNumber; #endregion #region PE Extensions /// - public ushort[] Stub_Reserved1 => _executable.Stub.Header.Reserved1; + public ushort[] Stub_Reserved1 => _model.Stub.Header.Reserved1; /// - public ushort Stub_OEMIdentifier => _executable.Stub.Header.OEMIdentifier; + public ushort Stub_OEMIdentifier => _model.Stub.Header.OEMIdentifier; /// - public ushort Stub_OEMInformation => _executable.Stub.Header.OEMInformation; + public ushort Stub_OEMInformation => _model.Stub.Header.OEMInformation; /// - public ushort[] Stub_Reserved2 => _executable.Stub.Header.Reserved2; + public ushort[] Stub_Reserved2 => _model.Stub.Header.Reserved2; /// - public uint Stub_NewExeHeaderAddr => _executable.Stub.Header.NewExeHeaderAddr; + public uint Stub_NewExeHeaderAddr => _model.Stub.Header.NewExeHeaderAddr; #endregion @@ -87,198 +87,198 @@ namespace BinaryObjectScanner.Wrappers #region Information Block /// - public string Signature => _executable.InformationBlock.Signature; + public string Signature => _model.InformationBlock.Signature; /// - public SabreTools.Models.LinearExecutable.ByteOrder ByteOrder => _executable.InformationBlock.ByteOrder; + public SabreTools.Models.LinearExecutable.ByteOrder ByteOrder => _model.InformationBlock.ByteOrder; /// - public SabreTools.Models.LinearExecutable.WordOrder WordOrder => _executable.InformationBlock.WordOrder; + public SabreTools.Models.LinearExecutable.WordOrder WordOrder => _model.InformationBlock.WordOrder; /// - public uint ExecutableFormatLevel => _executable.InformationBlock.ExecutableFormatLevel; + public uint ExecutableFormatLevel => _model.InformationBlock.ExecutableFormatLevel; /// - public SabreTools.Models.LinearExecutable.CPUType CPUType => _executable.InformationBlock.CPUType; + public SabreTools.Models.LinearExecutable.CPUType CPUType => _model.InformationBlock.CPUType; /// - public SabreTools.Models.LinearExecutable.OperatingSystem ModuleOS => _executable.InformationBlock.ModuleOS; + public SabreTools.Models.LinearExecutable.OperatingSystem ModuleOS => _model.InformationBlock.ModuleOS; /// - public uint ModuleVersion => _executable.InformationBlock.ModuleVersion; + public uint ModuleVersion => _model.InformationBlock.ModuleVersion; /// - public SabreTools.Models.LinearExecutable.ModuleFlags ModuleTypeFlags => _executable.InformationBlock.ModuleTypeFlags; + public SabreTools.Models.LinearExecutable.ModuleFlags ModuleTypeFlags => _model.InformationBlock.ModuleTypeFlags; /// - public uint ModuleNumberPages => _executable.InformationBlock.ModuleNumberPages; + public uint ModuleNumberPages => _model.InformationBlock.ModuleNumberPages; /// - public uint InitialObjectCS => _executable.InformationBlock.InitialObjectCS; + public uint InitialObjectCS => _model.InformationBlock.InitialObjectCS; /// - public uint InitialEIP => _executable.InformationBlock.InitialEIP; + public uint InitialEIP => _model.InformationBlock.InitialEIP; /// - public uint InitialObjectSS => _executable.InformationBlock.InitialObjectSS; + public uint InitialObjectSS => _model.InformationBlock.InitialObjectSS; /// - public uint InitialESP => _executable.InformationBlock.InitialESP; + public uint InitialESP => _model.InformationBlock.InitialESP; /// - public uint MemoryPageSize => _executable.InformationBlock.MemoryPageSize; + public uint MemoryPageSize => _model.InformationBlock.MemoryPageSize; /// - public uint BytesOnLastPage => _executable.InformationBlock.BytesOnLastPage; + public uint BytesOnLastPage => _model.InformationBlock.BytesOnLastPage; /// - public uint FixupSectionSize => _executable.InformationBlock.FixupSectionSize; + public uint FixupSectionSize => _model.InformationBlock.FixupSectionSize; /// - public uint FixupSectionChecksum => _executable.InformationBlock.FixupSectionChecksum; + public uint FixupSectionChecksum => _model.InformationBlock.FixupSectionChecksum; /// - public uint LoaderSectionSize => _executable.InformationBlock.LoaderSectionSize; + public uint LoaderSectionSize => _model.InformationBlock.LoaderSectionSize; /// - public uint LoaderSectionChecksum => _executable.InformationBlock.LoaderSectionChecksum; + public uint LoaderSectionChecksum => _model.InformationBlock.LoaderSectionChecksum; /// - public uint ObjectTableOffset => _executable.InformationBlock.ObjectTableOffset; + public uint ObjectTableOffset => _model.InformationBlock.ObjectTableOffset; /// - public uint ObjectTableCount => _executable.InformationBlock.ObjectTableCount; + public uint ObjectTableCount => _model.InformationBlock.ObjectTableCount; /// - public uint ObjectPageMapOffset => _executable.InformationBlock.ObjectPageMapOffset; + public uint ObjectPageMapOffset => _model.InformationBlock.ObjectPageMapOffset; /// - public uint ObjectIterateDataMapOffset => _executable.InformationBlock.ObjectIterateDataMapOffset; + public uint ObjectIterateDataMapOffset => _model.InformationBlock.ObjectIterateDataMapOffset; /// - public uint ResourceTableOffset => _executable.InformationBlock.ResourceTableOffset; + public uint ResourceTableOffset => _model.InformationBlock.ResourceTableOffset; /// - public uint ResourceTableCount => _executable.InformationBlock.ResourceTableCount; + public uint ResourceTableCount => _model.InformationBlock.ResourceTableCount; /// - public uint ResidentNamesTableOffset => _executable.InformationBlock.ResidentNamesTableOffset; + public uint ResidentNamesTableOffset => _model.InformationBlock.ResidentNamesTableOffset; /// - public uint EntryTableOffset => _executable.InformationBlock.EntryTableOffset; + public uint EntryTableOffset => _model.InformationBlock.EntryTableOffset; /// - public uint ModuleDirectivesTableOffset => _executable.InformationBlock.ModuleDirectivesTableOffset; + public uint ModuleDirectivesTableOffset => _model.InformationBlock.ModuleDirectivesTableOffset; /// - public uint ModuleDirectivesCount => _executable.InformationBlock.ModuleDirectivesCount; + public uint ModuleDirectivesCount => _model.InformationBlock.ModuleDirectivesCount; /// - public uint FixupPageTableOffset => _executable.InformationBlock.FixupPageTableOffset; + public uint FixupPageTableOffset => _model.InformationBlock.FixupPageTableOffset; /// - public uint FixupRecordTableOffset => _executable.InformationBlock.FixupRecordTableOffset; + public uint FixupRecordTableOffset => _model.InformationBlock.FixupRecordTableOffset; /// - public uint ImportedModulesNameTableOffset => _executable.InformationBlock.ImportedModulesNameTableOffset; + public uint ImportedModulesNameTableOffset => _model.InformationBlock.ImportedModulesNameTableOffset; /// - public uint ImportedModulesCount => _executable.InformationBlock.ImportedModulesCount; + public uint ImportedModulesCount => _model.InformationBlock.ImportedModulesCount; /// - public uint ImportProcedureNameTableOffset => _executable.InformationBlock.ImportProcedureNameTableOffset; + public uint ImportProcedureNameTableOffset => _model.InformationBlock.ImportProcedureNameTableOffset; /// - public uint PerPageChecksumTableOffset => _executable.InformationBlock.PerPageChecksumTableOffset; + public uint PerPageChecksumTableOffset => _model.InformationBlock.PerPageChecksumTableOffset; /// - public uint DataPagesOffset => _executable.InformationBlock.DataPagesOffset; + public uint DataPagesOffset => _model.InformationBlock.DataPagesOffset; /// - public uint PreloadPageCount => _executable.InformationBlock.PreloadPageCount; + public uint PreloadPageCount => _model.InformationBlock.PreloadPageCount; /// - public uint NonResidentNamesTableOffset => _executable.InformationBlock.NonResidentNamesTableOffset; + public uint NonResidentNamesTableOffset => _model.InformationBlock.NonResidentNamesTableOffset; /// - public uint NonResidentNamesTableLength => _executable.InformationBlock.NonResidentNamesTableLength; + public uint NonResidentNamesTableLength => _model.InformationBlock.NonResidentNamesTableLength; /// - public uint NonResidentNamesTableChecksum => _executable.InformationBlock.NonResidentNamesTableChecksum; + public uint NonResidentNamesTableChecksum => _model.InformationBlock.NonResidentNamesTableChecksum; /// - public uint AutomaticDataObject => _executable.InformationBlock.AutomaticDataObject; + public uint AutomaticDataObject => _model.InformationBlock.AutomaticDataObject; /// - public uint DebugInformationOffset => _executable.InformationBlock.DebugInformationOffset; + public uint DebugInformationOffset => _model.InformationBlock.DebugInformationOffset; /// - public uint DebugInformationLength => _executable.InformationBlock.DebugInformationLength; + public uint DebugInformationLength => _model.InformationBlock.DebugInformationLength; /// - public uint PreloadInstancePagesNumber => _executable.InformationBlock.PreloadInstancePagesNumber; + public uint PreloadInstancePagesNumber => _model.InformationBlock.PreloadInstancePagesNumber; /// - public uint DemandInstancePagesNumber => _executable.InformationBlock.DemandInstancePagesNumber; + public uint DemandInstancePagesNumber => _model.InformationBlock.DemandInstancePagesNumber; /// - public uint ExtraHeapAllocation => _executable.InformationBlock.ExtraHeapAllocation; + public uint ExtraHeapAllocation => _model.InformationBlock.ExtraHeapAllocation; #endregion #region Tables /// - public SabreTools.Models.LinearExecutable.ObjectTableEntry[] ObjectTable => _executable.ObjectTable; + public SabreTools.Models.LinearExecutable.ObjectTableEntry[] ObjectTable => _model.ObjectTable; /// - public SabreTools.Models.LinearExecutable.ObjectPageMapEntry[] ObjectPageMap => _executable.ObjectPageMap; + public SabreTools.Models.LinearExecutable.ObjectPageMapEntry[] ObjectPageMap => _model.ObjectPageMap; /// - public SabreTools.Models.LinearExecutable.ResourceTableEntry[] ResourceTable => _executable.ResourceTable; + public SabreTools.Models.LinearExecutable.ResourceTableEntry[] ResourceTable => _model.ResourceTable; /// - public SabreTools.Models.LinearExecutable.ResidentNamesTableEntry[] ResidentNamesTable => _executable.ResidentNamesTable; + public SabreTools.Models.LinearExecutable.ResidentNamesTableEntry[] ResidentNamesTable => _model.ResidentNamesTable; /// - public SabreTools.Models.LinearExecutable.EntryTableBundle[] EntryTable => _executable.EntryTable; + public SabreTools.Models.LinearExecutable.EntryTableBundle[] EntryTable => _model.EntryTable; /// - public SabreTools.Models.LinearExecutable.ModuleFormatDirectivesTableEntry[] ModuleFormatDirectivesTable => _executable.ModuleFormatDirectivesTable; + public SabreTools.Models.LinearExecutable.ModuleFormatDirectivesTableEntry[] ModuleFormatDirectivesTable => _model.ModuleFormatDirectivesTable; /// - public SabreTools.Models.LinearExecutable.VerifyRecordDirectiveTableEntry[] VerifyRecordDirectiveTable => _executable.VerifyRecordDirectiveTable; + public SabreTools.Models.LinearExecutable.VerifyRecordDirectiveTableEntry[] VerifyRecordDirectiveTable => _model.VerifyRecordDirectiveTable; /// - public SabreTools.Models.LinearExecutable.PerPageChecksumTableEntry[] PerPageChecksumTable => _executable.PerPageChecksumTable; + public SabreTools.Models.LinearExecutable.PerPageChecksumTableEntry[] PerPageChecksumTable => _model.PerPageChecksumTable; /// - public SabreTools.Models.LinearExecutable.FixupPageTableEntry[] FixupPageTable => _executable.FixupPageTable; + public SabreTools.Models.LinearExecutable.FixupPageTableEntry[] FixupPageTable => _model.FixupPageTable; /// - public SabreTools.Models.LinearExecutable.FixupRecordTableEntry[] FixupRecordTable => _executable.FixupRecordTable; + public SabreTools.Models.LinearExecutable.FixupRecordTableEntry[] FixupRecordTable => _model.FixupRecordTable; /// - public SabreTools.Models.LinearExecutable.ImportModuleNameTableEntry[] ImportModuleNameTable => _executable.ImportModuleNameTable; + public SabreTools.Models.LinearExecutable.ImportModuleNameTableEntry[] ImportModuleNameTable => _model.ImportModuleNameTable; /// - public SabreTools.Models.LinearExecutable.ImportModuleProcedureNameTableEntry[] ImportModuleProcedureNameTable => _executable.ImportModuleProcedureNameTable; + public SabreTools.Models.LinearExecutable.ImportModuleProcedureNameTableEntry[] ImportModuleProcedureNameTable => _model.ImportModuleProcedureNameTable; /// - public SabreTools.Models.LinearExecutable.NonResidentNamesTableEntry[] NonResidentNamesTable => _executable.NonResidentNamesTable; + public SabreTools.Models.LinearExecutable.NonResidentNamesTableEntry[] NonResidentNamesTable => _model.NonResidentNamesTable; #endregion #region Debug Information /// - public string DI_Signature => _executable.DebugInformation?.Signature; + public string DI_Signature => _model.DebugInformation?.Signature; /// - public SabreTools.Models.LinearExecutable.DebugFormatType? DI_FormatType => _executable.DebugInformation?.FormatType; + public SabreTools.Models.LinearExecutable.DebugFormatType? DI_FormatType => _model.DebugInformation?.FormatType; /// - public byte[] DebuggerData => _executable.DebugInformation?.DebuggerData; + public byte[] DebuggerData => _model.DebugInformation?.DebuggerData; #endregion @@ -290,23 +290,29 @@ namespace BinaryObjectScanner.Wrappers #endregion - #region Instance Variables - - /// - /// Internal representation of the executable - /// - private SabreTools.Models.LinearExecutable.Executable _executable; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private LinearExecutable() { } + /// +#if NET48 + public LinearExecutable(SabreTools.Models.LinearExecutable.Executable model, byte[] data, int offset) +#else + public LinearExecutable(SabreTools.Models.LinearExecutable.Executable? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } - /// + /// +#if NET48 + public LinearExecutable(SabreTools.Models.LinearExecutable.Executable model, Stream data) +#else + public LinearExecutable(SabreTools.Models.LinearExecutable.Executable? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + }/// /// Create an LE/LX executable from a byte array and offset /// /// Byte array representing the executable @@ -342,13 +348,14 @@ namespace BinaryObjectScanner.Wrappers if (executable == null) return null; - var wrapper = new LinearExecutable + try { - _executable = executable, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new LinearExecutable(executable, data); + } + catch + { + return null; + } } #endregion @@ -1007,7 +1014,7 @@ namespace BinaryObjectScanner.Wrappers { builder.AppendLine(" Debug Information:"); builder.AppendLine(" -------------------------"); - if (_executable.DebugInformation == null) + if (_model.DebugInformation == null) { builder.AppendLine(" No debug information"); } @@ -1023,7 +1030,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_executable, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/MSDOS.cs b/BinaryObjectScanner.Wrappers/MSDOS.cs index a975f55b..f86985ce 100644 --- a/BinaryObjectScanner.Wrappers/MSDOS.cs +++ b/BinaryObjectScanner.Wrappers/MSDOS.cs @@ -3,12 +3,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class MSDOS : WrapperBase + public class MSDOS : WrapperBase { #region Descriptive Properties /// - public override string Description => "MS-DOS Executable"; + public override string DescriptionString => "MS-DOS Executable"; #endregion @@ -17,99 +17,105 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public string Magic => _executable.Header.Magic; + public string Magic => _model.Header.Magic; /// - public ushort LastPageBytes => _executable.Header.LastPageBytes; + public ushort LastPageBytes => _model.Header.LastPageBytes; /// - public ushort Pages => _executable.Header.Pages; + public ushort Pages => _model.Header.Pages; /// - public ushort RelocationItems => _executable.Header.RelocationItems; + public ushort RelocationItems => _model.Header.RelocationItems; /// - public ushort HeaderParagraphSize => _executable.Header.HeaderParagraphSize; + public ushort HeaderParagraphSize => _model.Header.HeaderParagraphSize; /// - public ushort MinimumExtraParagraphs => _executable.Header.MinimumExtraParagraphs; + public ushort MinimumExtraParagraphs => _model.Header.MinimumExtraParagraphs; /// - public ushort MaximumExtraParagraphs => _executable.Header.MaximumExtraParagraphs; + public ushort MaximumExtraParagraphs => _model.Header.MaximumExtraParagraphs; /// - public ushort InitialSSValue => _executable.Header.InitialSSValue; + public ushort InitialSSValue => _model.Header.InitialSSValue; /// - public ushort InitialSPValue => _executable.Header.InitialSPValue; + public ushort InitialSPValue => _model.Header.InitialSPValue; /// - public ushort Checksum => _executable.Header.Checksum; + public ushort Checksum => _model.Header.Checksum; /// - public ushort InitialIPValue => _executable.Header.InitialIPValue; + public ushort InitialIPValue => _model.Header.InitialIPValue; /// - public ushort InitialCSValue => _executable.Header.InitialCSValue; + public ushort InitialCSValue => _model.Header.InitialCSValue; /// - public ushort RelocationTableAddr => _executable.Header.RelocationTableAddr; + public ushort RelocationTableAddr => _model.Header.RelocationTableAddr; /// - public ushort OverlayNumber => _executable.Header.OverlayNumber; + public ushort OverlayNumber => _model.Header.OverlayNumber; #endregion #region PE Extensions /// - public ushort[] Reserved1 => _executable.Header.Reserved1; + public ushort[] Reserved1 => _model.Header.Reserved1; /// - public ushort OEMIdentifier => _executable.Header.OEMIdentifier; + public ushort OEMIdentifier => _model.Header.OEMIdentifier; /// - public ushort OEMInformation => _executable.Header.OEMInformation; + public ushort OEMInformation => _model.Header.OEMInformation; /// - public ushort[] Reserved2 => _executable.Header.Reserved2; + public ushort[] Reserved2 => _model.Header.Reserved2; /// - public uint NewExeHeaderAddr => _executable.Header.NewExeHeaderAddr; + public uint NewExeHeaderAddr => _model.Header.NewExeHeaderAddr; #endregion #region Relocation Table /// - public SabreTools.Models.MSDOS.RelocationEntry[] RelocationTable => _executable.RelocationTable; + public SabreTools.Models.MSDOS.RelocationEntry[] RelocationTable => _model.RelocationTable; #endregion #endregion - #region Instance Variables - - /// - /// Internal representation of the executable - /// - private SabreTools.Models.MSDOS.Executable _executable; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private MSDOS() { } + /// +#if NET48 + public MSDOS(SabreTools.Models.MSDOS.Executable model, byte[] data, int offset) +#else + public MSDOS(SabreTools.Models.MSDOS.Executable? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } - /// - /// Create an MS-DOS executable from a byte array and offset - /// - /// Byte array representing the executable - /// Offset within the array to parse - /// An MS-DOS executable wrapper on success, null on failure + /// +#if NET48 + public MSDOS(SabreTools.Models.MSDOS.Executable model, Stream data) +#else + public MSDOS(SabreTools.Models.MSDOS.Executable? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + }/// + /// Create an MS-DOS executable from a byte array and offset + /// + /// Byte array representing the executable + /// Offset within the array to parse + /// An MS-DOS executable wrapper on success, null on failure public static MSDOS Create(byte[] data, int offset) { // If the data is invalid @@ -140,19 +146,20 @@ namespace BinaryObjectScanner.Wrappers if (executable == null) return null; - var wrapper = new MSDOS + try { - _executable = executable, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new MSDOS(executable, data); + } + catch + { + return null; + } } - + #endregion #region Printing - + /// public override StringBuilder PrettyPrint() { @@ -220,7 +227,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_executable, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/MicrosoftCabinet.cs b/BinaryObjectScanner.Wrappers/MicrosoftCabinet.cs index d53d944b..76de3bd4 100644 --- a/BinaryObjectScanner.Wrappers/MicrosoftCabinet.cs +++ b/BinaryObjectScanner.Wrappers/MicrosoftCabinet.cs @@ -5,12 +5,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public partial class MicrosoftCabinet : WrapperBase + public partial class MicrosoftCabinet : WrapperBase { #region Descriptive Properties /// - public override string Description => "Microsoft Cabinet"; + public override string DescriptionString => "Microsoft Cabinet"; #endregion @@ -19,103 +19,109 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public string Signature => _cabinet.Header.Signature; + public string Signature => _model.Header.Signature; /// - public uint Reserved1 => _cabinet.Header.Reserved1; + public uint Reserved1 => _model.Header.Reserved1; /// - public uint CabinetSize => _cabinet.Header.CabinetSize; + public uint CabinetSize => _model.Header.CabinetSize; /// - public uint Reserved2 => _cabinet.Header.Reserved2; + public uint Reserved2 => _model.Header.Reserved2; /// - public uint FilesOffset => _cabinet.Header.FilesOffset; + public uint FilesOffset => _model.Header.FilesOffset; /// - public uint Reserved3 => _cabinet.Header.Reserved3; + public uint Reserved3 => _model.Header.Reserved3; /// - public byte VersionMinor => _cabinet.Header.VersionMinor; + public byte VersionMinor => _model.Header.VersionMinor; /// - public byte VersionMajor => _cabinet.Header.VersionMajor; + public byte VersionMajor => _model.Header.VersionMajor; /// - public ushort FolderCount => _cabinet.Header.FolderCount; + public ushort FolderCount => _model.Header.FolderCount; /// - public ushort FileCount => _cabinet.Header.FileCount; + public ushort FileCount => _model.Header.FileCount; /// - public SabreTools.Models.MicrosoftCabinet.HeaderFlags Flags => _cabinet.Header.Flags; + public SabreTools.Models.MicrosoftCabinet.HeaderFlags Flags => _model.Header.Flags; /// - public ushort SetID => _cabinet.Header.SetID; + public ushort SetID => _model.Header.SetID; /// - public ushort CabinetIndex => _cabinet.Header.CabinetIndex; + public ushort CabinetIndex => _model.Header.CabinetIndex; /// - public ushort HeaderReservedSize => _cabinet.Header.HeaderReservedSize; + public ushort HeaderReservedSize => _model.Header.HeaderReservedSize; /// - public byte FolderReservedSize => _cabinet.Header.FolderReservedSize; + public byte FolderReservedSize => _model.Header.FolderReservedSize; /// - public byte DataReservedSize => _cabinet.Header.DataReservedSize; + public byte DataReservedSize => _model.Header.DataReservedSize; /// - public byte[] ReservedData => _cabinet.Header.ReservedData; + public byte[] ReservedData => _model.Header.ReservedData; /// - public string CabinetPrev => _cabinet.Header.CabinetPrev; + public string CabinetPrev => _model.Header.CabinetPrev; /// - public string DiskPrev => _cabinet.Header.DiskPrev; + public string DiskPrev => _model.Header.DiskPrev; /// - public string CabinetNext => _cabinet.Header.CabinetNext; + public string CabinetNext => _model.Header.CabinetNext; /// - public string DiskNext => _cabinet.Header.DiskNext; + public string DiskNext => _model.Header.DiskNext; #endregion #region Folders /// - public SabreTools.Models.MicrosoftCabinet.CFFOLDER[] Folders => _cabinet.Folders; + public SabreTools.Models.MicrosoftCabinet.CFFOLDER[] Folders => _model.Folders; #endregion #region Files /// - public SabreTools.Models.MicrosoftCabinet.CFFILE[] Files => _cabinet.Files; + public SabreTools.Models.MicrosoftCabinet.CFFILE[] Files => _model.Files; #endregion #endregion - #region Instance Variables - - /// - /// Internal representation of the cabinet - /// - private SabreTools.Models.MicrosoftCabinet.Cabinet _cabinet; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private MicrosoftCabinet() { } + /// +#if NET48 + public MicrosoftCabinet(SabreTools.Models.MicrosoftCabinet.Cabinet model, byte[] data, int offset) +#else + public MicrosoftCabinet(SabreTools.Models.MicrosoftCabinet.Cabinet? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } - /// + /// +#if NET48 + public MicrosoftCabinet(SabreTools.Models.MicrosoftCabinet.Cabinet model, Stream data) +#else + public MicrosoftCabinet(SabreTools.Models.MicrosoftCabinet.Cabinet? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + }/// /// Create a Microsoft Cabinet from a byte array and offset /// /// Byte array representing the cabinet @@ -151,13 +157,14 @@ namespace BinaryObjectScanner.Wrappers if (cabinet == null) return null; - var wrapper = new MicrosoftCabinet + try { - _cabinet = cabinet, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new MicrosoftCabinet(cabinet, data); + } + catch + { + return null; + } } #endregion @@ -557,7 +564,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_cabinet, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/N3DS.cs b/BinaryObjectScanner.Wrappers/N3DS.cs index 04555a34..7cb74df0 100644 --- a/BinaryObjectScanner.Wrappers/N3DS.cs +++ b/BinaryObjectScanner.Wrappers/N3DS.cs @@ -4,12 +4,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class N3DS : WrapperBase + public class N3DS : WrapperBase { #region Descriptive Properties /// - public override string Description => "Nintendo 3DS Cart Image"; + public override string DescriptionString => "Nintendo 3DS Cart Image"; #endregion @@ -20,66 +20,66 @@ namespace BinaryObjectScanner.Wrappers #region Common to all NCSD files /// - public byte[] RSA2048Signature => _cart.Header.RSA2048Signature; + public byte[] RSA2048Signature => _model.Header.RSA2048Signature; /// - public string MagicNumber => _cart.Header.MagicNumber; + public string MagicNumber => _model.Header.MagicNumber; /// - public uint ImageSizeInMediaUnits => _cart.Header.ImageSizeInMediaUnits; + public uint ImageSizeInMediaUnits => _model.Header.ImageSizeInMediaUnits; /// - public byte[] MediaId => _cart.Header.MediaId; + public byte[] MediaId => _model.Header.MediaId; /// - public SabreTools.Models.N3DS.FilesystemType PartitionsFSType => _cart.Header.PartitionsFSType; + public SabreTools.Models.N3DS.FilesystemType PartitionsFSType => _model.Header.PartitionsFSType; /// - public byte[] PartitionsCryptType => _cart.Header.PartitionsCryptType; + public byte[] PartitionsCryptType => _model.Header.PartitionsCryptType; /// - public SabreTools.Models.N3DS.PartitionTableEntry[] PartitionsTable => _cart.Header.PartitionsTable; + public SabreTools.Models.N3DS.PartitionTableEntry[] PartitionsTable => _model.Header.PartitionsTable; #endregion #region CTR Cart Image (CCI) Specific /// - public byte[] ExheaderHash => _cart.Header.ExheaderHash; + public byte[] ExheaderHash => _model.Header.ExheaderHash; /// - public uint AdditionalHeaderSize => _cart.Header.AdditionalHeaderSize; + public uint AdditionalHeaderSize => _model.Header.AdditionalHeaderSize; /// - public uint SectorZeroOffset => _cart.Header.SectorZeroOffset; + public uint SectorZeroOffset => _model.Header.SectorZeroOffset; /// - public byte[] PartitionFlags => _cart.Header.PartitionFlags; + public byte[] PartitionFlags => _model.Header.PartitionFlags; /// - public ulong[] PartitionIdTable => _cart.Header.PartitionIdTable; + public ulong[] PartitionIdTable => _model.Header.PartitionIdTable; /// - public byte[] Reserved1 => _cart.Header.Reserved1; + public byte[] Reserved1 => _model.Header.Reserved1; /// - public byte[] Reserved2 => _cart.Header.Reserved2; + public byte[] Reserved2 => _model.Header.Reserved2; /// - public byte FirmUpdateByte1 => _cart.Header.FirmUpdateByte1; + public byte FirmUpdateByte1 => _model.Header.FirmUpdateByte1; /// - public byte FirmUpdateByte2 => _cart.Header.FirmUpdateByte2; + public byte FirmUpdateByte2 => _model.Header.FirmUpdateByte2; #endregion #region Raw NAND Format Specific /// - public byte[] Unknown => _cart.Header.Unknown; + public byte[] Unknown => _model.Header.Unknown; /// - public byte[] EncryptedMBR => _cart.Header.EncryptedMBR; + public byte[] EncryptedMBR => _model.Header.EncryptedMBR; #endregion @@ -88,37 +88,37 @@ namespace BinaryObjectScanner.Wrappers #region Card Info Header /// - public uint CIH_WritableAddressMediaUnits => _cart.CardInfoHeader.WritableAddressMediaUnits; + public uint CIH_WritableAddressMediaUnits => _model.CardInfoHeader.WritableAddressMediaUnits; /// - public uint CIH_CardInfoBitmask => _cart.CardInfoHeader.CardInfoBitmask; + public uint CIH_CardInfoBitmask => _model.CardInfoHeader.CardInfoBitmask; /// - public byte[] CIH_Reserved1 => _cart.CardInfoHeader.Reserved1; + public byte[] CIH_Reserved1 => _model.CardInfoHeader.Reserved1; /// - public uint CIH_FilledSize => _cart.CardInfoHeader.FilledSize; + public uint CIH_FilledSize => _model.CardInfoHeader.FilledSize; /// - public byte[] CIH_Reserved2 => _cart.CardInfoHeader.Reserved2; + public byte[] CIH_Reserved2 => _model.CardInfoHeader.Reserved2; /// - public ushort CIH_TitleVersion => _cart.CardInfoHeader.TitleVersion; + public ushort CIH_TitleVersion => _model.CardInfoHeader.TitleVersion; /// - public ushort CIH_CardRevision => _cart.CardInfoHeader.CardRevision; + public ushort CIH_CardRevision => _model.CardInfoHeader.CardRevision; /// - public byte[] CIH_Reserved3 => _cart.CardInfoHeader.Reserved3; + public byte[] CIH_Reserved3 => _model.CardInfoHeader.Reserved3; /// - public byte[] CIH_CVerTitleID => _cart.CardInfoHeader.CVerTitleID; + public byte[] CIH_CVerTitleID => _model.CardInfoHeader.CVerTitleID; /// - public ushort CIH_CVerVersionNumber => _cart.CardInfoHeader.CVerVersionNumber; + public ushort CIH_CVerVersionNumber => _model.CardInfoHeader.CVerVersionNumber; /// - public byte[] CIH_Reserved4 => _cart.CardInfoHeader.Reserved4; + public byte[] CIH_Reserved4 => _model.CardInfoHeader.Reserved4; #endregion @@ -127,65 +127,65 @@ namespace BinaryObjectScanner.Wrappers #region Initial Data /// - public byte[] DCIH_ID_CardSeedKeyY => _cart.DevelopmentCardInfoHeader?.InitialData?.CardSeedKeyY; + public byte[] DCIH_ID_CardSeedKeyY => _model.DevelopmentCardInfoHeader?.InitialData?.CardSeedKeyY; /// - public byte[] DCIH_ID_EncryptedCardSeed => _cart.DevelopmentCardInfoHeader?.InitialData?.EncryptedCardSeed; + public byte[] DCIH_ID_EncryptedCardSeed => _model.DevelopmentCardInfoHeader?.InitialData?.EncryptedCardSeed; /// - public byte[] DCIH_ID_CardSeedAESMAC => _cart.DevelopmentCardInfoHeader?.InitialData?.CardSeedAESMAC; + public byte[] DCIH_ID_CardSeedAESMAC => _model.DevelopmentCardInfoHeader?.InitialData?.CardSeedAESMAC; /// - public byte[] DCIH_ID_CardSeedNonce => _cart.DevelopmentCardInfoHeader?.InitialData?.CardSeedNonce; + public byte[] DCIH_ID_CardSeedNonce => _model.DevelopmentCardInfoHeader?.InitialData?.CardSeedNonce; /// - public byte[] DCIH_ID_Reserved => _cart.DevelopmentCardInfoHeader?.InitialData?.Reserved; + public byte[] DCIH_ID_Reserved => _model.DevelopmentCardInfoHeader?.InitialData?.Reserved; /// - public SabreTools.Models.N3DS.NCCHHeader DCIH_ID_BackupHeader => _cart.DevelopmentCardInfoHeader?.InitialData?.BackupHeader; + public SabreTools.Models.N3DS.NCCHHeader DCIH_ID_BackupHeader => _model.DevelopmentCardInfoHeader?.InitialData?.BackupHeader; #endregion /// - public byte[] DCIH_CardDeviceReserved1 => _cart.DevelopmentCardInfoHeader?.CardDeviceReserved1; + public byte[] DCIH_CardDeviceReserved1 => _model.DevelopmentCardInfoHeader?.CardDeviceReserved1; /// - public byte[] DCIH_TitleKey => _cart.DevelopmentCardInfoHeader?.TitleKey; + public byte[] DCIH_TitleKey => _model.DevelopmentCardInfoHeader?.TitleKey; /// - public byte[] DCIH_CardDeviceReserved2 => _cart.DevelopmentCardInfoHeader?.CardDeviceReserved2; + public byte[] DCIH_CardDeviceReserved2 => _model.DevelopmentCardInfoHeader?.CardDeviceReserved2; #region Test Data /// - public byte[] DCIH_TD_Signature => _cart.DevelopmentCardInfoHeader?.TestData?.Signature; + public byte[] DCIH_TD_Signature => _model.DevelopmentCardInfoHeader?.TestData?.Signature; /// - public byte[] DCIH_TD_AscendingByteSequence => _cart.DevelopmentCardInfoHeader?.TestData?.AscendingByteSequence; + public byte[] DCIH_TD_AscendingByteSequence => _model.DevelopmentCardInfoHeader?.TestData?.AscendingByteSequence; /// - public byte[] DCIH_TD_DescendingByteSequence => _cart.DevelopmentCardInfoHeader?.TestData?.DescendingByteSequence; + public byte[] DCIH_TD_DescendingByteSequence => _model.DevelopmentCardInfoHeader?.TestData?.DescendingByteSequence; /// - public byte[] DCIH_TD_Filled00 => _cart.DevelopmentCardInfoHeader?.TestData?.Filled00; + public byte[] DCIH_TD_Filled00 => _model.DevelopmentCardInfoHeader?.TestData?.Filled00; /// - public byte[] DCIH_TD_FilledFF => _cart.DevelopmentCardInfoHeader?.TestData?.FilledFF; + public byte[] DCIH_TD_FilledFF => _model.DevelopmentCardInfoHeader?.TestData?.FilledFF; /// - public byte[] DCIH_TD_Filled0F => _cart.DevelopmentCardInfoHeader?.TestData?.Filled0F; + public byte[] DCIH_TD_Filled0F => _model.DevelopmentCardInfoHeader?.TestData?.Filled0F; /// - public byte[] DCIH_TD_FilledF0 => _cart.DevelopmentCardInfoHeader?.TestData?.FilledF0; + public byte[] DCIH_TD_FilledF0 => _model.DevelopmentCardInfoHeader?.TestData?.FilledF0; /// - public byte[] DCIH_TD_Filled55 => _cart.DevelopmentCardInfoHeader?.TestData?.Filled55; + public byte[] DCIH_TD_Filled55 => _model.DevelopmentCardInfoHeader?.TestData?.Filled55; /// - public byte[] DCIH_TD_FilledAA => _cart.DevelopmentCardInfoHeader?.TestData?.FilledAA; + public byte[] DCIH_TD_FilledAA => _model.DevelopmentCardInfoHeader?.TestData?.FilledAA; /// - public byte? DCIH_TD_FinalByte => _cart.DevelopmentCardInfoHeader?.TestData?.FinalByte; + public byte? DCIH_TD_FinalByte => _model.DevelopmentCardInfoHeader?.TestData?.FinalByte; #endregion @@ -194,48 +194,56 @@ namespace BinaryObjectScanner.Wrappers #region Partitions /// - public SabreTools.Models.N3DS.NCCHHeader[] Partitions => _cart.Partitions; + public SabreTools.Models.N3DS.NCCHHeader[] Partitions => _model.Partitions; #endregion #region Extended Headers /// - public SabreTools.Models.N3DS.NCCHExtendedHeader[] ExtendedHeaders => _cart.ExtendedHeaders; + public SabreTools.Models.N3DS.NCCHExtendedHeader[] ExtendedHeaders => _model.ExtendedHeaders; #endregion #region ExeFS Headers /// - public SabreTools.Models.N3DS.ExeFSHeader[] ExeFSHeaders => _cart.ExeFSHeaders; + public SabreTools.Models.N3DS.ExeFSHeader[] ExeFSHeaders => _model.ExeFSHeaders; #endregion #region RomFS Headers /// - public SabreTools.Models.N3DS.RomFSHeader[] RomFSHeaders => _cart.RomFSHeaders; + public SabreTools.Models.N3DS.RomFSHeader[] RomFSHeaders => _model.RomFSHeaders; #endregion #endregion - #region Instance Variables - - /// - /// Internal representation of the cart - /// - private SabreTools.Models.N3DS.Cart _cart; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private N3DS() { } + /// +#if NET48 + public N3DS(SabreTools.Models.N3DS.Cart model, byte[] data, int offset) +#else + public N3DS(SabreTools.Models.N3DS.Cart? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public N3DS(SabreTools.Models.N3DS.Cart model, Stream data) +#else + public N3DS(SabreTools.Models.N3DS.Cart? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a 3DS cart image from a byte array and offset @@ -273,13 +281,14 @@ namespace BinaryObjectScanner.Wrappers if (archive == null) return null; - var wrapper = new N3DS + try { - _cart = archive, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new N3DS(archive, data); + } + catch + { + return null; + } } #endregion @@ -396,7 +405,7 @@ namespace BinaryObjectScanner.Wrappers { builder.AppendLine(" Development Card Info Header Information:"); builder.AppendLine(" -------------------------"); - if (_cart.DevelopmentCardInfoHeader == null) + if (_model.DevelopmentCardInfoHeader == null) { builder.AppendLine(" No development card info header"); } @@ -762,7 +771,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_cart, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/NCF.cs b/BinaryObjectScanner.Wrappers/NCF.cs index bfb3a042..5d10c56e 100644 --- a/BinaryObjectScanner.Wrappers/NCF.cs +++ b/BinaryObjectScanner.Wrappers/NCF.cs @@ -3,12 +3,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class NCF : WrapperBase + public class NCF : WrapperBase { #region Descriptive Properties /// - public override string Description => "Half-Life No Cache File (NCF)"; + public override string DescriptionString => "Half-Life No Cache File (NCF)"; #endregion @@ -17,202 +17,210 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public uint Dummy0 => _file.Header.Dummy0; + public uint Dummy0 => _model.Header.Dummy0; /// - public uint MajorVersion => _file.Header.MajorVersion; + public uint MajorVersion => _model.Header.MajorVersion; /// - public uint MinorVersion => _file.Header.MinorVersion; + public uint MinorVersion => _model.Header.MinorVersion; /// - public uint CacheID => _file.Header.CacheID; + public uint CacheID => _model.Header.CacheID; /// - public uint LastVersionPlayed => _file.Header.LastVersionPlayed; + public uint LastVersionPlayed => _model.Header.LastVersionPlayed; /// - public uint Dummy1 => _file.Header.Dummy1; + public uint Dummy1 => _model.Header.Dummy1; /// - public uint Dummy2 => _file.Header.Dummy2; + public uint Dummy2 => _model.Header.Dummy2; /// - public uint FileSize => _file.Header.FileSize; + public uint FileSize => _model.Header.FileSize; /// - public uint BlockSize => _file.Header.BlockSize; + public uint BlockSize => _model.Header.BlockSize; /// - public uint BlockCount => _file.Header.BlockCount; + public uint BlockCount => _model.Header.BlockCount; /// - public uint Dummy3 => _file.Header.Dummy3; + public uint Dummy3 => _model.Header.Dummy3; #endregion #region Directory Header /// - public uint DH_Dummy0 => _file.DirectoryHeader.Dummy0; + public uint DH_Dummy0 => _model.DirectoryHeader.Dummy0; /// - public uint DH_CacheID => _file.DirectoryHeader.CacheID; + public uint DH_CacheID => _model.DirectoryHeader.CacheID; /// - public uint DH_LastVersionPlayed => _file.DirectoryHeader.LastVersionPlayed; + public uint DH_LastVersionPlayed => _model.DirectoryHeader.LastVersionPlayed; /// - public uint DH_ItemCount => _file.DirectoryHeader.ItemCount; + public uint DH_ItemCount => _model.DirectoryHeader.ItemCount; /// - public uint DH_FileCount => _file.DirectoryHeader.FileCount; + public uint DH_FileCount => _model.DirectoryHeader.FileCount; /// - public uint DH_ChecksumDataLength => _file.DirectoryHeader.ChecksumDataLength; + public uint DH_ChecksumDataLength => _model.DirectoryHeader.ChecksumDataLength; /// - public uint DH_DirectorySize => _file.DirectoryHeader.DirectorySize; + public uint DH_DirectorySize => _model.DirectoryHeader.DirectorySize; /// - public uint DH_NameSize => _file.DirectoryHeader.NameSize; + public uint DH_NameSize => _model.DirectoryHeader.NameSize; /// - public uint DH_Info1Count => _file.DirectoryHeader.Info1Count; + public uint DH_Info1Count => _model.DirectoryHeader.Info1Count; /// - public uint DH_CopyCount => _file.DirectoryHeader.CopyCount; + public uint DH_CopyCount => _model.DirectoryHeader.CopyCount; /// - public uint DH_LocalCount => _file.DirectoryHeader.LocalCount; + public uint DH_LocalCount => _model.DirectoryHeader.LocalCount; /// - public uint DH_Dummy1 => _file.DirectoryHeader.Dummy1; + public uint DH_Dummy1 => _model.DirectoryHeader.Dummy1; /// - public uint DH_Dummy2 => _file.DirectoryHeader.Dummy2; + public uint DH_Dummy2 => _model.DirectoryHeader.Dummy2; /// - public uint DH_Checksum => _file.DirectoryHeader.Checksum; + public uint DH_Checksum => _model.DirectoryHeader.Checksum; #endregion #region Directory Entries /// - public SabreTools.Models.NCF.DirectoryEntry[] DirectoryEntries => _file.DirectoryEntries; + public SabreTools.Models.NCF.DirectoryEntry[] DirectoryEntries => _model.DirectoryEntries; #endregion #region Directory Names /// - public System.Collections.Generic.Dictionary DirectoryNames => _file.DirectoryNames; + public System.Collections.Generic.Dictionary DirectoryNames => _model.DirectoryNames; #endregion #region Directory Info 1 Entries /// - public SabreTools.Models.NCF.DirectoryInfo1Entry[] DirectoryInfo1Entries => _file.DirectoryInfo1Entries; + public SabreTools.Models.NCF.DirectoryInfo1Entry[] DirectoryInfo1Entries => _model.DirectoryInfo1Entries; #endregion #region Directory Info 2 Entries /// - public SabreTools.Models.NCF.DirectoryInfo2Entry[] DirectoryInfo2Entries => _file.DirectoryInfo2Entries; + public SabreTools.Models.NCF.DirectoryInfo2Entry[] DirectoryInfo2Entries => _model.DirectoryInfo2Entries; #endregion #region Directory Copy Entries /// - public SabreTools.Models.NCF.DirectoryCopyEntry[] DirectoryCopyEntries => _file.DirectoryCopyEntries; + public SabreTools.Models.NCF.DirectoryCopyEntry[] DirectoryCopyEntries => _model.DirectoryCopyEntries; #endregion #region Directory Local Entries /// - public SabreTools.Models.NCF.DirectoryLocalEntry[] DirectoryLocalEntries => _file.DirectoryLocalEntries; + public SabreTools.Models.NCF.DirectoryLocalEntry[] DirectoryLocalEntries => _model.DirectoryLocalEntries; #endregion #region Unknown Header /// - public uint UH_Dummy0 => _file.UnknownHeader.Dummy0; + public uint UH_Dummy0 => _model.UnknownHeader.Dummy0; /// - public uint UH_Dummy1 => _file.UnknownHeader.Dummy1; + public uint UH_Dummy1 => _model.UnknownHeader.Dummy1; #endregion #region Unknown Entries /// - public SabreTools.Models.NCF.UnknownEntry[] UnknownEntries => _file.UnknownEntries; + public SabreTools.Models.NCF.UnknownEntry[] UnknownEntries => _model.UnknownEntries; #endregion #region Checksum Header /// - public uint CH_Dummy0 => _file.ChecksumHeader.Dummy0; + public uint CH_Dummy0 => _model.ChecksumHeader.Dummy0; /// - public uint CH_ChecksumSize => _file.ChecksumHeader.ChecksumSize; + public uint CH_ChecksumSize => _model.ChecksumHeader.ChecksumSize; #endregion #region Checksum Map Header /// - public uint CMH_Dummy0 => _file.ChecksumMapHeader.Dummy0; + public uint CMH_Dummy0 => _model.ChecksumMapHeader.Dummy0; /// - public uint CMH_Dummy1 => _file.ChecksumMapHeader.Dummy1; + public uint CMH_Dummy1 => _model.ChecksumMapHeader.Dummy1; /// - public uint CMH_ItemCount => _file.ChecksumMapHeader.ItemCount; + public uint CMH_ItemCount => _model.ChecksumMapHeader.ItemCount; /// - public uint CMH_ChecksumCount => _file.ChecksumMapHeader.ChecksumCount; + public uint CMH_ChecksumCount => _model.ChecksumMapHeader.ChecksumCount; #endregion #region Checksum Map Entries /// - public SabreTools.Models.NCF.ChecksumMapEntry[] ChecksumMapEntries => _file.ChecksumMapEntries; + public SabreTools.Models.NCF.ChecksumMapEntry[] ChecksumMapEntries => _model.ChecksumMapEntries; #endregion #region Checksum Entries /// - public SabreTools.Models.NCF.ChecksumEntry[] ChecksumEntries => _file.ChecksumEntries; + public SabreTools.Models.NCF.ChecksumEntry[] ChecksumEntries => _model.ChecksumEntries; #endregion #endregion - #region Instance Variables - - /// - /// Internal representation of the NCF - /// - private SabreTools.Models.NCF.File _file; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private NCF() { } + /// +#if NET48 + public NCF(SabreTools.Models.NCF.File model, byte[] data, int offset) +#else + public NCF(SabreTools.Models.NCF.File? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public NCF(SabreTools.Models.NCF.File model, Stream data) +#else + public NCF(SabreTools.Models.NCF.File? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create an NCF from a byte array and offset @@ -250,13 +258,14 @@ namespace BinaryObjectScanner.Wrappers if (file == null) return null; - var wrapper = new NCF + try { - _file = file, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new NCF(file, data); + } + catch + { + return null; + } } #endregion @@ -586,7 +595,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_file, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/NewExecutable.cs b/BinaryObjectScanner.Wrappers/NewExecutable.cs index a33162f8..fa831868 100644 --- a/BinaryObjectScanner.Wrappers/NewExecutable.cs +++ b/BinaryObjectScanner.Wrappers/NewExecutable.cs @@ -6,12 +6,12 @@ using static SabreTools.Serialization.Extensions; namespace BinaryObjectScanner.Wrappers { - public class NewExecutable : WrapperBase + public class NewExecutable : WrapperBase { #region Descriptive Properties /// - public override string Description => "New Executable (NE)"; + public override string DescriptionString => "New Executable (NE)"; #endregion @@ -22,65 +22,65 @@ namespace BinaryObjectScanner.Wrappers #region Standard Fields /// - public string Stub_Magic => _executable.Stub.Header.Magic; + public string Stub_Magic => _model.Stub.Header.Magic; /// - public ushort Stub_LastPageBytes => _executable.Stub.Header.LastPageBytes; + public ushort Stub_LastPageBytes => _model.Stub.Header.LastPageBytes; /// - public ushort Stub_Pages => _executable.Stub.Header.Pages; + public ushort Stub_Pages => _model.Stub.Header.Pages; /// - public ushort Stub_RelocationItems => _executable.Stub.Header.RelocationItems; + public ushort Stub_RelocationItems => _model.Stub.Header.RelocationItems; /// - public ushort Stub_HeaderParagraphSize => _executable.Stub.Header.HeaderParagraphSize; + public ushort Stub_HeaderParagraphSize => _model.Stub.Header.HeaderParagraphSize; /// - public ushort Stub_MinimumExtraParagraphs => _executable.Stub.Header.MinimumExtraParagraphs; + public ushort Stub_MinimumExtraParagraphs => _model.Stub.Header.MinimumExtraParagraphs; /// - public ushort Stub_MaximumExtraParagraphs => _executable.Stub.Header.MaximumExtraParagraphs; + public ushort Stub_MaximumExtraParagraphs => _model.Stub.Header.MaximumExtraParagraphs; /// - public ushort Stub_InitialSSValue => _executable.Stub.Header.InitialSSValue; + public ushort Stub_InitialSSValue => _model.Stub.Header.InitialSSValue; /// - public ushort Stub_InitialSPValue => _executable.Stub.Header.InitialSPValue; + public ushort Stub_InitialSPValue => _model.Stub.Header.InitialSPValue; /// - public ushort Stub_Checksum => _executable.Stub.Header.Checksum; + public ushort Stub_Checksum => _model.Stub.Header.Checksum; /// - public ushort Stub_InitialIPValue => _executable.Stub.Header.InitialIPValue; + public ushort Stub_InitialIPValue => _model.Stub.Header.InitialIPValue; /// - public ushort Stub_InitialCSValue => _executable.Stub.Header.InitialCSValue; + public ushort Stub_InitialCSValue => _model.Stub.Header.InitialCSValue; /// - public ushort Stub_RelocationTableAddr => _executable.Stub.Header.RelocationTableAddr; + public ushort Stub_RelocationTableAddr => _model.Stub.Header.RelocationTableAddr; /// - public ushort Stub_OverlayNumber => _executable.Stub.Header.OverlayNumber; + public ushort Stub_OverlayNumber => _model.Stub.Header.OverlayNumber; #endregion #region PE Extensions /// - public ushort[] Stub_Reserved1 => _executable.Stub.Header.Reserved1; + public ushort[] Stub_Reserved1 => _model.Stub.Header.Reserved1; /// - public ushort Stub_OEMIdentifier => _executable.Stub.Header.OEMIdentifier; + public ushort Stub_OEMIdentifier => _model.Stub.Header.OEMIdentifier; /// - public ushort Stub_OEMInformation => _executable.Stub.Header.OEMInformation; + public ushort Stub_OEMInformation => _model.Stub.Header.OEMInformation; /// - public ushort[] Stub_Reserved2 => _executable.Stub.Header.Reserved2; + public ushort[] Stub_Reserved2 => _model.Stub.Header.Reserved2; /// - public uint Stub_NewExeHeaderAddr => _executable.Stub.Header.NewExeHeaderAddr; + public uint Stub_NewExeHeaderAddr => _model.Stub.Header.NewExeHeaderAddr; #endregion @@ -89,122 +89,122 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public string Magic => _executable.Header.Magic; + public string Magic => _model.Header.Magic; /// - public byte LinkerVersion => _executable.Header.LinkerVersion; + public byte LinkerVersion => _model.Header.LinkerVersion; /// - public byte LinkerRevision => _executable.Header.LinkerRevision; + public byte LinkerRevision => _model.Header.LinkerRevision; /// - public ushort EntryTableOffset => _executable.Header.EntryTableOffset; + public ushort EntryTableOffset => _model.Header.EntryTableOffset; /// - public ushort EntryTableSize => _executable.Header.EntryTableSize; + public ushort EntryTableSize => _model.Header.EntryTableSize; /// - public uint CrcChecksum => _executable.Header.CrcChecksum; + public uint CrcChecksum => _model.Header.CrcChecksum; /// - public SabreTools.Models.NewExecutable.HeaderFlag FlagWord => _executable.Header.FlagWord; + public SabreTools.Models.NewExecutable.HeaderFlag FlagWord => _model.Header.FlagWord; /// - public ushort AutomaticDataSegmentNumber => _executable.Header.AutomaticDataSegmentNumber; + public ushort AutomaticDataSegmentNumber => _model.Header.AutomaticDataSegmentNumber; /// - public ushort InitialHeapAlloc => _executable.Header.InitialHeapAlloc; + public ushort InitialHeapAlloc => _model.Header.InitialHeapAlloc; /// - public ushort InitialStackAlloc => _executable.Header.InitialStackAlloc; + public ushort InitialStackAlloc => _model.Header.InitialStackAlloc; /// - public uint InitialCSIPSetting => _executable.Header.InitialCSIPSetting; + public uint InitialCSIPSetting => _model.Header.InitialCSIPSetting; /// - public uint InitialSSSPSetting => _executable.Header.InitialSSSPSetting; + public uint InitialSSSPSetting => _model.Header.InitialSSSPSetting; /// - public ushort FileSegmentCount => _executable.Header.FileSegmentCount; + public ushort FileSegmentCount => _model.Header.FileSegmentCount; /// - public ushort ModuleReferenceTableSize => _executable.Header.ModuleReferenceTableSize; + public ushort ModuleReferenceTableSize => _model.Header.ModuleReferenceTableSize; /// - public ushort NonResidentNameTableSize => _executable.Header.NonResidentNameTableSize; + public ushort NonResidentNameTableSize => _model.Header.NonResidentNameTableSize; /// - public ushort SegmentTableOffset => _executable.Header.SegmentTableOffset; + public ushort SegmentTableOffset => _model.Header.SegmentTableOffset; /// - public ushort ResourceTableOffset => _executable.Header.ResourceTableOffset; + public ushort ResourceTableOffset => _model.Header.ResourceTableOffset; /// - public ushort ResidentNameTableOffset => _executable.Header.ResidentNameTableOffset; + public ushort ResidentNameTableOffset => _model.Header.ResidentNameTableOffset; /// - public ushort ModuleReferenceTableOffset => _executable.Header.ModuleReferenceTableOffset; + public ushort ModuleReferenceTableOffset => _model.Header.ModuleReferenceTableOffset; /// - public ushort ImportedNamesTableOffset => _executable.Header.ImportedNamesTableOffset; + public ushort ImportedNamesTableOffset => _model.Header.ImportedNamesTableOffset; /// - public uint NonResidentNamesTableOffset => _executable.Header.NonResidentNamesTableOffset; + public uint NonResidentNamesTableOffset => _model.Header.NonResidentNamesTableOffset; /// - public ushort MovableEntriesCount => _executable.Header.MovableEntriesCount; + public ushort MovableEntriesCount => _model.Header.MovableEntriesCount; /// - public ushort SegmentAlignmentShiftCount => _executable.Header.SegmentAlignmentShiftCount; + public ushort SegmentAlignmentShiftCount => _model.Header.SegmentAlignmentShiftCount; /// - public ushort ResourceEntriesCount => _executable.Header.ResourceEntriesCount; + public ushort ResourceEntriesCount => _model.Header.ResourceEntriesCount; /// - public SabreTools.Models.NewExecutable.OperatingSystem TargetOperatingSystem => _executable.Header.TargetOperatingSystem; + public SabreTools.Models.NewExecutable.OperatingSystem TargetOperatingSystem => _model.Header.TargetOperatingSystem; /// - public SabreTools.Models.NewExecutable.OS2Flag AdditionalFlags => _executable.Header.AdditionalFlags; + public SabreTools.Models.NewExecutable.OS2Flag AdditionalFlags => _model.Header.AdditionalFlags; /// - public ushort ReturnThunkOffset => _executable.Header.ReturnThunkOffset; + public ushort ReturnThunkOffset => _model.Header.ReturnThunkOffset; /// - public ushort SegmentReferenceThunkOffset => _executable.Header.SegmentReferenceThunkOffset; + public ushort SegmentReferenceThunkOffset => _model.Header.SegmentReferenceThunkOffset; /// - public ushort MinCodeSwapAreaSize => _executable.Header.MinCodeSwapAreaSize; + public ushort MinCodeSwapAreaSize => _model.Header.MinCodeSwapAreaSize; /// - public byte WindowsSDKRevision => _executable.Header.WindowsSDKRevision; + public byte WindowsSDKRevision => _model.Header.WindowsSDKRevision; /// - public byte WindowsSDKVersion => _executable.Header.WindowsSDKVersion; + public byte WindowsSDKVersion => _model.Header.WindowsSDKVersion; #endregion #region Tables /// - public SabreTools.Models.NewExecutable.SegmentTableEntry[] SegmentTable => _executable.SegmentTable; + public SabreTools.Models.NewExecutable.SegmentTableEntry[] SegmentTable => _model.SegmentTable; /// - public SabreTools.Models.NewExecutable.ResourceTable ResourceTable => _executable.ResourceTable; + public SabreTools.Models.NewExecutable.ResourceTable ResourceTable => _model.ResourceTable; /// - public SabreTools.Models.NewExecutable.ResidentNameTableEntry[] ResidentNameTable => _executable.ResidentNameTable; + public SabreTools.Models.NewExecutable.ResidentNameTableEntry[] ResidentNameTable => _model.ResidentNameTable; /// - public SabreTools.Models.NewExecutable.ModuleReferenceTableEntry[] ModuleReferenceTable => _executable.ModuleReferenceTable; + public SabreTools.Models.NewExecutable.ModuleReferenceTableEntry[] ModuleReferenceTable => _model.ModuleReferenceTable; /// - public Dictionary ImportedNameTable => _executable.ImportedNameTable; + public Dictionary ImportedNameTable => _model.ImportedNameTable; /// - public SabreTools.Models.NewExecutable.EntryTableBundle[] EntryTable => _executable.EntryTable; + public SabreTools.Models.NewExecutable.EntryTableBundle[] EntryTable => _model.EntryTable; /// - public SabreTools.Models.NewExecutable.NonResidentNameTableEntry[] NonResidentNameTable => _executable.NonResidentNameTable; + public SabreTools.Models.NewExecutable.NonResidentNameTableEntry[] NonResidentNameTable => _model.NonResidentNameTable; #endregion @@ -216,21 +216,29 @@ namespace BinaryObjectScanner.Wrappers #endregion - #region Instance Variables - - /// - /// Internal representation of the executable - /// - private SabreTools.Models.NewExecutable.Executable _executable; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private NewExecutable() { } + /// +#if NET48 + public NewExecutable(SabreTools.Models.NewExecutable.Executable model, byte[] data, int offset) +#else + public NewExecutable(SabreTools.Models.NewExecutable.Executable? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public NewExecutable(SabreTools.Models.NewExecutable.Executable model, Stream data) +#else + public NewExecutable(SabreTools.Models.NewExecutable.Executable? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create an NE executable from a byte array and offset @@ -268,13 +276,14 @@ namespace BinaryObjectScanner.Wrappers if (executable == null) return null; - var wrapper = new NewExecutable + try { - _executable = executable, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new NewExecutable(executable, data); + } + catch + { + return null; + } } #endregion @@ -622,7 +631,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_executable, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/Nitro.cs b/BinaryObjectScanner.Wrappers/Nitro.cs index 154db9fe..44c54b8d 100644 --- a/BinaryObjectScanner.Wrappers/Nitro.cs +++ b/BinaryObjectScanner.Wrappers/Nitro.cs @@ -4,12 +4,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class Nitro : WrapperBase + public class Nitro : WrapperBase { #region Descriptive Properties /// - public override string Description => "Nintendo DS/DSi Cart Image"; + public override string DescriptionString => "Nintendo DS/DSi Cart Image"; #endregion @@ -18,319 +18,327 @@ namespace BinaryObjectScanner.Wrappers #region Common Header /// - public string GameTitle => _cart.CommonHeader.GameTitle; + public string GameTitle => _model.CommonHeader.GameTitle; /// - public uint GameCode => _cart.CommonHeader.GameCode; + public uint GameCode => _model.CommonHeader.GameCode; /// - public string MakerCode => _cart.CommonHeader.MakerCode; + public string MakerCode => _model.CommonHeader.MakerCode; /// - public SabreTools.Models.Nitro.Unitcode UnitCode => _cart.CommonHeader.UnitCode; + public SabreTools.Models.Nitro.Unitcode UnitCode => _model.CommonHeader.UnitCode; /// - public byte EncryptionSeedSelect => _cart.CommonHeader.EncryptionSeedSelect; + public byte EncryptionSeedSelect => _model.CommonHeader.EncryptionSeedSelect; /// - public byte DeviceCapacity => _cart.CommonHeader.DeviceCapacity; + public byte DeviceCapacity => _model.CommonHeader.DeviceCapacity; /// - public byte[] Reserved1 => _cart.CommonHeader.Reserved1; + public byte[] Reserved1 => _model.CommonHeader.Reserved1; /// - public ushort GameRevision => _cart.CommonHeader.GameRevision; + public ushort GameRevision => _model.CommonHeader.GameRevision; /// - public byte RomVersion => _cart.CommonHeader.RomVersion; + public byte RomVersion => _model.CommonHeader.RomVersion; /// - public byte InternalFlags => _cart.CommonHeader.InternalFlags; + public byte InternalFlags => _model.CommonHeader.InternalFlags; /// - public uint ARM9RomOffset => _cart.CommonHeader.ARM9RomOffset; + public uint ARM9RomOffset => _model.CommonHeader.ARM9RomOffset; /// - public uint ARM9EntryAddress => _cart.CommonHeader.ARM9EntryAddress; + public uint ARM9EntryAddress => _model.CommonHeader.ARM9EntryAddress; /// - public uint ARM9LoadAddress => _cart.CommonHeader.ARM9LoadAddress; + public uint ARM9LoadAddress => _model.CommonHeader.ARM9LoadAddress; /// - public uint ARM9Size => _cart.CommonHeader.ARM9Size; + public uint ARM9Size => _model.CommonHeader.ARM9Size; /// - public uint ARM7RomOffset => _cart.CommonHeader.ARM7RomOffset; + public uint ARM7RomOffset => _model.CommonHeader.ARM7RomOffset; /// - public uint ARM7EntryAddress => _cart.CommonHeader.ARM7EntryAddress; + public uint ARM7EntryAddress => _model.CommonHeader.ARM7EntryAddress; /// - public uint ARM7LoadAddress => _cart.CommonHeader.ARM7LoadAddress; + public uint ARM7LoadAddress => _model.CommonHeader.ARM7LoadAddress; /// - public uint ARM7Size => _cart.CommonHeader.ARM7Size; + public uint ARM7Size => _model.CommonHeader.ARM7Size; /// - public uint FileNameTableOffset => _cart.CommonHeader.FileNameTableOffset; + public uint FileNameTableOffset => _model.CommonHeader.FileNameTableOffset; /// - public uint FileNameTableLength => _cart.CommonHeader.FileNameTableLength; + public uint FileNameTableLength => _model.CommonHeader.FileNameTableLength; /// - public uint FileAllocationTableOffset => _cart.CommonHeader.FileAllocationTableOffset; + public uint FileAllocationTableOffset => _model.CommonHeader.FileAllocationTableOffset; /// - public uint FileAllocationTableLength => _cart.CommonHeader.FileAllocationTableLength; + public uint FileAllocationTableLength => _model.CommonHeader.FileAllocationTableLength; /// - public uint ARM9OverlayOffset => _cart.CommonHeader.ARM9OverlayOffset; + public uint ARM9OverlayOffset => _model.CommonHeader.ARM9OverlayOffset; /// - public uint ARM9OverlayLength => _cart.CommonHeader.ARM9OverlayLength; + public uint ARM9OverlayLength => _model.CommonHeader.ARM9OverlayLength; /// - public uint ARM7OverlayOffset => _cart.CommonHeader.ARM7OverlayOffset; + public uint ARM7OverlayOffset => _model.CommonHeader.ARM7OverlayOffset; /// - public uint ARM7OverlayLength => _cart.CommonHeader.ARM7OverlayLength; + public uint ARM7OverlayLength => _model.CommonHeader.ARM7OverlayLength; /// - public uint NormalCardControlRegisterSettings => _cart.CommonHeader.NormalCardControlRegisterSettings; + public uint NormalCardControlRegisterSettings => _model.CommonHeader.NormalCardControlRegisterSettings; /// - public uint SecureCardControlRegisterSettings => _cart.CommonHeader.SecureCardControlRegisterSettings; + public uint SecureCardControlRegisterSettings => _model.CommonHeader.SecureCardControlRegisterSettings; /// - public uint IconBannerOffset => _cart.CommonHeader.IconBannerOffset; + public uint IconBannerOffset => _model.CommonHeader.IconBannerOffset; /// - public ushort SecureAreaCRC => _cart.CommonHeader.SecureAreaCRC; + public ushort SecureAreaCRC => _model.CommonHeader.SecureAreaCRC; /// - public ushort SecureTransferTimeout => _cart.CommonHeader.SecureTransferTimeout; + public ushort SecureTransferTimeout => _model.CommonHeader.SecureTransferTimeout; /// - public uint ARM9Autoload => _cart.CommonHeader.ARM9Autoload; + public uint ARM9Autoload => _model.CommonHeader.ARM9Autoload; /// - public uint ARM7Autoload => _cart.CommonHeader.ARM7Autoload; + public uint ARM7Autoload => _model.CommonHeader.ARM7Autoload; /// - public byte[] SecureDisable => _cart.CommonHeader.SecureDisable; + public byte[] SecureDisable => _model.CommonHeader.SecureDisable; /// - public uint NTRRegionRomSize => _cart.CommonHeader.NTRRegionRomSize; + public uint NTRRegionRomSize => _model.CommonHeader.NTRRegionRomSize; /// - public uint HeaderSize => _cart.CommonHeader.HeaderSize; + public uint HeaderSize => _model.CommonHeader.HeaderSize; /// - public byte[] Reserved2 => _cart.CommonHeader.Reserved2; + public byte[] Reserved2 => _model.CommonHeader.Reserved2; /// - public byte[] NintendoLogo => _cart.CommonHeader.NintendoLogo; + public byte[] NintendoLogo => _model.CommonHeader.NintendoLogo; /// - public ushort NintendoLogoCRC => _cart.CommonHeader.NintendoLogoCRC; + public ushort NintendoLogoCRC => _model.CommonHeader.NintendoLogoCRC; /// - public ushort HeaderCRC => _cart.CommonHeader.HeaderCRC; + public ushort HeaderCRC => _model.CommonHeader.HeaderCRC; /// - public byte[] DebuggerReserved => _cart.CommonHeader.DebuggerReserved; + public byte[] DebuggerReserved => _model.CommonHeader.DebuggerReserved; #endregion #region Extended DSi Header /// - public uint[] GlobalMBK15Settings => _cart.ExtendedDSiHeader?.GlobalMBK15Settings; + public uint[] GlobalMBK15Settings => _model.ExtendedDSiHeader?.GlobalMBK15Settings; /// - public uint[] LocalMBK68SettingsARM9 => _cart.ExtendedDSiHeader?.LocalMBK68SettingsARM9; + public uint[] LocalMBK68SettingsARM9 => _model.ExtendedDSiHeader?.LocalMBK68SettingsARM9; /// - public uint[] LocalMBK68SettingsARM7 => _cart.ExtendedDSiHeader?.LocalMBK68SettingsARM7; + public uint[] LocalMBK68SettingsARM7 => _model.ExtendedDSiHeader?.LocalMBK68SettingsARM7; /// - public uint? GlobalMBK9Setting => _cart.ExtendedDSiHeader?.GlobalMBK9Setting; + public uint? GlobalMBK9Setting => _model.ExtendedDSiHeader?.GlobalMBK9Setting; /// - public uint? RegionFlags => _cart.ExtendedDSiHeader?.RegionFlags; + public uint? RegionFlags => _model.ExtendedDSiHeader?.RegionFlags; /// - public uint? AccessControl => _cart.ExtendedDSiHeader?.AccessControl; + public uint? AccessControl => _model.ExtendedDSiHeader?.AccessControl; /// - public uint? ARM7SCFGEXTMask => _cart.ExtendedDSiHeader?.ARM7SCFGEXTMask; + public uint? ARM7SCFGEXTMask => _model.ExtendedDSiHeader?.ARM7SCFGEXTMask; /// - public uint? ReservedFlags => _cart.ExtendedDSiHeader?.ReservedFlags; + public uint? ReservedFlags => _model.ExtendedDSiHeader?.ReservedFlags; /// - public uint? ARM9iRomOffset => _cart.ExtendedDSiHeader?.ARM9iRomOffset; + public uint? ARM9iRomOffset => _model.ExtendedDSiHeader?.ARM9iRomOffset; /// - public uint? Reserved3 => _cart.ExtendedDSiHeader?.Reserved3; + public uint? Reserved3 => _model.ExtendedDSiHeader?.Reserved3; /// - public uint? ARM9iLoadAddress => _cart.ExtendedDSiHeader?.ARM9iLoadAddress; + public uint? ARM9iLoadAddress => _model.ExtendedDSiHeader?.ARM9iLoadAddress; /// - public uint? ARM9iSize => _cart.ExtendedDSiHeader?.ARM9iSize; + public uint? ARM9iSize => _model.ExtendedDSiHeader?.ARM9iSize; /// - public uint? ARM7iRomOffset => _cart.ExtendedDSiHeader?.ARM7iRomOffset; + public uint? ARM7iRomOffset => _model.ExtendedDSiHeader?.ARM7iRomOffset; /// - public uint? Reserved4 => _cart.ExtendedDSiHeader?.Reserved4; + public uint? Reserved4 => _model.ExtendedDSiHeader?.Reserved4; /// - public uint? ARM7iLoadAddress => _cart.ExtendedDSiHeader?.ARM7iLoadAddress; + public uint? ARM7iLoadAddress => _model.ExtendedDSiHeader?.ARM7iLoadAddress; /// - public uint? ARM7iSize => _cart.ExtendedDSiHeader?.ARM7iSize; + public uint? ARM7iSize => _model.ExtendedDSiHeader?.ARM7iSize; /// - public uint? DigestNTRRegionOffset => _cart.ExtendedDSiHeader?.DigestNTRRegionOffset; + public uint? DigestNTRRegionOffset => _model.ExtendedDSiHeader?.DigestNTRRegionOffset; /// - public uint? DigestNTRRegionLength => _cart.ExtendedDSiHeader?.DigestNTRRegionLength; + public uint? DigestNTRRegionLength => _model.ExtendedDSiHeader?.DigestNTRRegionLength; /// - public uint? DigestTWLRegionOffset => _cart.ExtendedDSiHeader?.DigestTWLRegionOffset; + public uint? DigestTWLRegionOffset => _model.ExtendedDSiHeader?.DigestTWLRegionOffset; /// - public uint? DigestTWLRegionLength => _cart.ExtendedDSiHeader?.DigestTWLRegionLength; + public uint? DigestTWLRegionLength => _model.ExtendedDSiHeader?.DigestTWLRegionLength; /// - public uint? DigestSectorHashtableRegionOffset => _cart.ExtendedDSiHeader?.DigestSectorHashtableRegionOffset; + public uint? DigestSectorHashtableRegionOffset => _model.ExtendedDSiHeader?.DigestSectorHashtableRegionOffset; /// - public uint? DigestSectorHashtableRegionLength => _cart.ExtendedDSiHeader?.DigestSectorHashtableRegionLength; + public uint? DigestSectorHashtableRegionLength => _model.ExtendedDSiHeader?.DigestSectorHashtableRegionLength; /// - public uint? DigestBlockHashtableRegionOffset => _cart.ExtendedDSiHeader?.DigestBlockHashtableRegionOffset; + public uint? DigestBlockHashtableRegionOffset => _model.ExtendedDSiHeader?.DigestBlockHashtableRegionOffset; /// - public uint? DigestBlockHashtableRegionLength => _cart.ExtendedDSiHeader?.DigestBlockHashtableRegionLength; + public uint? DigestBlockHashtableRegionLength => _model.ExtendedDSiHeader?.DigestBlockHashtableRegionLength; /// - public uint? DigestSectorSize => _cart.ExtendedDSiHeader?.DigestSectorSize; + public uint? DigestSectorSize => _model.ExtendedDSiHeader?.DigestSectorSize; /// - public uint? DigestBlockSectorCount => _cart.ExtendedDSiHeader?.DigestBlockSectorCount; + public uint? DigestBlockSectorCount => _model.ExtendedDSiHeader?.DigestBlockSectorCount; /// - public uint? IconBannerSize => _cart.ExtendedDSiHeader?.IconBannerSize; + public uint? IconBannerSize => _model.ExtendedDSiHeader?.IconBannerSize; /// - public uint? Unknown1 => _cart.ExtendedDSiHeader?.Unknown1; + public uint? Unknown1 => _model.ExtendedDSiHeader?.Unknown1; /// - public uint? ModcryptArea1Offset => _cart.ExtendedDSiHeader?.ModcryptArea1Offset; + public uint? ModcryptArea1Offset => _model.ExtendedDSiHeader?.ModcryptArea1Offset; /// - public uint? ModcryptArea1Size => _cart.ExtendedDSiHeader?.ModcryptArea1Size; + public uint? ModcryptArea1Size => _model.ExtendedDSiHeader?.ModcryptArea1Size; /// - public uint? ModcryptArea2Offset => _cart.ExtendedDSiHeader?.ModcryptArea2Offset; + public uint? ModcryptArea2Offset => _model.ExtendedDSiHeader?.ModcryptArea2Offset; /// - public uint? ModcryptArea2Size => _cart.ExtendedDSiHeader?.ModcryptArea2Size; + public uint? ModcryptArea2Size => _model.ExtendedDSiHeader?.ModcryptArea2Size; /// - public byte[] TitleID => _cart.ExtendedDSiHeader?.TitleID; + public byte[] TitleID => _model.ExtendedDSiHeader?.TitleID; /// - public uint? DSiWarePublicSavSize => _cart.ExtendedDSiHeader?.DSiWarePublicSavSize; + public uint? DSiWarePublicSavSize => _model.ExtendedDSiHeader?.DSiWarePublicSavSize; /// - public uint? DSiWarePrivateSavSize => _cart.ExtendedDSiHeader?.DSiWarePrivateSavSize; + public uint? DSiWarePrivateSavSize => _model.ExtendedDSiHeader?.DSiWarePrivateSavSize; /// - public byte[] ReservedZero => _cart.ExtendedDSiHeader?.ReservedZero; + public byte[] ReservedZero => _model.ExtendedDSiHeader?.ReservedZero; /// - public byte[] Unknown2 => _cart.ExtendedDSiHeader?.Unknown2; + public byte[] Unknown2 => _model.ExtendedDSiHeader?.Unknown2; /// - public byte[] ARM9WithSecureAreaSHA1HMACHash => _cart.ExtendedDSiHeader?.ARM9WithSecureAreaSHA1HMACHash; + public byte[] ARM9WithSecureAreaSHA1HMACHash => _model.ExtendedDSiHeader?.ARM9WithSecureAreaSHA1HMACHash; /// - public byte[] ARM7SHA1HMACHash => _cart.ExtendedDSiHeader?.ARM7SHA1HMACHash; + public byte[] ARM7SHA1HMACHash => _model.ExtendedDSiHeader?.ARM7SHA1HMACHash; /// - public byte[] DigestMasterSHA1HMACHash => _cart.ExtendedDSiHeader?.DigestMasterSHA1HMACHash; + public byte[] DigestMasterSHA1HMACHash => _model.ExtendedDSiHeader?.DigestMasterSHA1HMACHash; /// - public byte[] BannerSHA1HMACHash => _cart.ExtendedDSiHeader?.BannerSHA1HMACHash; + public byte[] BannerSHA1HMACHash => _model.ExtendedDSiHeader?.BannerSHA1HMACHash; /// - public byte[] ARM9iDecryptedSHA1HMACHash => _cart.ExtendedDSiHeader?.ARM9iDecryptedSHA1HMACHash; + public byte[] ARM9iDecryptedSHA1HMACHash => _model.ExtendedDSiHeader?.ARM9iDecryptedSHA1HMACHash; /// - public byte[] ARM7iDecryptedSHA1HMACHash => _cart.ExtendedDSiHeader?.ARM7iDecryptedSHA1HMACHash; + public byte[] ARM7iDecryptedSHA1HMACHash => _model.ExtendedDSiHeader?.ARM7iDecryptedSHA1HMACHash; /// - public byte[] Reserved5 => _cart.ExtendedDSiHeader?.Reserved5; + public byte[] Reserved5 => _model.ExtendedDSiHeader?.Reserved5; /// - public byte[] ARM9NoSecureAreaSHA1HMACHash => _cart.ExtendedDSiHeader?.ARM9NoSecureAreaSHA1HMACHash; + public byte[] ARM9NoSecureAreaSHA1HMACHash => _model.ExtendedDSiHeader?.ARM9NoSecureAreaSHA1HMACHash; /// - public byte[] Reserved6 => _cart.ExtendedDSiHeader?.Reserved6; + public byte[] Reserved6 => _model.ExtendedDSiHeader?.Reserved6; /// - public byte[] ReservedAndUnchecked => _cart.ExtendedDSiHeader?.ReservedAndUnchecked; + public byte[] ReservedAndUnchecked => _model.ExtendedDSiHeader?.ReservedAndUnchecked; /// - public byte[] RSASignature => _cart.ExtendedDSiHeader?.RSASignature; + public byte[] RSASignature => _model.ExtendedDSiHeader?.RSASignature; #endregion #region Secure Area /// - public byte[] SecureArea => _cart.SecureArea; + public byte[] SecureArea => _model.SecureArea; #endregion #region Name Table /// - public SabreTools.Models.Nitro.FolderAllocationTableEntry[] FolderAllocationTable => _cart.NameTable.FolderAllocationTable; + public SabreTools.Models.Nitro.FolderAllocationTableEntry[] FolderAllocationTable => _model.NameTable.FolderAllocationTable; /// - public SabreTools.Models.Nitro.NameListEntry[] NameList => _cart.NameTable.NameList; + public SabreTools.Models.Nitro.NameListEntry[] NameList => _model.NameTable.NameList; #endregion #region File Allocation Table /// - public SabreTools.Models.Nitro.FileAllocationTableEntry[] FileAllocationTable => _cart.FileAllocationTable; + public SabreTools.Models.Nitro.FileAllocationTableEntry[] FileAllocationTable => _model.FileAllocationTable; #endregion #endregion - #region Instance Variables - - /// - /// Internal representation of the cart - /// - private SabreTools.Models.Nitro.Cart _cart; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private Nitro() { } + /// +#if NET48 + public Nitro(SabreTools.Models.Nitro.Cart model, byte[] data, int offset) +#else + public Nitro(SabreTools.Models.Nitro.Cart? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public Nitro(SabreTools.Models.Nitro.Cart model, Stream data) +#else + public Nitro(SabreTools.Models.Nitro.Cart? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a NDS cart image from a byte array and offset @@ -368,13 +376,14 @@ namespace BinaryObjectScanner.Wrappers if (archive == null) return null; - var wrapper = new Nitro + try { - _cart = archive, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new Nitro(archive, data); + } + catch + { + return null; + } } #endregion @@ -458,7 +467,7 @@ namespace BinaryObjectScanner.Wrappers { builder.AppendLine(" Extended DSi Header Information:"); builder.AppendLine(" -------------------------"); - if (_cart.ExtendedDSiHeader == null) + if (_model.ExtendedDSiHeader == null) { builder.AppendLine(" No extended DSi header"); } @@ -632,7 +641,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_cart, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/PAK.cs b/BinaryObjectScanner.Wrappers/PAK.cs index b499ea4e..46f9fea4 100644 --- a/BinaryObjectScanner.Wrappers/PAK.cs +++ b/BinaryObjectScanner.Wrappers/PAK.cs @@ -3,12 +3,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class PAK : WrapperBase + public class PAK : WrapperBase { #region Descriptive Properties /// - public override string Description => "Half-Life Package File (PAK)"; + public override string DescriptionString => "Half-Life Package File (PAK)"; #endregion @@ -17,20 +17,20 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public string Signature => _file.Header.Signature; + public string Signature => _model.Header.Signature; /// - public uint DirectoryOffset => _file.Header.DirectoryOffset; + public uint DirectoryOffset => _model.Header.DirectoryOffset; /// - public uint DirectoryLength => _file.Header.DirectoryLength; + public uint DirectoryLength => _model.Header.DirectoryLength; #endregion #region Directory Items /// - public SabreTools.Models.PAK.DirectoryItem[] DirectoryItems => _file.DirectoryItems; + public SabreTools.Models.PAK.DirectoryItem[] DirectoryItems => _model.DirectoryItems; #endregion @@ -42,21 +42,29 @@ namespace BinaryObjectScanner.Wrappers #endregion - #region Instance Variables - - /// - /// Internal representation of the PAK - /// - private SabreTools.Models.PAK.File _file; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private PAK() { } + /// +#if NET48 + public PAK(SabreTools.Models.PAK.File model, byte[] data, int offset) +#else + public PAK(SabreTools.Models.PAK.File? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public PAK(SabreTools.Models.PAK.File model, Stream data) +#else + public PAK(SabreTools.Models.PAK.File? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a PAK from a byte array and offset @@ -94,13 +102,14 @@ namespace BinaryObjectScanner.Wrappers if (file == null) return null; - var wrapper = new PAK + try { - _file = file, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new PAK(file, data); + } + catch + { + return null; + } } #endregion @@ -165,7 +174,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_file, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/PFF.cs b/BinaryObjectScanner.Wrappers/PFF.cs index eb86b9de..02f5d9e5 100644 --- a/BinaryObjectScanner.Wrappers/PFF.cs +++ b/BinaryObjectScanner.Wrappers/PFF.cs @@ -3,12 +3,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class PFF : WrapperBase + public class PFF : WrapperBase { #region Descriptive Properties /// - public override string Description => "NovaLogic Game Archive Format (PFF)"; + public override string DescriptionString => "NovaLogic Game Archive Format (PFF)"; #endregion @@ -17,61 +17,67 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public uint HeaderSize => _archive.Header.HeaderSize; + public uint HeaderSize => _model.Header.HeaderSize; /// - public string Signature => _archive.Header.Signature; + public string Signature => _model.Header.Signature; /// - public uint NumberOfFiles => _archive.Header.NumberOfFiles; + public uint NumberOfFiles => _model.Header.NumberOfFiles; /// - public uint FileSegmentSize => _archive.Header.FileSegmentSize; + public uint FileSegmentSize => _model.Header.FileSegmentSize; /// - public uint FileListOffset => _archive.Header.FileListOffset; + public uint FileListOffset => _model.Header.FileListOffset; #endregion #region Segments /// - public SabreTools.Models.PFF.Segment[] Segments => _archive.Segments; + public SabreTools.Models.PFF.Segment[] Segments => _model.Segments; #endregion #region Footer /// - public uint SystemIP => _archive.Footer.SystemIP; + public uint SystemIP => _model.Footer.SystemIP; /// - public uint Reserved => _archive.Footer.Reserved; + public uint Reserved => _model.Footer.Reserved; /// - public string KingTag => _archive.Footer.KingTag; + public string KingTag => _model.Footer.KingTag; #endregion #endregion - #region Instance Variables - - /// - /// Internal representation of the archive - /// - private SabreTools.Models.PFF.Archive _archive; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private PFF() { } + /// +#if NET48 + public PFF(SabreTools.Models.PFF.Archive model, byte[] data, int offset) +#else + public PFF(SabreTools.Models.PFF.Archive? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } - /// + /// +#if NET48 + public PFF(SabreTools.Models.PFF.Archive model, Stream data) +#else + public PFF(SabreTools.Models.PFF.Archive? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + }/// /// Create a PFF archive from a byte array and offset /// /// Byte array representing the archive @@ -107,13 +113,14 @@ namespace BinaryObjectScanner.Wrappers if (archive == null) return null; - var wrapper = new PFF + try { - _archive = archive, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new PFF(archive, data); + } + catch + { + return null; + } } #endregion @@ -271,7 +278,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_archive, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/PlayJAudioFile.cs b/BinaryObjectScanner.Wrappers/PlayJAudioFile.cs index 6ef9e165..7249b763 100644 --- a/BinaryObjectScanner.Wrappers/PlayJAudioFile.cs +++ b/BinaryObjectScanner.Wrappers/PlayJAudioFile.cs @@ -4,12 +4,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class PlayJAudioFile : WrapperBase + public class PlayJAudioFile : WrapperBase { #region Descriptive Properties /// - public override string Description => "PlayJ Audio File (PLJ)"; + public override string DescriptionString => "PlayJ Audio File (PLJ)"; #endregion @@ -18,169 +18,169 @@ namespace BinaryObjectScanner.Wrappers #region Audio Header /// - public uint Signature => _audioFile.Header.Signature; + public uint Signature => _model.Header.Signature; /// - public uint Version => _audioFile.Header.Version; + public uint Version => _model.Header.Version; #region V1 Only /// - public uint? V1_TrackID => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.TrackID; + public uint? V1_TrackID => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.TrackID; /// - public uint? V1_UnknownOffset1 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.UnknownOffset1; + public uint? V1_UnknownOffset1 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.UnknownOffset1; /// - public uint? V1_UnknownOffset2 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.UnknownOffset2; + public uint? V1_UnknownOffset2 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.UnknownOffset2; /// - public uint? V1_UnknownOffset3 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.UnknownOffset3; + public uint? V1_UnknownOffset3 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.UnknownOffset3; /// - public uint? V1_Unknown1 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.Unknown1; + public uint? V1_Unknown1 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.Unknown1; /// - public uint? V1_Unknown2 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.Unknown2; + public uint? V1_Unknown2 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.Unknown2; /// - public uint? V1_Year => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.Year; + public uint? V1_Year => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.Year; /// - public uint? V1_TrackNumber => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.TrackNumber; + public uint? V1_TrackNumber => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.TrackNumber; /// - public SabreTools.Models.PlayJ.Subgenre? V1_Subgenre => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.Subgenre; + public SabreTools.Models.PlayJ.Subgenre? V1_Subgenre => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.Subgenre; /// - public uint? V1_Duration => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.Duration; + public uint? V1_Duration => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV1)?.Duration; #endregion #region V2 Only /// - public uint? V2_Unknown1 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown1; + public uint? V2_Unknown1 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown1; /// - public uint? V2_Unknown2 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown2; + public uint? V2_Unknown2 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown2; /// - public uint? V2_Unknown3 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown3; + public uint? V2_Unknown3 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown3; /// - public uint? V2_Unknown4 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown4; + public uint? V2_Unknown4 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown4; /// - public uint? V2_Unknown5 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown5; + public uint? V2_Unknown5 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown5; /// - public uint? V2_Unknown6 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown6; + public uint? V2_Unknown6 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown6; /// - public uint? V2_UnknownOffset1 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.UnknownOffset1; + public uint? V2_UnknownOffset1 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.UnknownOffset1; /// - public uint? V2_Unknown7 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown7; + public uint? V2_Unknown7 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown7; /// - public uint? V2_Unknown8 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown8; + public uint? V2_Unknown8 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown8; /// - public uint? V2_Unknown9 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown9; + public uint? V2_Unknown9 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown9; /// - public uint? V2_UnknownOffset2 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.UnknownOffset2; + public uint? V2_UnknownOffset2 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.UnknownOffset2; /// - public uint? V2_Unknown10 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown10; + public uint? V2_Unknown10 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown10; /// - public uint? V2_Unknown11 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown11; + public uint? V2_Unknown11 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown11; /// - public uint? V2_Unknown12 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown12; + public uint? V2_Unknown12 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown12; /// - public uint? V2_Unknown13 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown13; + public uint? V2_Unknown13 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown13; /// - public uint? V2_Unknown14 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown14; + public uint? V2_Unknown14 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown14; /// - public uint? V2_Unknown15 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown15; + public uint? V2_Unknown15 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown15; /// - public uint? V2_Unknown16 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown16; + public uint? V2_Unknown16 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown16; /// - public uint? V2_Unknown17 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown17; + public uint? V2_Unknown17 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown17; /// - public uint? V2_TrackID => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.TrackID; + public uint? V2_TrackID => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.TrackID; /// - public uint? V2_Year => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Year; + public uint? V2_Year => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Year; /// - public uint? V2_TrackNumber => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.TrackNumber; + public uint? V2_TrackNumber => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.TrackNumber; /// - public uint? V2_Unknown18 => (_audioFile.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown18; + public uint? V2_Unknown18 => (_model.Header as SabreTools.Models.PlayJ.AudioHeaderV2)?.Unknown18; #endregion /// - public ushort TrackLength => _audioFile.Header.TrackLength; + public ushort TrackLength => _model.Header.TrackLength; /// - public string Track => _audioFile.Header.Track; + public string Track => _model.Header.Track; /// - public ushort ArtistLength => _audioFile.Header.ArtistLength; + public ushort ArtistLength => _model.Header.ArtistLength; /// - public string Artist => _audioFile.Header.Artist; + public string Artist => _model.Header.Artist; /// - public ushort AlbumLength => _audioFile.Header.AlbumLength; + public ushort AlbumLength => _model.Header.AlbumLength; /// - public string Album => _audioFile.Header.Album; + public string Album => _model.Header.Album; /// - public ushort WriterLength => _audioFile.Header.WriterLength; + public ushort WriterLength => _model.Header.WriterLength; /// - public string Writer => _audioFile.Header.Writer; + public string Writer => _model.Header.Writer; /// - public ushort PublisherLength => _audioFile.Header.PublisherLength; + public ushort PublisherLength => _model.Header.PublisherLength; /// - public string Publisher => _audioFile.Header.Publisher; + public string Publisher => _model.Header.Publisher; /// - public ushort LabelLength => _audioFile.Header.LabelLength; + public ushort LabelLength => _model.Header.LabelLength; /// - public string Label => _audioFile.Header.Label; + public string Label => _model.Header.Label; /// - public ushort CommentsLength => _audioFile.Header.CommentsLength; + public ushort CommentsLength => _model.Header.CommentsLength; /// - public string Comments => _audioFile.Header.Comments; + public string Comments => _model.Header.Comments; #endregion #region Unknown Block 1 /// - public uint UB1_Length => _audioFile.UnknownBlock1.Length; + public uint UB1_Length => _model.UnknownBlock1.Length; /// - public byte[] UB1_Data => _audioFile.UnknownBlock1.Data; + public byte[] UB1_Data => _model.UnknownBlock1.Data; #endregion @@ -189,14 +189,14 @@ namespace BinaryObjectScanner.Wrappers #region Unknown Value 2 /// - public uint UnknownValue2 => _audioFile.UnknownValue2; + public uint UnknownValue2 => _model.UnknownValue2; #endregion #region Unknown Block 3 /// - public byte[] UB3_Data => _audioFile.UnknownBlock3.Data; + public byte[] UB3_Data => _model.UnknownBlock3.Data; #endregion @@ -207,14 +207,14 @@ namespace BinaryObjectScanner.Wrappers #region Data Files Count /// - public uint DataFilesCount => _audioFile.DataFilesCount; + public uint DataFilesCount => _model.DataFilesCount; #endregion #region Unknown Block 3 /// - public SabreTools.Models.PlayJ.DataFile[] DataFiles => _audioFile.DataFiles; + public SabreTools.Models.PlayJ.DataFile[] DataFiles => _model.DataFiles; #endregion @@ -222,21 +222,29 @@ namespace BinaryObjectScanner.Wrappers #endregion - #region Instance Variables - - /// - /// Internal representation of the archive - /// - private SabreTools.Models.PlayJ.AudioFile _audioFile; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private PlayJAudioFile() { } + /// +#if NET48 + public PlayJAudioFile(SabreTools.Models.PlayJ.AudioFile model, byte[] data, int offset) +#else + public PlayJAudioFile(SabreTools.Models.PlayJ.AudioFile? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public PlayJAudioFile(SabreTools.Models.PlayJ.AudioFile model, Stream data) +#else + public PlayJAudioFile(SabreTools.Models.PlayJ.AudioFile? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a PlayJ audio file from a byte array and offset @@ -274,13 +282,14 @@ namespace BinaryObjectScanner.Wrappers if (audioFile == null) return null; - var wrapper = new PlayJAudioFile + try { - _audioFile = audioFile, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new PlayJAudioFile(audioFile, data); + } + catch + { + return null; + } } #endregion @@ -446,7 +455,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_audioFile, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/PortableExecutable.cs b/BinaryObjectScanner.Wrappers/PortableExecutable.cs index 3f7393b9..b456204e 100644 --- a/BinaryObjectScanner.Wrappers/PortableExecutable.cs +++ b/BinaryObjectScanner.Wrappers/PortableExecutable.cs @@ -10,12 +10,12 @@ using static SabreTools.Serialization.Extensions; namespace BinaryObjectScanner.Wrappers { - public class PortableExecutable : WrapperBase + public class PortableExecutable : WrapperBase { #region Descriptive Properties /// - public override string Description => "Portable Executable (PE)"; + public override string DescriptionString => "Portable Executable (PE)"; #endregion @@ -26,95 +26,95 @@ namespace BinaryObjectScanner.Wrappers #region Standard Fields /// - public string Stub_Magic => _executable.Stub.Header.Magic; + public string Stub_Magic => _model.Stub.Header.Magic; /// - public ushort Stub_LastPageBytes => _executable.Stub.Header.LastPageBytes; + public ushort Stub_LastPageBytes => _model.Stub.Header.LastPageBytes; /// - public ushort Stub_Pages => _executable.Stub.Header.Pages; + public ushort Stub_Pages => _model.Stub.Header.Pages; /// - public ushort Stub_RelocationItems => _executable.Stub.Header.RelocationItems; + public ushort Stub_RelocationItems => _model.Stub.Header.RelocationItems; /// - public ushort Stub_HeaderParagraphSize => _executable.Stub.Header.HeaderParagraphSize; + public ushort Stub_HeaderParagraphSize => _model.Stub.Header.HeaderParagraphSize; /// - public ushort Stub_MinimumExtraParagraphs => _executable.Stub.Header.MinimumExtraParagraphs; + public ushort Stub_MinimumExtraParagraphs => _model.Stub.Header.MinimumExtraParagraphs; /// - public ushort Stub_MaximumExtraParagraphs => _executable.Stub.Header.MaximumExtraParagraphs; + public ushort Stub_MaximumExtraParagraphs => _model.Stub.Header.MaximumExtraParagraphs; /// - public ushort Stub_InitialSSValue => _executable.Stub.Header.InitialSSValue; + public ushort Stub_InitialSSValue => _model.Stub.Header.InitialSSValue; /// - public ushort Stub_InitialSPValue => _executable.Stub.Header.InitialSPValue; + public ushort Stub_InitialSPValue => _model.Stub.Header.InitialSPValue; /// - public ushort Stub_Checksum => _executable.Stub.Header.Checksum; + public ushort Stub_Checksum => _model.Stub.Header.Checksum; /// - public ushort Stub_InitialIPValue => _executable.Stub.Header.InitialIPValue; + public ushort Stub_InitialIPValue => _model.Stub.Header.InitialIPValue; /// - public ushort Stub_InitialCSValue => _executable.Stub.Header.InitialCSValue; + public ushort Stub_InitialCSValue => _model.Stub.Header.InitialCSValue; /// - public ushort Stub_RelocationTableAddr => _executable.Stub.Header.RelocationTableAddr; + public ushort Stub_RelocationTableAddr => _model.Stub.Header.RelocationTableAddr; /// - public ushort Stub_OverlayNumber => _executable.Stub.Header.OverlayNumber; + public ushort Stub_OverlayNumber => _model.Stub.Header.OverlayNumber; #endregion #region PE Extensions /// - public ushort[] Stub_Reserved1 => _executable.Stub.Header.Reserved1; + public ushort[] Stub_Reserved1 => _model.Stub.Header.Reserved1; /// - public ushort Stub_OEMIdentifier => _executable.Stub.Header.OEMIdentifier; + public ushort Stub_OEMIdentifier => _model.Stub.Header.OEMIdentifier; /// - public ushort Stub_OEMInformation => _executable.Stub.Header.OEMInformation; + public ushort Stub_OEMInformation => _model.Stub.Header.OEMInformation; /// - public ushort[] Stub_Reserved2 => _executable.Stub.Header.Reserved2; + public ushort[] Stub_Reserved2 => _model.Stub.Header.Reserved2; /// - public uint Stub_NewExeHeaderAddr => _executable.Stub.Header.NewExeHeaderAddr; + public uint Stub_NewExeHeaderAddr => _model.Stub.Header.NewExeHeaderAddr; #endregion #endregion /// - public string Signature => _executable.Signature; + public string Signature => _model.Signature; #region COFF File Header /// - public SabreTools.Models.PortableExecutable.MachineType Machine => _executable.COFFFileHeader.Machine; + public SabreTools.Models.PortableExecutable.MachineType Machine => _model.COFFFileHeader.Machine; /// - public ushort NumberOfSections => _executable.COFFFileHeader.NumberOfSections; + public ushort NumberOfSections => _model.COFFFileHeader.NumberOfSections; /// - public uint TimeDateStamp => _executable.COFFFileHeader.TimeDateStamp; + public uint TimeDateStamp => _model.COFFFileHeader.TimeDateStamp; /// - public uint PointerToSymbolTable => _executable.COFFFileHeader.PointerToSymbolTable; + public uint PointerToSymbolTable => _model.COFFFileHeader.PointerToSymbolTable; /// - public uint NumberOfSymbols => _executable.COFFFileHeader.NumberOfSymbols; + public uint NumberOfSymbols => _model.COFFFileHeader.NumberOfSymbols; /// - public uint SizeOfOptionalHeader => _executable.COFFFileHeader.SizeOfOptionalHeader; + public uint SizeOfOptionalHeader => _model.COFFFileHeader.SizeOfOptionalHeader; /// - public SabreTools.Models.PortableExecutable.Characteristics Characteristics => _executable.COFFFileHeader.Characteristics; + public SabreTools.Models.PortableExecutable.Characteristics Characteristics => _model.COFFFileHeader.Characteristics; #endregion @@ -123,32 +123,32 @@ namespace BinaryObjectScanner.Wrappers #region Standard Fields /// - public SabreTools.Models.PortableExecutable.OptionalHeaderMagicNumber OH_Magic => _executable.OptionalHeader.Magic; + public SabreTools.Models.PortableExecutable.OptionalHeaderMagicNumber OH_Magic => _model.OptionalHeader.Magic; /// - public byte OH_MajorLinkerVersion => _executable.OptionalHeader.MajorLinkerVersion; + public byte OH_MajorLinkerVersion => _model.OptionalHeader.MajorLinkerVersion; /// - public byte OH_MinorLinkerVersion => _executable.OptionalHeader.MinorLinkerVersion; + public byte OH_MinorLinkerVersion => _model.OptionalHeader.MinorLinkerVersion; /// - public uint OH_SizeOfCode => _executable.OptionalHeader.SizeOfCode; + public uint OH_SizeOfCode => _model.OptionalHeader.SizeOfCode; /// - public uint OH_SizeOfInitializedData => _executable.OptionalHeader.SizeOfInitializedData; + public uint OH_SizeOfInitializedData => _model.OptionalHeader.SizeOfInitializedData; /// - public uint OH_SizeOfUninitializedData => _executable.OptionalHeader.SizeOfUninitializedData; + public uint OH_SizeOfUninitializedData => _model.OptionalHeader.SizeOfUninitializedData; /// - public uint OH_AddressOfEntryPoint => _executable.OptionalHeader.AddressOfEntryPoint; + public uint OH_AddressOfEntryPoint => _model.OptionalHeader.AddressOfEntryPoint; /// - public uint OH_BaseOfCode => _executable.OptionalHeader.BaseOfCode; + public uint OH_BaseOfCode => _model.OptionalHeader.BaseOfCode; /// - public uint? OH_BaseOfData => _executable.OptionalHeader.Magic == SabreTools.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32 - ? (uint?)_executable.OptionalHeader.BaseOfData + public uint? OH_BaseOfData => _model.OptionalHeader.Magic == SabreTools.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32 + ? (uint?)_model.OptionalHeader.BaseOfData : null; #endregion @@ -156,129 +156,129 @@ namespace BinaryObjectScanner.Wrappers #region Windows-Specific Fields /// - public ulong OH_ImageBase => _executable.OptionalHeader.Magic == SabreTools.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32 - ? _executable.OptionalHeader.ImageBase_PE32 - : _executable.OptionalHeader.ImageBase_PE32Plus; + public ulong OH_ImageBase => _model.OptionalHeader.Magic == SabreTools.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32 + ? _model.OptionalHeader.ImageBase_PE32 + : _model.OptionalHeader.ImageBase_PE32Plus; /// - public uint OH_SectionAlignment => _executable.OptionalHeader.SectionAlignment; + public uint OH_SectionAlignment => _model.OptionalHeader.SectionAlignment; /// - public uint OH_FileAlignment => _executable.OptionalHeader.FileAlignment; + public uint OH_FileAlignment => _model.OptionalHeader.FileAlignment; /// - public ushort OH_MajorOperatingSystemVersion => _executable.OptionalHeader.MajorOperatingSystemVersion; + public ushort OH_MajorOperatingSystemVersion => _model.OptionalHeader.MajorOperatingSystemVersion; /// - public ushort OH_MinorOperatingSystemVersion => _executable.OptionalHeader.MinorOperatingSystemVersion; + public ushort OH_MinorOperatingSystemVersion => _model.OptionalHeader.MinorOperatingSystemVersion; /// - public ushort OH_MajorImageVersion => _executable.OptionalHeader.MajorImageVersion; + public ushort OH_MajorImageVersion => _model.OptionalHeader.MajorImageVersion; /// - public ushort OH_MinorImageVersion => _executable.OptionalHeader.MinorImageVersion; + public ushort OH_MinorImageVersion => _model.OptionalHeader.MinorImageVersion; /// - public ushort OH_MajorSubsystemVersion => _executable.OptionalHeader.MajorSubsystemVersion; + public ushort OH_MajorSubsystemVersion => _model.OptionalHeader.MajorSubsystemVersion; /// - public ushort OH_MinorSubsystemVersion => _executable.OptionalHeader.MinorSubsystemVersion; + public ushort OH_MinorSubsystemVersion => _model.OptionalHeader.MinorSubsystemVersion; /// - public uint OH_Win32VersionValue => _executable.OptionalHeader.Win32VersionValue; + public uint OH_Win32VersionValue => _model.OptionalHeader.Win32VersionValue; /// - public uint OH_SizeOfImage => _executable.OptionalHeader.SizeOfImage; + public uint OH_SizeOfImage => _model.OptionalHeader.SizeOfImage; /// - public uint OH_SizeOfHeaders => _executable.OptionalHeader.SizeOfHeaders; + public uint OH_SizeOfHeaders => _model.OptionalHeader.SizeOfHeaders; /// - public uint OH_CheckSum => _executable.OptionalHeader.CheckSum; + public uint OH_CheckSum => _model.OptionalHeader.CheckSum; /// - public SabreTools.Models.PortableExecutable.WindowsSubsystem OH_Subsystem => _executable.OptionalHeader.Subsystem; + public SabreTools.Models.PortableExecutable.WindowsSubsystem OH_Subsystem => _model.OptionalHeader.Subsystem; /// - public SabreTools.Models.PortableExecutable.DllCharacteristics OH_DllCharacteristics => _executable.OptionalHeader.DllCharacteristics; + public SabreTools.Models.PortableExecutable.DllCharacteristics OH_DllCharacteristics => _model.OptionalHeader.DllCharacteristics; /// - public ulong OH_SizeOfStackReserve => _executable.OptionalHeader.Magic == SabreTools.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32 - ? _executable.OptionalHeader.SizeOfStackReserve_PE32 - : _executable.OptionalHeader.SizeOfStackReserve_PE32Plus; + public ulong OH_SizeOfStackReserve => _model.OptionalHeader.Magic == SabreTools.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32 + ? _model.OptionalHeader.SizeOfStackReserve_PE32 + : _model.OptionalHeader.SizeOfStackReserve_PE32Plus; /// - public ulong OH_SizeOfStackCommit => _executable.OptionalHeader.Magic == SabreTools.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32 - ? _executable.OptionalHeader.SizeOfStackCommit_PE32 - : _executable.OptionalHeader.SizeOfStackCommit_PE32Plus; + public ulong OH_SizeOfStackCommit => _model.OptionalHeader.Magic == SabreTools.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32 + ? _model.OptionalHeader.SizeOfStackCommit_PE32 + : _model.OptionalHeader.SizeOfStackCommit_PE32Plus; /// - public ulong OH_SizeOfHeapReserve => _executable.OptionalHeader.Magic == SabreTools.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32 - ? _executable.OptionalHeader.SizeOfHeapReserve_PE32 - : _executable.OptionalHeader.SizeOfHeapReserve_PE32Plus; + public ulong OH_SizeOfHeapReserve => _model.OptionalHeader.Magic == SabreTools.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32 + ? _model.OptionalHeader.SizeOfHeapReserve_PE32 + : _model.OptionalHeader.SizeOfHeapReserve_PE32Plus; /// - public ulong OH_SizeOfHeapCommit => _executable.OptionalHeader.Magic == SabreTools.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32 - ? _executable.OptionalHeader.SizeOfHeapCommit_PE32 - : _executable.OptionalHeader.SizeOfHeapCommit_PE32Plus; + public ulong OH_SizeOfHeapCommit => _model.OptionalHeader.Magic == SabreTools.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32 + ? _model.OptionalHeader.SizeOfHeapCommit_PE32 + : _model.OptionalHeader.SizeOfHeapCommit_PE32Plus; /// - public uint OH_LoaderFlags => _executable.OptionalHeader.LoaderFlags; + public uint OH_LoaderFlags => _model.OptionalHeader.LoaderFlags; /// - public uint OH_NumberOfRvaAndSizes => _executable.OptionalHeader.NumberOfRvaAndSizes; + public uint OH_NumberOfRvaAndSizes => _model.OptionalHeader.NumberOfRvaAndSizes; #endregion #region Data Directories /// - public SabreTools.Models.PortableExecutable.DataDirectory OH_ExportTable => _executable.OptionalHeader.ExportTable; + public SabreTools.Models.PortableExecutable.DataDirectory OH_ExportTable => _model.OptionalHeader.ExportTable; /// - public SabreTools.Models.PortableExecutable.DataDirectory OH_ImportTable => _executable.OptionalHeader.ImportTable; + public SabreTools.Models.PortableExecutable.DataDirectory OH_ImportTable => _model.OptionalHeader.ImportTable; /// - public SabreTools.Models.PortableExecutable.DataDirectory OH_ResourceTable => _executable.OptionalHeader.ResourceTable; + public SabreTools.Models.PortableExecutable.DataDirectory OH_ResourceTable => _model.OptionalHeader.ResourceTable; /// - public SabreTools.Models.PortableExecutable.DataDirectory OH_ExceptionTable => _executable.OptionalHeader.ExceptionTable; + public SabreTools.Models.PortableExecutable.DataDirectory OH_ExceptionTable => _model.OptionalHeader.ExceptionTable; /// - public SabreTools.Models.PortableExecutable.DataDirectory OH_CertificateTable => _executable.OptionalHeader.CertificateTable; + public SabreTools.Models.PortableExecutable.DataDirectory OH_CertificateTable => _model.OptionalHeader.CertificateTable; /// - public SabreTools.Models.PortableExecutable.DataDirectory OH_BaseRelocationTable => _executable.OptionalHeader.BaseRelocationTable; + public SabreTools.Models.PortableExecutable.DataDirectory OH_BaseRelocationTable => _model.OptionalHeader.BaseRelocationTable; /// - public SabreTools.Models.PortableExecutable.DataDirectory OH_Debug => _executable.OptionalHeader.Debug; + public SabreTools.Models.PortableExecutable.DataDirectory OH_Debug => _model.OptionalHeader.Debug; /// - public ulong OH_Architecture => _executable.OptionalHeader.Architecture; + public ulong OH_Architecture => _model.OptionalHeader.Architecture; /// - public SabreTools.Models.PortableExecutable.DataDirectory OH_GlobalPtr => _executable.OptionalHeader.GlobalPtr; + public SabreTools.Models.PortableExecutable.DataDirectory OH_GlobalPtr => _model.OptionalHeader.GlobalPtr; /// - public SabreTools.Models.PortableExecutable.DataDirectory OH_ThreadLocalStorageTable => _executable.OptionalHeader.ThreadLocalStorageTable; + public SabreTools.Models.PortableExecutable.DataDirectory OH_ThreadLocalStorageTable => _model.OptionalHeader.ThreadLocalStorageTable; /// - public SabreTools.Models.PortableExecutable.DataDirectory OH_LoadConfigTable => _executable.OptionalHeader.LoadConfigTable; + public SabreTools.Models.PortableExecutable.DataDirectory OH_LoadConfigTable => _model.OptionalHeader.LoadConfigTable; /// - public SabreTools.Models.PortableExecutable.DataDirectory OH_BoundImport => _executable.OptionalHeader.BoundImport; + public SabreTools.Models.PortableExecutable.DataDirectory OH_BoundImport => _model.OptionalHeader.BoundImport; /// - public SabreTools.Models.PortableExecutable.DataDirectory OH_ImportAddressTable => _executable.OptionalHeader.ImportAddressTable; + public SabreTools.Models.PortableExecutable.DataDirectory OH_ImportAddressTable => _model.OptionalHeader.ImportAddressTable; /// - public SabreTools.Models.PortableExecutable.DataDirectory OH_DelayImportDescriptor => _executable.OptionalHeader.DelayImportDescriptor; + public SabreTools.Models.PortableExecutable.DataDirectory OH_DelayImportDescriptor => _model.OptionalHeader.DelayImportDescriptor; /// - public SabreTools.Models.PortableExecutable.DataDirectory OH_CLRRuntimeHeader => _executable.OptionalHeader.CLRRuntimeHeader; + public SabreTools.Models.PortableExecutable.DataDirectory OH_CLRRuntimeHeader => _model.OptionalHeader.CLRRuntimeHeader; /// - public ulong OH_Reserved => _executable.OptionalHeader.Reserved; + public ulong OH_Reserved => _model.OptionalHeader.Reserved; #endregion @@ -287,46 +287,46 @@ namespace BinaryObjectScanner.Wrappers #region Tables /// - public SabreTools.Models.PortableExecutable.SectionHeader[] SectionTable => _executable.SectionTable; + public SabreTools.Models.PortableExecutable.SectionHeader[] SectionTable => _model.SectionTable; /// - public SabreTools.Models.PortableExecutable.COFFSymbolTableEntry[] COFFSymbolTable => _executable.COFFSymbolTable; + public SabreTools.Models.PortableExecutable.COFFSymbolTableEntry[] COFFSymbolTable => _model.COFFSymbolTable; /// - public SabreTools.Models.PortableExecutable.COFFStringTable COFFStringTable => _executable.COFFStringTable; + public SabreTools.Models.PortableExecutable.COFFStringTable COFFStringTable => _model.COFFStringTable; /// - public SabreTools.Models.PortableExecutable.AttributeCertificateTableEntry[] AttributeCertificateTable => _executable.AttributeCertificateTable; + public SabreTools.Models.PortableExecutable.AttributeCertificateTableEntry[] AttributeCertificateTable => _model.AttributeCertificateTable; /// - public SabreTools.Models.PortableExecutable.DelayLoadDirectoryTable DelayLoadDirectoryTable => _executable.DelayLoadDirectoryTable; + public SabreTools.Models.PortableExecutable.DelayLoadDirectoryTable DelayLoadDirectoryTable => _model.DelayLoadDirectoryTable; #endregion #region Sections /// - public SabreTools.Models.PortableExecutable.BaseRelocationBlock[] BaseRelocationTable => _executable.BaseRelocationTable; + public SabreTools.Models.PortableExecutable.BaseRelocationBlock[] BaseRelocationTable => _model.BaseRelocationTable; /// - public SabreTools.Models.PortableExecutable.DebugTable DebugTable => _executable.DebugTable; + public SabreTools.Models.PortableExecutable.DebugTable DebugTable => _model.DebugTable; /// - public SabreTools.Models.PortableExecutable.ExportTable ExportTable => _executable.ExportTable; + public SabreTools.Models.PortableExecutable.ExportTable ExportTable => _model.ExportTable; /// - public string[] ExportNameTable => _executable.ExportTable?.ExportNameTable?.Strings; + public string[] ExportNameTable => _model.ExportTable?.ExportNameTable?.Strings; /// - public SabreTools.Models.PortableExecutable.ImportTable ImportTable => _executable.ImportTable; + public SabreTools.Models.PortableExecutable.ImportTable ImportTable => _model.ImportTable; /// - public string[] ImportHintNameTable => _executable.ImportTable?.HintNameTable != null - ? _executable.ImportTable.HintNameTable.Select(entry => entry.Name).ToArray() + public string[] ImportHintNameTable => _model.ImportTable?.HintNameTable != null + ? _model.ImportTable.HintNameTable.Select(entry => entry.Name).ToArray() : null; /// - public SabreTools.Models.PortableExecutable.ResourceDirectoryTable ResourceDirectoryTable => _executable.ResourceDirectoryTable; + public SabreTools.Models.PortableExecutable.ResourceDirectoryTable ResourceDirectoryTable => _model.ResourceDirectoryTable; #endregion @@ -442,18 +442,18 @@ namespace BinaryObjectScanner.Wrappers // If we have certificate data, use that as the end if (OH_CertificateTable != null) { - var certificateTable = _executable.OptionalHeader.CertificateTable; - int certificateTableAddress = (int)certificateTable.VirtualAddress.ConvertVirtualAddress(_executable.SectionTable); + var certificateTable = _model.OptionalHeader.CertificateTable; + int certificateTableAddress = (int)certificateTable.VirtualAddress.ConvertVirtualAddress(_model.SectionTable); if (certificateTableAddress != 0 && certificateTableAddress < endOfFile) endOfFile = certificateTableAddress; } // Search through all sections and find the furthest a section goes int endOfSectionData = -1; - foreach (var section in _executable.SectionTable) + foreach (var section in _model.SectionTable) { // If we have an invalid section address - int sectionAddress = (int)section.VirtualAddress.ConvertVirtualAddress(_executable.SectionTable); + int sectionAddress = (int)section.VirtualAddress.ConvertVirtualAddress(_model.SectionTable); if (sectionAddress == 0) continue; @@ -506,18 +506,18 @@ namespace BinaryObjectScanner.Wrappers // If we have certificate data, use that as the end if (OH_CertificateTable != null) { - var certificateTable = _executable.OptionalHeader.CertificateTable; - int certificateTableAddress = (int)certificateTable.VirtualAddress.ConvertVirtualAddress(_executable.SectionTable); + var certificateTable = _model.OptionalHeader.CertificateTable; + int certificateTableAddress = (int)certificateTable.VirtualAddress.ConvertVirtualAddress(_model.SectionTable); if (certificateTableAddress != 0 && certificateTableAddress < endOfFile) endOfFile = certificateTableAddress; } // Search through all sections and find the furthest a section goes int endOfSectionData = -1; - foreach (var section in _executable.SectionTable) + foreach (var section in _model.SectionTable) { // If we have an invalid section address - int sectionAddress = (int)section.VirtualAddress.ConvertVirtualAddress(_executable.SectionTable); + int sectionAddress = (int)section.VirtualAddress.ConvertVirtualAddress(_model.SectionTable); if (sectionAddress == 0) continue; @@ -577,18 +577,18 @@ namespace BinaryObjectScanner.Wrappers // If we have certificate data, use that as the end if (OH_CertificateTable != null) { - var certificateTable = _executable.OptionalHeader.CertificateTable; - int certificateTableAddress = (int)certificateTable.VirtualAddress.ConvertVirtualAddress(_executable.SectionTable); + var certificateTable = _model.OptionalHeader.CertificateTable; + int certificateTableAddress = (int)certificateTable.VirtualAddress.ConvertVirtualAddress(_model.SectionTable); if (certificateTableAddress != 0 && certificateTableAddress < endOfFile) endOfFile = certificateTableAddress; } // Search through all sections and find the furthest a section goes int endOfSectionData = -1; - foreach (var section in _executable.SectionTable) + foreach (var section in _model.SectionTable) { // If we have an invalid section address - int sectionAddress = (int)section.VirtualAddress.ConvertVirtualAddress(_executable.SectionTable); + int sectionAddress = (int)section.VirtualAddress.ConvertVirtualAddress(_model.SectionTable); if (sectionAddress == 0) continue; @@ -641,10 +641,10 @@ namespace BinaryObjectScanner.Wrappers return _sectionNames; // Otherwise, build and return the cached array - _sectionNames = new string[_executable.SectionTable.Length]; + _sectionNames = new string[_model.SectionTable.Length]; for (int i = 0; i < _sectionNames.Length; i++) { - var section = _executable.SectionTable[i]; + var section = _model.SectionTable[i]; // TODO: Handle long section names with leading `/` byte[] sectionNameBytes = section.Name; @@ -672,7 +672,7 @@ namespace BinaryObjectScanner.Wrappers // Populate the raw stub executable data based on the source int endOfStubHeader = 0x40; - int lengthOfStubExecutableData = (int)_executable.Stub.Header.NewExeHeaderAddr - endOfStubHeader; + int lengthOfStubExecutableData = (int)_model.Stub.Header.NewExeHeaderAddr - endOfStubHeader; _stubExecutableData = ReadFromDataSource(endOfStubHeader, lengthOfStubExecutableData); // Cache and return the stub executable data, even if null @@ -903,11 +903,6 @@ namespace BinaryObjectScanner.Wrappers #region Instance Variables - /// - /// Internal representation of the executable - /// - private SabreTools.Models.PortableExecutable.Executable _executable; - /// /// Header padding data, if it exists /// @@ -997,10 +992,27 @@ namespace BinaryObjectScanner.Wrappers #region Constructors - /// - /// Private constructor - /// - private PortableExecutable() { } + /// +#if NET48 + public PortableExecutable(SabreTools.Models.PortableExecutable.Executable model, byte[] data, int offset) +#else + public PortableExecutable(SabreTools.Models.PortableExecutable.Executable? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public PortableExecutable(SabreTools.Models.PortableExecutable.Executable model, Stream data) +#else + public PortableExecutable(SabreTools.Models.PortableExecutable.Executable? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a PE executable from a byte array and offset @@ -1038,13 +1050,14 @@ namespace BinaryObjectScanner.Wrappers if (executable == null) return null; - var wrapper = new PortableExecutable + try { - _executable = executable, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new PortableExecutable(executable, data); + } + catch + { + return null; + } } #endregion @@ -2995,7 +3008,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_executable, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/Quantum.cs b/BinaryObjectScanner.Wrappers/Quantum.cs index 06879033..43fecd5c 100644 --- a/BinaryObjectScanner.Wrappers/Quantum.cs +++ b/BinaryObjectScanner.Wrappers/Quantum.cs @@ -3,12 +3,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class Quantum : WrapperBase + public class Quantum : WrapperBase { #region Descriptive Properties /// - public override string Description => "Quantum Archive"; + public override string DescriptionString => "Quantum Archive"; #endregion @@ -17,52 +17,60 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public string Signature => _archive.Header.Signature; + public string Signature => _model.Header.Signature; /// - public byte MajorVersion => _archive.Header.MajorVersion; + public byte MajorVersion => _model.Header.MajorVersion; /// - public byte MinorVersion => _archive.Header.MinorVersion; + public byte MinorVersion => _model.Header.MinorVersion; /// - public ushort FileCount => _archive.Header.FileCount; + public ushort FileCount => _model.Header.FileCount; /// - public byte TableSize => _archive.Header.TableSize; + public byte TableSize => _model.Header.TableSize; /// - public byte CompressionFlags => _archive.Header.CompressionFlags; + public byte CompressionFlags => _model.Header.CompressionFlags; #endregion #region File List /// - public SabreTools.Models.Quantum.FileDescriptor[] FileList => _archive.FileList; + public SabreTools.Models.Quantum.FileDescriptor[] FileList => _model.FileList; #endregion /// - public long CompressedDataOffset => _archive.CompressedDataOffset; - - #endregion - - #region Instance Variables - - /// - /// Internal representation of the archive - /// - private SabreTools.Models.Quantum.Archive _archive; + public long CompressedDataOffset => _model.CompressedDataOffset; #endregion #region Constructors - /// - /// Private constructor - /// - private Quantum() { } + /// +#if NET48 + public Quantum(SabreTools.Models.Quantum.Archive model, byte[] data, int offset) +#else + public Quantum(SabreTools.Models.Quantum.Archive? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public Quantum(SabreTools.Models.Quantum.Archive model, Stream data) +#else + public Quantum(SabreTools.Models.Quantum.Archive? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a Quantum archive from a byte array and offset @@ -100,13 +108,14 @@ namespace BinaryObjectScanner.Wrappers if (archive == null) return null; - var wrapper = new Quantum + try { - _archive = archive, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new Quantum(archive, data); + } + catch + { + return null; + } } #endregion @@ -294,7 +303,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_archive, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/SGA.cs b/BinaryObjectScanner.Wrappers/SGA.cs index 3091e122..fefe70d7 100644 --- a/BinaryObjectScanner.Wrappers/SGA.cs +++ b/BinaryObjectScanner.Wrappers/SGA.cs @@ -7,12 +7,12 @@ using ICSharpCode.SharpZipLib.Zip.Compression; namespace BinaryObjectScanner.Wrappers { - public class SGA : WrapperBase + public class SGA : WrapperBase { #region Descriptive Properties /// - public override string Description => "SGA"; + public override string DescriptionString => "SGA"; #endregion @@ -21,13 +21,13 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public string Signature => _file.Header.Signature; + public string Signature => _model.Header.Signature; /// - public ushort MajorVersion => _file.Header.MajorVersion; + public ushort MajorVersion => _model.Header.MajorVersion; /// - public ushort MinorVersion => _file.Header.MinorVersion; + public ushort MinorVersion => _model.Header.MinorVersion; /// public byte[] FileMD5 @@ -36,8 +36,8 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Header as SabreTools.Models.SGA.Header4).FileMD5; - case 5: return (_file.Header as SabreTools.Models.SGA.Header4).FileMD5; + case 4: return (_model.Header as SabreTools.Models.SGA.Header4).FileMD5; + case 5: return (_model.Header as SabreTools.Models.SGA.Header4).FileMD5; default: return null; }; } @@ -50,10 +50,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Header as SabreTools.Models.SGA.Header4).Name; - case 5: return (_file.Header as SabreTools.Models.SGA.Header4).Name; - case 6: return (_file.Header as SabreTools.Models.SGA.Header6).Name; - case 7: return (_file.Header as SabreTools.Models.SGA.Header6).Name; + case 4: return (_model.Header as SabreTools.Models.SGA.Header4).Name; + case 5: return (_model.Header as SabreTools.Models.SGA.Header4).Name; + case 6: return (_model.Header as SabreTools.Models.SGA.Header6).Name; + case 7: return (_model.Header as SabreTools.Models.SGA.Header6).Name; default: return null; }; } @@ -66,8 +66,8 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Header as SabreTools.Models.SGA.Header4).HeaderMD5; - case 5: return (_file.Header as SabreTools.Models.SGA.Header4).HeaderMD5; + case 4: return (_model.Header as SabreTools.Models.SGA.Header4).HeaderMD5; + case 5: return (_model.Header as SabreTools.Models.SGA.Header4).HeaderMD5; default: return null; }; } @@ -80,10 +80,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Header as SabreTools.Models.SGA.Header4).HeaderLength; - case 5: return (_file.Header as SabreTools.Models.SGA.Header4).HeaderLength; - case 6: return (_file.Header as SabreTools.Models.SGA.Header6).HeaderLength; - case 7: return (_file.Header as SabreTools.Models.SGA.Header6).HeaderLength; + case 4: return (_model.Header as SabreTools.Models.SGA.Header4).HeaderLength; + case 5: return (_model.Header as SabreTools.Models.SGA.Header4).HeaderLength; + case 6: return (_model.Header as SabreTools.Models.SGA.Header6).HeaderLength; + case 7: return (_model.Header as SabreTools.Models.SGA.Header6).HeaderLength; default: return null; }; } @@ -96,10 +96,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Header as SabreTools.Models.SGA.Header4).FileDataOffset; - case 5: return (_file.Header as SabreTools.Models.SGA.Header4).FileDataOffset; - case 6: return (_file.Header as SabreTools.Models.SGA.Header6).FileDataOffset; - case 7: return (_file.Header as SabreTools.Models.SGA.Header6).FileDataOffset; + case 4: return (_model.Header as SabreTools.Models.SGA.Header4).FileDataOffset; + case 5: return (_model.Header as SabreTools.Models.SGA.Header4).FileDataOffset; + case 6: return (_model.Header as SabreTools.Models.SGA.Header6).FileDataOffset; + case 7: return (_model.Header as SabreTools.Models.SGA.Header6).FileDataOffset; default: return null; }; } @@ -112,10 +112,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Header as SabreTools.Models.SGA.Header4).Dummy0; - case 5: return (_file.Header as SabreTools.Models.SGA.Header4).Dummy0; - case 6: return (_file.Header as SabreTools.Models.SGA.Header6).Dummy0; - case 7: return (_file.Header as SabreTools.Models.SGA.Header6).Dummy0; + case 4: return (_model.Header as SabreTools.Models.SGA.Header4).Dummy0; + case 5: return (_model.Header as SabreTools.Models.SGA.Header4).Dummy0; + case 6: return (_model.Header as SabreTools.Models.SGA.Header6).Dummy0; + case 7: return (_model.Header as SabreTools.Models.SGA.Header6).Dummy0; default: return null; }; } @@ -134,10 +134,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.SectionOffset; - case 5: return (_file.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.SectionOffset; - case 6: return (_file.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.SectionOffset; - case 7: return (_file.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.SectionOffset; + case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.SectionOffset; + case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.SectionOffset; + case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.SectionOffset; + case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.SectionOffset; default: return null; }; } @@ -150,10 +150,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.SectionCount; - case 5: return (_file.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.SectionCount; - case 6: return (_file.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.SectionCount; - case 7: return (_file.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.SectionCount; + case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.SectionCount; + case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.SectionCount; + case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.SectionCount; + case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.SectionCount; default: return null; }; } @@ -166,10 +166,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.FolderOffset; - case 5: return (_file.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.FolderOffset; - case 6: return (_file.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.FolderOffset; - case 7: return (_file.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.FolderOffset; + case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.FolderOffset; + case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.FolderOffset; + case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.FolderOffset; + case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.FolderOffset; default: return null; }; } @@ -182,10 +182,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.FolderCount; - case 5: return (_file.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.FolderCount; - case 6: return (_file.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.FolderCount; - case 7: return (_file.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.FolderCount; + case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.FolderCount; + case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.FolderCount; + case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.FolderCount; + case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.FolderCount; default: return null; }; } @@ -198,10 +198,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.FileOffset; - case 5: return (_file.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.FileOffset; - case 6: return (_file.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.FileOffset; - case 7: return (_file.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.FileOffset; + case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.FileOffset; + case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.FileOffset; + case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.FileOffset; + case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.FileOffset; default: return null; }; } @@ -214,10 +214,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.FileCount; - case 5: return (_file.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.FileCount; - case 6: return (_file.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.FileCount; - case 7: return (_file.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.FileCount; + case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.FileCount; + case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.FileCount; + case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.FileCount; + case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.FileCount; default: return null; }; } @@ -230,10 +230,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.StringTableOffset; - case 5: return (_file.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.StringTableOffset; - case 6: return (_file.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.StringTableOffset; - case 7: return (_file.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.StringTableOffset; + case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.StringTableOffset; + case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.StringTableOffset; + case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.StringTableOffset; + case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.StringTableOffset; default: return null; }; } @@ -246,10 +246,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.StringTableCount; - case 5: return (_file.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.StringTableCount; - case 6: return (_file.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.StringTableCount; - case 7: return (_file.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.StringTableCount; + case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.StringTableCount; + case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.StringTableCount; + case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.StringTableCount; + case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.StringTableCount; default: return null; }; } @@ -262,7 +262,7 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 7: return (_file.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.HashTableOffset; + case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.HashTableOffset; default: return null; }; } @@ -275,7 +275,7 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 7: return (_file.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.BlockSize; + case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.BlockSize; default: return null; }; } @@ -292,10 +292,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Directory as SabreTools.Models.SGA.Directory4).Sections; - case 5: return (_file.Directory as SabreTools.Models.SGA.Directory5).Sections; - case 6: return (_file.Directory as SabreTools.Models.SGA.Directory6).Sections; - case 7: return (_file.Directory as SabreTools.Models.SGA.Directory7).Sections; + case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).Sections; + case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).Sections; + case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).Sections; + case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).Sections; default: return null; }; } @@ -312,10 +312,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Directory as SabreTools.Models.SGA.Directory4).Folders; - case 5: return (_file.Directory as SabreTools.Models.SGA.Directory5).Folders; - case 6: return (_file.Directory as SabreTools.Models.SGA.Directory6).Folders; - case 7: return (_file.Directory as SabreTools.Models.SGA.Directory7).Folders; + case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).Folders; + case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).Folders; + case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).Folders; + case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).Folders; default: return null; }; } @@ -332,10 +332,10 @@ namespace BinaryObjectScanner.Wrappers { switch (MajorVersion) { - case 4: return (_file.Directory as SabreTools.Models.SGA.Directory4).Files; - case 5: return (_file.Directory as SabreTools.Models.SGA.Directory5).Files; - case 6: return (_file.Directory as SabreTools.Models.SGA.Directory6).Files; - case 7: return (_file.Directory as SabreTools.Models.SGA.Directory7).Files; + case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).Files; + case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).Files; + case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).Files; + case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).Files; default: return null; }; } @@ -356,21 +356,29 @@ namespace BinaryObjectScanner.Wrappers #endregion - #region Instance Variables - - /// - /// Internal representation of the SGA - /// - private SabreTools.Models.SGA.File _file; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private SGA() { } + /// +#if NET48 + public SGA(SabreTools.Models.SGA.File model, byte[] data, int offset) +#else + public SGA(SabreTools.Models.SGA.File? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public SGA(SabreTools.Models.SGA.File model, Stream data) +#else + public SGA(SabreTools.Models.SGA.File? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create an SGA from a byte array and offset @@ -408,13 +416,14 @@ namespace BinaryObjectScanner.Wrappers if (file == null) return null; - var wrapper = new SGA + try { - _file = file, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new SGA(file, data); + } + catch + { + return null; + } } #endregion @@ -653,7 +662,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_file, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/VBSP.cs b/BinaryObjectScanner.Wrappers/VBSP.cs index 1f01012d..93e06ea7 100644 --- a/BinaryObjectScanner.Wrappers/VBSP.cs +++ b/BinaryObjectScanner.Wrappers/VBSP.cs @@ -4,28 +4,28 @@ using static SabreTools.Models.VBSP.Constants; namespace BinaryObjectScanner.Wrappers { - public class VBSP : WrapperBase + public class VBSP : WrapperBase { #region Descriptive Properties /// - public override string Description => "Half-Life 2 Level (VBSP)"; + public override string DescriptionString => "Half-Life 2 Level (VBSP)"; #endregion #region Pass-Through Properties /// - public string Signature => _file.Header.Signature; + public string Signature => _model.Header.Signature; /// - public int Version => _file.Header.Version; + public int Version => _model.Header.Version; /// - public SabreTools.Models.VBSP.Lump[] Lumps => _file.Header.Lumps; + public SabreTools.Models.VBSP.Lump[] Lumps => _model.Header.Lumps; /// - public int MapRevision => _file.Header.MapRevision; + public int MapRevision => _model.Header.MapRevision; #endregion @@ -35,21 +35,29 @@ namespace BinaryObjectScanner.Wrappers #endregion - #region Instance Variables - - /// - /// Internal representation of the VBSP - /// - private SabreTools.Models.VBSP.File _file; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private VBSP() { } + /// +#if NET48 + public VBSP(SabreTools.Models.VBSP.File model, byte[] data, int offset) +#else + public VBSP(SabreTools.Models.VBSP.File? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public VBSP(SabreTools.Models.VBSP.File model, Stream data) +#else + public VBSP(SabreTools.Models.VBSP.File? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a VBSP from a byte array and offset @@ -87,13 +95,14 @@ namespace BinaryObjectScanner.Wrappers if (file == null) return null; - var wrapper = new VBSP + try { - _file = file, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new VBSP(file, data); + } + catch + { + return null; + } } #endregion @@ -172,7 +181,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_file, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/VPK.cs b/BinaryObjectScanner.Wrappers/VPK.cs index 74fecd76..e2fdc46a 100644 --- a/BinaryObjectScanner.Wrappers/VPK.cs +++ b/BinaryObjectScanner.Wrappers/VPK.cs @@ -7,12 +7,12 @@ using static SabreTools.Models.VPK.Constants; namespace BinaryObjectScanner.Wrappers { - public class VPK : WrapperBase + public class VPK : WrapperBase { #region Descriptive Properties /// - public override string Description => "Valve Package File (VPK)"; + public override string DescriptionString => "Valve Package File (VPK)"; #endregion @@ -21,43 +21,43 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public uint Signature => _file.Header.Signature; + public uint Signature => _model.Header.Signature; /// - public uint Version => _file.Header.Version; + public uint Version => _model.Header.Version; /// - public uint DirectoryLength => _file.Header.DirectoryLength; + public uint DirectoryLength => _model.Header.DirectoryLength; #endregion #region Extended Header /// - public uint? Dummy0 => _file.ExtendedHeader?.Dummy0; + public uint? Dummy0 => _model.ExtendedHeader?.Dummy0; /// - public uint? ArchiveHashLength => _file.ExtendedHeader?.ArchiveHashLength; + public uint? ArchiveHashLength => _model.ExtendedHeader?.ArchiveHashLength; /// - public uint? ExtraLength => _file.ExtendedHeader?.ExtraLength; + public uint? ExtraLength => _model.ExtendedHeader?.ExtraLength; /// - public uint? Dummy1 => _file.ExtendedHeader?.Dummy1; + public uint? Dummy1 => _model.ExtendedHeader?.Dummy1; #endregion #region Archive Hashes /// - public SabreTools.Models.VPK.ArchiveHash[] ArchiveHashes => _file.ArchiveHashes; + public SabreTools.Models.VPK.ArchiveHash[] ArchiveHashes => _model.ArchiveHashes; #endregion #region Directory Items /// - public SabreTools.Models.VPK.DirectoryItem[] DirectoryItems => _file.DirectoryItems; + public SabreTools.Models.VPK.DirectoryItem[] DirectoryItems => _model.DirectoryItems; #endregion @@ -115,11 +115,6 @@ namespace BinaryObjectScanner.Wrappers #region Instance Variables - /// - /// Internal representation of the VPK - /// - private SabreTools.Models.VPK.File _file; - /// /// Array of archive filenames attached to the given VPK /// @@ -129,10 +124,27 @@ namespace BinaryObjectScanner.Wrappers #region Constructors - /// - /// Private constructor - /// - private VPK() { } + /// +#if NET48 + public VPK(SabreTools.Models.VPK.File model, byte[] data, int offset) +#else + public VPK(SabreTools.Models.VPK.File? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public VPK(SabreTools.Models.VPK.File model, Stream data) +#else + public VPK(SabreTools.Models.VPK.File? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a VPK from a byte array and offset @@ -170,13 +182,14 @@ namespace BinaryObjectScanner.Wrappers if (file == null) return null; - var wrapper = new VPK + try { - _file = file, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new VPK(file, data); + } + catch + { + return null; + } } #endregion @@ -222,7 +235,7 @@ namespace BinaryObjectScanner.Wrappers { builder.AppendLine(" Extended Header Information:"); builder.AppendLine(" -------------------------"); - if (_file.ExtendedHeader == null) + if (_model.ExtendedHeader == null) { builder.AppendLine(" No extended header"); } @@ -315,7 +328,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_file, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/WAD.cs b/BinaryObjectScanner.Wrappers/WAD.cs index 765675f3..fe2cf781 100644 --- a/BinaryObjectScanner.Wrappers/WAD.cs +++ b/BinaryObjectScanner.Wrappers/WAD.cs @@ -3,12 +3,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class WAD : WrapperBase + public class WAD : WrapperBase { #region Descriptive Properties /// - public override string Description => "Half-Life Texture Package File (WAD)"; + public override string DescriptionString => "Half-Life Texture Package File (WAD)"; #endregion @@ -17,27 +17,27 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public string Signature => _file.Header.Signature; + public string Signature => _model.Header.Signature; /// - public uint LumpCount => _file.Header.LumpCount; + public uint LumpCount => _model.Header.LumpCount; /// - public uint LumpOffset => _file.Header.LumpOffset; + public uint LumpOffset => _model.Header.LumpOffset; #endregion #region Lumps /// - public SabreTools.Models.WAD.Lump[] Lumps => _file.Lumps; + public SabreTools.Models.WAD.Lump[] Lumps => _model.Lumps; #endregion #region Lump Infos /// - public SabreTools.Models.WAD.LumpInfo[] LumpInfos => _file.LumpInfos; + public SabreTools.Models.WAD.LumpInfo[] LumpInfos => _model.LumpInfos; #endregion @@ -49,21 +49,29 @@ namespace BinaryObjectScanner.Wrappers #endregion - #region Instance Variables - - /// - /// Internal representation of the WAD - /// - private SabreTools.Models.WAD.File _file; - - #endregion - #region Constructors - /// - /// Private constructor - /// - private WAD() { } + /// +#if NET48 + public WAD(SabreTools.Models.WAD.File model, byte[] data, int offset) +#else + public WAD(SabreTools.Models.WAD.File? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public WAD(SabreTools.Models.WAD.File model, Stream data) +#else + public WAD(SabreTools.Models.WAD.File? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a WAD from a byte array and offset @@ -101,13 +109,14 @@ namespace BinaryObjectScanner.Wrappers if (file == null) return null; - var wrapper = new WAD + try { - _file = file, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new WAD(file, data); + } + catch + { + return null; + } } #endregion @@ -216,7 +225,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_file, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/BinaryObjectScanner.Wrappers/WrapperBase.cs b/BinaryObjectScanner.Wrappers/WrapperBase.cs index f318a8ed..bd0d2722 100644 --- a/BinaryObjectScanner.Wrappers/WrapperBase.cs +++ b/BinaryObjectScanner.Wrappers/WrapperBase.cs @@ -7,19 +7,32 @@ using SabreTools.IO; namespace BinaryObjectScanner.Wrappers { - public abstract class WrapperBase + public abstract class WrapperBase : IWrapper { #region Descriptive Properties + /// + public string Description() => DescriptionString; + /// /// Description of the object /// - public abstract string Description { get; } + public abstract string DescriptionString { get; } #endregion #region Instance Variables + /// + /// Internal model + /// + /// TODO: Should this have a public getter? +#if NET48 + protected T _model = default; +#else + protected T? _model = default; +#endif + /// /// Source of the original data /// @@ -29,7 +42,11 @@ namespace BinaryObjectScanner.Wrappers /// Source byte array data /// /// This is only populated if is +#if NET48 protected byte[] _byteArrayData = null; +#else + protected byte[]? _byteArrayData = null; +#endif /// /// Source byte array data offset @@ -41,7 +58,11 @@ namespace BinaryObjectScanner.Wrappers /// Source Stream data /// /// This is only populated if is +#if NET48 protected Stream _streamData = null; +#else + protected Stream? _streamData = null; +#endif #if NET6_0_OR_GREATER @@ -64,6 +85,53 @@ namespace BinaryObjectScanner.Wrappers #endregion + #region Constructors + + /// + /// Construct a new instance of the wrapper from a byte array + /// +#if NET48 + protected WrapperBase(T model, byte[] data, int offset) +#else + protected WrapperBase(T? model, byte[]? data, int offset) +#endif + { + if (model == null) + throw new ArgumentNullException(nameof(model)); + if (data == null) + throw new ArgumentNullException(nameof(data)); + if (offset < 0 || offset >= data.Length) + throw new ArgumentOutOfRangeException(nameof(offset)); + + _model = model; + _dataSource = DataSource.ByteArray; + _byteArrayData = data; + _byteArrayOffset = offset; + } + + /// + /// Construct a new instance of the wrapper from a Stream + /// +#if NET48 + protected WrapperBase(T model, Stream data) +#else + protected WrapperBase(T? model, Stream? data) +#endif + { + if (model == null) + throw new ArgumentNullException(nameof(model)); + if (data == null) + throw new ArgumentNullException(nameof(data)); + if (data.Length == 0 || !data.CanSeek || !data.CanRead) + throw new ArgumentOutOfRangeException(nameof(data)); + + _model = model; + _dataSource = DataSource.Stream; + _streamData = data; + } + + #endregion + #region Data /// diff --git a/BinaryObjectScanner.Wrappers/WrapperFactory.cs b/BinaryObjectScanner.Wrappers/WrapperFactory.cs index 7df6cde2..e77f2d20 100644 --- a/BinaryObjectScanner.Wrappers/WrapperFactory.cs +++ b/BinaryObjectScanner.Wrappers/WrapperFactory.cs @@ -11,7 +11,7 @@ namespace BinaryObjectScanner.Wrappers /// /// Create an instance of a wrapper based on file type /// - public static WrapperBase CreateWrapper(SupportedFileType fileType, Stream data) + public static IWrapper CreateWrapper(SupportedFileType fileType, Stream data) { switch (fileType) { @@ -60,10 +60,10 @@ namespace BinaryObjectScanner.Wrappers /// /// Stream data to parse /// WrapperBase representing the executable, null on error - public static WrapperBase CreateExecutableWrapper(Stream stream) + public static IWrapper CreateExecutableWrapper(Stream stream) { // Try to get an MS-DOS wrapper first - WrapperBase wrapper = MSDOS.Create(stream); + IWrapper wrapper = MSDOS.Create(stream); if (wrapper == null) return null; diff --git a/BinaryObjectScanner.Wrappers/XZP.cs b/BinaryObjectScanner.Wrappers/XZP.cs index a78bb6e5..e3f701a7 100644 --- a/BinaryObjectScanner.Wrappers/XZP.cs +++ b/BinaryObjectScanner.Wrappers/XZP.cs @@ -4,12 +4,12 @@ using System.Text; namespace BinaryObjectScanner.Wrappers { - public class XZP : WrapperBase + public class XZP : WrapperBase { #region Descriptive Properties /// - public override string Description => "Xbox Package File (XZP)"; + public override string DescriptionString => "Xbox Package File (XZP)"; #endregion @@ -18,69 +18,69 @@ namespace BinaryObjectScanner.Wrappers #region Header /// - public string Signature => _file.Header.Signature; + public string Signature => _model.Header.Signature; /// - public uint Version => _file.Header.Version; + public uint Version => _model.Header.Version; /// - public uint PreloadDirectoryEntryCount => _file.Header.PreloadDirectoryEntryCount; + public uint PreloadDirectoryEntryCount => _model.Header.PreloadDirectoryEntryCount; /// - public uint DirectoryEntryCount => _file.Header.DirectoryEntryCount; + public uint DirectoryEntryCount => _model.Header.DirectoryEntryCount; /// - public uint PreloadBytes => _file.Header.PreloadBytes; + public uint PreloadBytes => _model.Header.PreloadBytes; /// - public uint HeaderLength => _file.Header.HeaderLength; + public uint HeaderLength => _model.Header.HeaderLength; /// - public uint DirectoryItemCount => _file.Header.DirectoryItemCount; + public uint DirectoryItemCount => _model.Header.DirectoryItemCount; /// - public uint DirectoryItemOffset => _file.Header.DirectoryItemOffset; + public uint DirectoryItemOffset => _model.Header.DirectoryItemOffset; /// - public uint DirectoryItemLength => _file.Header.DirectoryItemLength; + public uint DirectoryItemLength => _model.Header.DirectoryItemLength; #endregion #region Directory Entries /// - public SabreTools.Models.XZP.DirectoryEntry[] DirectoryEntries => _file.DirectoryEntries; + public SabreTools.Models.XZP.DirectoryEntry[] DirectoryEntries => _model.DirectoryEntries; #endregion #region Preload Directory Entries /// - public SabreTools.Models.XZP.DirectoryEntry[] PreloadDirectoryEntries => _file.PreloadDirectoryEntries; + public SabreTools.Models.XZP.DirectoryEntry[] PreloadDirectoryEntries => _model.PreloadDirectoryEntries; #endregion #region Preload Directory Entries /// - public SabreTools.Models.XZP.DirectoryMapping[] PreloadDirectoryMappings => _file.PreloadDirectoryMappings; + public SabreTools.Models.XZP.DirectoryMapping[] PreloadDirectoryMappings => _model.PreloadDirectoryMappings; #endregion #region Directory Items /// - public SabreTools.Models.XZP.DirectoryItem[] DirectoryItems => _file.DirectoryItems; + public SabreTools.Models.XZP.DirectoryItem[] DirectoryItems => _model.DirectoryItems; #endregion #region Footer /// - public uint F_FileLength => _file.Footer.FileLength; + public uint F_FileLength => _model.Footer.FileLength; /// - public string F_Signature => _file.Footer.Signature; + public string F_Signature => _model.Footer.Signature; #endregion @@ -89,24 +89,32 @@ namespace BinaryObjectScanner.Wrappers #region Extension Properties // TODO: Figure out what extensions are needed - - #endregion - - #region Instance Variables - - /// - /// Internal representation of the XZP - /// - private SabreTools.Models.XZP.File _file; #endregion #region Constructors - /// - /// Private constructor - /// - private XZP() { } + /// +#if NET48 + public XZP(SabreTools.Models.XZP.File model, byte[] data, int offset) +#else + public XZP(SabreTools.Models.XZP.File? model, byte[]? data, int offset) +#endif + : base(model, data, offset) + { + // All logic is handled by the base class + } + + /// +#if NET48 + public XZP(SabreTools.Models.XZP.File model, Stream data) +#else + public XZP(SabreTools.Models.XZP.File? model, Stream? data) +#endif + : base(model, data) + { + // All logic is handled by the base class + } /// /// Create a XZP from a byte array and offset @@ -144,13 +152,14 @@ namespace BinaryObjectScanner.Wrappers if (file == null) return null; - var wrapper = new XZP + try { - _file = file, - _dataSource = DataSource.Stream, - _streamData = data, - }; - return wrapper; + return new XZP(file, data); + } + catch + { + return null; + } } #endregion @@ -315,7 +324,7 @@ namespace BinaryObjectScanner.Wrappers #if NET6_0_OR_GREATER /// - public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_file, _jsonSerializerOptions); + public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif diff --git a/Test/Printer.cs b/Test/Printer.cs index 9b1aa803..47a2a8b1 100644 --- a/Test/Printer.cs +++ b/Test/Printer.cs @@ -73,7 +73,7 @@ namespace Test } // Print the wrapper name - Console.WriteLine($"{wrapper.Description} wrapper created successfully!"); + Console.WriteLine($"{wrapper.Description()} wrapper created successfully!"); // Get the base info output name string filenameBase = $"info-{DateTime.Now:yyyy-MM-dd_HHmmss.ffff}";