Fix "possible null reference" warnings

This commit is contained in:
Matt Nadareski
2023-09-12 17:12:23 -04:00
parent 58aaf46a0e
commit 24e9455733
27 changed files with 1783 additions and 331 deletions

View File

@@ -21,7 +21,7 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public SabreTools.Models.AACS.Record[] Records => _model.Records;
#else
public SabreTools.Models.AACS.Record?[] Records => _model.Records;
public SabreTools.Models.AACS.Record?[]? Records => _model.Records;
#endif
#endregion
@@ -58,7 +58,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the archive</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>An AACS media key block wrapper on success, null on failure</returns>
#if NET48
public static AACSMediaKeyBlock Create(byte[] data, int offset)
#else
public static AACSMediaKeyBlock? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -78,7 +82,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the archive</param>
/// <returns>An AACS media key block wrapper on success, null on failure</returns>
#if NET48
public static AACSMediaKeyBlock Create(Stream data)
#else
public static AACSMediaKeyBlock? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -141,7 +149,7 @@ namespace BinaryObjectScanner.Wrappers
{
case SabreTools.Models.AACS.RecordType.EndOfMediaKeyBlock:
var eomkb = record as SabreTools.Models.AACS.EndOfMediaKeyBlockRecord;
builder.AppendLine($" Signature data: {BitConverter.ToString(eomkb.SignatureData ?? new byte[0]).Replace('-', ' ')}");
builder.AppendLine($" Signature data: {(eomkb.SignatureData == null ? "[NULL]" : BitConverter.ToString(eomkb.SignatureData).Replace('-', ' '))}");
break;
case SabreTools.Models.AACS.RecordType.ExplicitSubsetDifference:
@@ -177,7 +185,7 @@ namespace BinaryObjectScanner.Wrappers
for (int j = 0; j < mkd.MediaKeyData.Length; j++)
{
var mk = mkd.MediaKeyData[j];
builder.AppendLine($" Media key {j}: {BitConverter.ToString(mk ?? new byte[0]).Replace('-', ' ')}");
builder.AppendLine($" Media key {j}: {(mk == null ? "[NULL]" : BitConverter.ToString(mk).Replace('-', ' '))}");
}
}
break;
@@ -236,7 +244,7 @@ namespace BinaryObjectScanner.Wrappers
var ef = block.EntryFields[k];
builder.AppendLine($" Entry {k}");
builder.AppendLine($" Range: {ef.Range} (0x{ef.Range:X})");
builder.AppendLine($" Drive ID: {BitConverter.ToString(ef.DriveID ?? new byte[0]).Replace('-', ' ')}");
builder.AppendLine($" Drive ID: {(ef.DriveID == null ? "[NULL]" : BitConverter.ToString(ef.DriveID).Replace('-', ' '))}");
}
}
}
@@ -272,7 +280,7 @@ namespace BinaryObjectScanner.Wrappers
var ef = block.EntryFields[k];
builder.AppendLine($" Entry {k}");
builder.AppendLine($" Range: {ef.Range} (0x{ef.Range:X})");
builder.AppendLine($" Host ID: {BitConverter.ToString(ef.HostID ?? new byte[0]).Replace('-', ' ')}");
builder.AppendLine($" Host ID: {(ef.HostID == null ? "[NULL]" : BitConverter.ToString(ef.HostID).Replace('-', ' '))}");
}
}
}
@@ -281,7 +289,7 @@ namespace BinaryObjectScanner.Wrappers
case SabreTools.Models.AACS.RecordType.VerifyMediaKey:
var vmk = record as SabreTools.Models.AACS.VerifyMediaKeyRecord;
builder.AppendLine($" Ciphertext value: {BitConverter.ToString(vmk.CiphertextValue ?? new byte[0]).Replace('-', ' ')}");
builder.AppendLine($" Ciphertext value: {(vmk.CiphertextValue == null ? "[NULL]" : BitConverter.ToString(vmk.CiphertextValue).Replace('-', ' '))}");
break;
case SabreTools.Models.AACS.RecordType.Copyright:

View File

@@ -16,10 +16,18 @@ namespace BinaryObjectScanner.Wrappers
#region Pass-Through Properties
/// <inheritdoc cref="Models.BDPlus.SVM.Signature"/>
#if NET48
public string Signature => _model.Signature;
#else
public string? Signature => _model.Signature;
#endif
/// <inheritdoc cref="Models.BDPlus.SVM.Unknown1"/>
#if NET48
public byte[] Unknown1 => _model.Unknown1;
#else
public byte[]? Unknown1 => _model.Unknown1;
#endif
/// <inheritdoc cref="Models.BDPlus.SVM.Year"/>
public ushort Year => _model.Year;
@@ -31,13 +39,21 @@ namespace BinaryObjectScanner.Wrappers
public byte Day => _model.Day;
/// <inheritdoc cref="Models.BDPlus.SVM.Unknown2"/>
#if NET48
public byte[] Unknown2 => _model.Unknown2;
#else
public byte[]? Unknown2 => _model.Unknown2;
#endif
/// <inheritdoc cref="Models.BDPlus.SVM.Length"/>
public uint Length => _model.Length;
/// <inheritdoc cref="Models.BDPlus.SVM.Data"/>
#if NET48
public byte[] Data => _model.Data;
#else
public byte[]? Data => _model.Data;
#endif
#endregion
@@ -71,7 +87,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the archive</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A BD+ SVM wrapper on success, null on failure</returns>
#if NET48
public static BDPlusSVM Create(byte[] data, int offset)
#else
public static BDPlusSVM? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -91,7 +111,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the archive</param>
/// <returns>A BD+ SVM wrapper on success, null on failure</returns>
#if NET48
public static BDPlusSVM Create(Stream data)
#else
public static BDPlusSVM? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -138,13 +162,13 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine(" SVM Information:");
builder.AppendLine(" -------------------------");
builder.AppendLine($" Signature: {Signature}");
builder.AppendLine($" Unknown 1: {BitConverter.ToString(Unknown1).Replace('-', ' ')}");
builder.AppendLine($" Unknown 1: {(Unknown1 == null ? "[NULL]" : BitConverter.ToString(Unknown1).Replace('-', ' '))}");
builder.AppendLine($" Year: {Year} (0x{Year:X})");
builder.AppendLine($" Month: {Month} (0x{Month:X})");
builder.AppendLine($" Day: {Day} (0x{Day:X})");
builder.AppendLine($" Unknown 2: {BitConverter.ToString(Unknown2).Replace('-', ' ')}");
builder.AppendLine($" Unknown 2: {(Unknown2 == null ? "[NULL]" : BitConverter.ToString(Unknown2).Replace('-', ' '))}");
builder.AppendLine($" Length: {Length} (0x{Length:X})");
//builder.AppendLine($" Data: {BitConverter.ToString(Data ?? new byte[0]).Replace('-', ' ')}");
//builder.AppendLine($" Data: {(Data == null ? "[NULL]" : BitConverter.ToString(Data).Replace('-', ' '))}");
builder.AppendLine();
}

View File

@@ -19,7 +19,11 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.BFPK.Header.Magic"/>
#if NET48
public string Magic => _model.Header.Magic;
#else
public string? Magic => _model.Header.Magic;
#endif
/// <inheritdoc cref="Models.BFPK.Header.Version"/>
public int Version => _model.Header.Version;
@@ -35,7 +39,7 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public SabreTools.Models.BFPK.FileEntry[] FileTable => _model.Files;
#else
public SabreTools.Models.BFPK.FileEntry?[] FileTable => _model.Files;
public SabreTools.Models.BFPK.FileEntry?[]? FileTable => _model.Files;
#endif
#endregion
@@ -72,7 +76,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the archive</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A BFPK archive wrapper on success, null on failure</returns>
#if NET48
public static BFPK Create(byte[] data, int offset)
#else
public static BFPK? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -92,7 +100,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the archive</param>
/// <returns>A BFPK archive wrapper on success, null on failure</returns>
#if NET48
public static BFPK Create(Stream data)
#else
public static BFPK? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -155,6 +167,8 @@ namespace BinaryObjectScanner.Wrappers
// Get the file information
var file = FileTable[index];
if (file == null)
return false;
// Get the read index and length
int offset = file.Offset + 4;
@@ -173,11 +187,17 @@ namespace BinaryObjectScanner.Wrappers
Directory.CreateDirectory(outputDirectory);
// Create the output path
string filePath = Path.Combine(outputDirectory, file.Name);
string filePath = Path.Combine(outputDirectory, file.Name ?? $"file{index}");
using (FileStream fs = File.OpenWrite(filePath))
{
// Read the data block
#if NET48
byte[] data = ReadFromDataSource(offset, compressedSize);
#else
byte[]? data = ReadFromDataSource(offset, compressedSize);
#endif
if (data == null)
return false;
// If we have uncompressed data
if (compressedSize == file.UncompressedSize)

View File

@@ -30,7 +30,7 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public SabreTools.Models.BSP.Lump[] Lumps => _model.Lumps;
#else
public SabreTools.Models.BSP.Lump?[] Lumps => _model.Lumps;
public SabreTools.Models.BSP.Lump?[]? Lumps => _model.Lumps;
#endif
#endregion
@@ -41,7 +41,11 @@ namespace BinaryObjectScanner.Wrappers
public uint TextureCount => _model.TextureHeader.TextureCount;
/// <inheritdoc cref="Models.BSP.TextureHeader.Offsets"/>
#if NET48
public uint[] Offsets => _model.TextureHeader.Offsets;
#else
public uint[]? Offsets => _model.TextureHeader.Offsets;
#endif
#endregion
@@ -51,7 +55,7 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public SabreTools.Models.BSP.Texture[] Textures => _model.Textures;
#else
public SabreTools.Models.BSP.Texture?[] Textures => _model.Textures;
public SabreTools.Models.BSP.Texture?[]? Textures => _model.Textures;
#endif
#endregion
@@ -88,7 +92,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the BSP</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A BSP wrapper on success, null on failure</returns>
#if NET48
public static BSP Create(byte[] data, int offset)
#else
public static BSP? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -108,7 +116,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the BSP</param>
/// <returns>An BSP wrapper on success, null on failure</returns>
#if NET48
public static BSP Create(Stream data)
#else
public static BSP? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -326,7 +338,13 @@ namespace BinaryObjectScanner.Wrappers
filename = Path.Combine(outputDirectory, filename);
// Ensure the output directory is created
Directory.CreateDirectory(Path.GetDirectoryName(filename));
#if NET48
string directoryName = Path.GetDirectoryName(filename);
#else
string? directoryName = Path.GetDirectoryName(filename);
#endif
if (directoryName != null)
Directory.CreateDirectory(directoryName);
// Try to write the data
try
@@ -403,7 +421,13 @@ namespace BinaryObjectScanner.Wrappers
filename = Path.Combine(outputDirectory, filename);
// Ensure the output directory is created
Directory.CreateDirectory(Path.GetDirectoryName(filename));
#if NET48
string directoryName = Path.GetDirectoryName(filename);
#else
string? directoryName = Path.GetDirectoryName(filename);
#endif
if (directoryName != null)
Directory.CreateDirectory(directoryName);
// Try to write the data
try
@@ -427,7 +451,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="texture">Texture object to format</param>
/// <returns>Byte array representing the texture as a bitmap</returns>
#if NET48
private static byte[] CreateTextureData(SabreTools.Models.BSP.Texture texture)
#else
private static byte[]? CreateTextureData(SabreTools.Models.BSP.Texture texture)
#endif
{
// If there's no texture data
if (texture.TextureData == null || texture.TextureData.Length == 0)

View File

@@ -40,7 +40,11 @@ namespace BinaryObjectScanner.Wrappers
public ushort MiniSectorShift => _model.Header.MiniSectorShift;
/// <inheritdoc cref="Models.CFB.FileHeader.Reserved"/>
#if NET48
public byte[] Reserved => _model.Header.Reserved;
#else
public byte[]? Reserved => _model.Header.Reserved;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.NumberOfDirectorySectors"/>
public uint NumberOfDirectorySectors => _model.Header.NumberOfDirectorySectors;
@@ -73,7 +77,7 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public SabreTools.Models.CFB.SectorNumber[] DIFAT => _model.Header.DIFAT;
#else
public SabreTools.Models.CFB.SectorNumber?[] DIFAT => _model.Header.DIFAT;
public SabreTools.Models.CFB.SectorNumber?[]? DIFAT => _model.Header.DIFAT;
#endif
#endregion
@@ -84,7 +88,7 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public SabreTools.Models.CFB.SectorNumber[] FATSectorNumbers => _model.FATSectorNumbers;
#else
public SabreTools.Models.CFB.SectorNumber?[] FATSectorNumbers => _model.FATSectorNumbers;
public SabreTools.Models.CFB.SectorNumber?[]? FATSectorNumbers => _model.FATSectorNumbers;
#endif
#endregion
@@ -95,7 +99,7 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public SabreTools.Models.CFB.SectorNumber[] MiniFATSectorNumbers => _model.MiniFATSectorNumbers;
#else
public SabreTools.Models.CFB.SectorNumber?[] MiniFATSectorNumbers => _model.MiniFATSectorNumbers;
public SabreTools.Models.CFB.SectorNumber?[]? MiniFATSectorNumbers => _model.MiniFATSectorNumbers;
#endif
#endregion
@@ -106,7 +110,7 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public SabreTools.Models.CFB.SectorNumber[] DIFATSectorNumbers => _model.DIFATSectorNumbers;
#else
public SabreTools.Models.CFB.SectorNumber?[] DIFATSectorNumbers => _model.DIFATSectorNumbers;
public SabreTools.Models.CFB.SectorNumber?[]? DIFATSectorNumbers => _model.DIFATSectorNumbers;
#endif
#endregion
@@ -117,7 +121,7 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public SabreTools.Models.CFB.DirectoryEntry[] DirectoryEntries => _model.DirectoryEntries;
#else
public SabreTools.Models.CFB.DirectoryEntry?[] DirectoryEntries => _model.DirectoryEntries;
public SabreTools.Models.CFB.DirectoryEntry?[]? DirectoryEntries => _model.DirectoryEntries;
#endif
#endregion
@@ -168,7 +172,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the archive</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A Compound File Binary wrapper on success, null on failure</returns>
#if NET48
public static CFB Create(byte[] data, int offset)
#else
public static CFB? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -188,7 +196,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the archive</param>
/// <returns>A Compound File Binary wrapper on success, null on failure</returns>
#if NET48
public static CFB Create(Stream data)
#else
public static CFB? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -220,7 +232,7 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public List<SabreTools.Models.CFB.SectorNumber> GetFATSectorChain(SabreTools.Models.CFB.SectorNumber startingSector)
#else
public List<SabreTools.Models.CFB.SectorNumber?> GetFATSectorChain(SabreTools.Models.CFB.SectorNumber? startingSector)
public List<SabreTools.Models.CFB.SectorNumber?>? GetFATSectorChain(SabreTools.Models.CFB.SectorNumber? startingSector)
#endif
{
// If we have an invalid sector
@@ -257,7 +269,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="startingSector">Initial FAT sector</param>
/// <returns>Ordered list of sector numbers, null on error</returns>
#if NET48
public byte[] GetFATSectorChainData(SabreTools.Models.CFB.SectorNumber startingSector)
#else
public byte[]? GetFATSectorChainData(SabreTools.Models.CFB.SectorNumber startingSector)
#endif
{
// Get the sector chain first
var sectorChain = GetFATSectorChain(startingSector);
@@ -297,7 +313,11 @@ namespace BinaryObjectScanner.Wrappers
#endif
{
// If we have an invalid sector number
#if NET48
if (sector > SabreTools.Models.CFB.SectorNumber.MAXREGSECT)
#else
if (sector == null || sector > SabreTools.Models.CFB.SectorNumber.MAXREGSECT)
#endif
return -1;
// Convert based on the sector shift value
@@ -316,7 +336,7 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public List<SabreTools.Models.CFB.SectorNumber> GetMiniFATSectorChain(SabreTools.Models.CFB.SectorNumber startingSector)
#else
public List<SabreTools.Models.CFB.SectorNumber?> GetMiniFATSectorChain(SabreTools.Models.CFB.SectorNumber? startingSector)
public List<SabreTools.Models.CFB.SectorNumber?>? GetMiniFATSectorChain(SabreTools.Models.CFB.SectorNumber? startingSector)
#endif
{
// If we have an invalid sector
@@ -353,7 +373,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="startingSector">Initial Mini FAT sector</param>
/// <returns>Ordered list of sector numbers, null on error</returns>
#if NET48
public byte[] GetMiniFATSectorChainData(SabreTools.Models.CFB.SectorNumber startingSector)
#else
public byte[]? GetMiniFATSectorChainData(SabreTools.Models.CFB.SectorNumber startingSector)
#endif
{
// Get the sector chain first
var sectorChain = GetMiniFATSectorChain(startingSector);
@@ -393,7 +417,11 @@ namespace BinaryObjectScanner.Wrappers
#endif
{
// If we have an invalid sector number
#if NET48
if (sector > SabreTools.Models.CFB.SectorNumber.MAXREGSECT)
#else
if (sector == null || sector > SabreTools.Models.CFB.SectorNumber.MAXREGSECT)
#endif
return -1;
// Convert based on the sector shift value
@@ -437,7 +465,7 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Byte order: {ByteOrder} (0x{ByteOrder:X})");
builder.AppendLine($" Sector shift: {SectorShift} (0x{SectorShift:X}) => {SectorSize}");
builder.AppendLine($" Mini sector shift: {MiniSectorShift} (0x{MiniSectorShift:X}) => {MiniSectorSize}");
builder.AppendLine($" Reserved: {BitConverter.ToString(Reserved).Replace('-', ' ')}");
builder.AppendLine($" Reserved: {(Reserved == null ? "[NULL]" : BitConverter.ToString(Reserved).Replace('-', ' '))}");
builder.AppendLine($" Number of directory sectors: {NumberOfDirectorySectors} (0x{NumberOfDirectorySectors:X})");
builder.AppendLine($" Number of FAT sectors: {NumberOfFATSectors} (0x{NumberOfFATSectors:X})");
builder.AppendLine($" First directory sector location: {FirstDirectorySectorLocation} (0x{FirstDirectorySectorLocation:X})");

View File

@@ -42,7 +42,11 @@ namespace BinaryObjectScanner.Wrappers
public ulong ContentSize => _model.Header.ContentSize;
/// <inheritdoc cref="Models.N3DS.CIAHeader.ContentIndex"/>
#if NET48
public byte[] ContentIndex => _model.Header.ContentIndex;
#else
public byte[]? ContentIndex => _model.Header.ContentIndex;
#endif
#endregion
@@ -69,16 +73,32 @@ namespace BinaryObjectScanner.Wrappers
public byte T_PaddingSize => _model.Ticket.PaddingSize;
/// <inheritdoc cref="Models.N3DS.Ticket.Signature"/>
#if NET48
public byte[] T_Signature => _model.Ticket.Signature;
#else
public byte[]? T_Signature => _model.Ticket.Signature;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.Padding"/>
#if NET48
public byte[] T_Padding => _model.Ticket.Padding;
#else
public byte[]? T_Padding => _model.Ticket.Padding;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.Issuer"/>
#if NET48
public string T_Issuer => _model.Ticket.Issuer;
#else
public string? T_Issuer => _model.Ticket.Issuer;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.ECCPublicKey"/>
#if NET48
public byte[] T_ECCPublicKey => _model.Ticket.ECCPublicKey;
#else
public byte[]? T_ECCPublicKey => _model.Ticket.ECCPublicKey;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.Version"/>
public byte T_Version => _model.Ticket.Version;
@@ -90,7 +110,11 @@ namespace BinaryObjectScanner.Wrappers
public byte T_SignerCrlVersion => _model.Ticket.SignerCrlVersion;
/// <inheritdoc cref="Models.N3DS.Ticket.TitleKey"/>
#if NET48
public byte[] T_TitleKey => _model.Ticket.TitleKey;
#else
public byte[]? T_TitleKey => _model.Ticket.TitleKey;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved1"/>
public byte T_Reserved1 => _model.Ticket.Reserved1;
@@ -105,13 +129,21 @@ namespace BinaryObjectScanner.Wrappers
public ulong T_TitleID => _model.Ticket.TitleID;
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved2"/>
#if NET48
public byte[] T_Reserved2 => _model.Ticket.Reserved2;
#else
public byte[]? T_Reserved2 => _model.Ticket.Reserved2;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.TicketTitleVersion"/>
public ushort T_TicketTitleVersion => _model.Ticket.TicketTitleVersion;
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved3"/>
#if NET48
public byte[] T_Reserved3 => _model.Ticket.Reserved3;
#else
public byte[]? T_Reserved3 => _model.Ticket.Reserved3;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.LicenseType"/>
public byte T_LicenseType => _model.Ticket.LicenseType;
@@ -120,7 +152,11 @@ namespace BinaryObjectScanner.Wrappers
public byte T_CommonKeyYIndex => _model.Ticket.CommonKeyYIndex;
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved4"/>
#if NET48
public byte[] T_Reserved4 => _model.Ticket.Reserved4;
#else
public byte[]? T_Reserved4 => _model.Ticket.Reserved4;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.eShopAccountID"/>
public uint T_eShopAccountID => _model.Ticket.eShopAccountID;
@@ -132,16 +168,28 @@ namespace BinaryObjectScanner.Wrappers
public byte T_Audit => _model.Ticket.Audit;
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved6"/>
#if NET48
public byte[] T_Reserved6 => _model.Ticket.Reserved6;
#else
public byte[]? T_Reserved6 => _model.Ticket.Reserved6;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.Limits"/>
#if NET48
public uint[] T_Limits => _model.Ticket.Limits;
#else
public uint[]? T_Limits => _model.Ticket.Limits;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.ContentIndexSize"/>
public uint T_ContentIndexSize => _model.Ticket.ContentIndexSize;
/// <inheritdoc cref="Models.N3DS.Ticket.ContentIndex"/>
#if NET48
public byte[] T_ContentIndex => _model.Ticket.ContentIndex;
#else
public byte[]? T_ContentIndex => _model.Ticket.ContentIndex;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.CertificateChain"/>
#if NET48
@@ -164,13 +212,25 @@ namespace BinaryObjectScanner.Wrappers
public byte TMD_PaddingSize => _model.TMDFileData.PaddingSize;
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Signature"/>
#if NET48
public byte[] TMD_Signature => _model.TMDFileData.Signature;
#else
public byte[]? TMD_Signature => _model.TMDFileData.Signature;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Padding1"/>
#if NET48
public byte[] TMD_Padding1 => _model.TMDFileData.Padding1;
#else
public byte[]? TMD_Padding1 => _model.TMDFileData.Padding1;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Issuer"/>
#if NET48
public string TMD_Issuer => _model.TMDFileData.Issuer;
#else
public string? TMD_Issuer => _model.TMDFileData.Issuer;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Version"/>
public byte TMD_Version => _model.TMDFileData.Version;
@@ -203,13 +263,21 @@ namespace BinaryObjectScanner.Wrappers
public uint TMD_SRLPrivateSaveDataSize => _model.TMDFileData.SRLPrivateSaveDataSize;
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Reserved2"/>
#if NET48
public byte[] TMD_Reserved2 => _model.TMDFileData.Reserved2;
#else
public byte[]? TMD_Reserved2 => _model.TMDFileData.Reserved2;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SRLFlag"/>
public byte TMD_SRLFlag => _model.TMDFileData.SRLFlag;
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Reserved3"/>
#if NET48
public byte[] TMD_Reserved3 => _model.TMDFileData.Reserved3;
#else
public byte[]? TMD_Reserved3 => _model.TMDFileData.Reserved3;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.AccessRights"/>
public uint TMD_AccessRights => _model.TMDFileData.AccessRights;
@@ -224,10 +292,18 @@ namespace BinaryObjectScanner.Wrappers
public ushort TMD_BootContent => _model.TMDFileData.BootContent;
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Padding2"/>
#if NET48
public byte[] TMD_Padding2 => _model.TMDFileData.Padding2;
#else
public byte[]? TMD_Padding2 => _model.TMDFileData.Padding2;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SHA256HashContentInfoRecords"/>
#if NET48
public byte[] TMD_SHA256HashContentInfoRecords => _model.TMDFileData.SHA256HashContentInfoRecords;
#else
public byte[]? TMD_SHA256HashContentInfoRecords => _model.TMDFileData.SHA256HashContentInfoRecords;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.ContentInfoRecords"/>
#if NET48
@@ -266,19 +342,35 @@ namespace BinaryObjectScanner.Wrappers
#region Meta Data
/// <inheritdoc cref="Models.N3DS.MetaData.TitleIDDependencyList"/>
#if NET48
public byte[] MD_TitleIDDependencyList => _model.MetaData?.TitleIDDependencyList;
#else
public byte[]? MD_TitleIDDependencyList => _model.MetaData?.TitleIDDependencyList;
#endif
/// <inheritdoc cref="Models.N3DS.MetaData.Reserved1"/>
#if NET48
public byte[] MD_Reserved1 => _model.MetaData?.Reserved1;
#else
public byte[]? MD_Reserved1 => _model.MetaData?.Reserved1;
#endif
/// <inheritdoc cref="Models.N3DS.MetaData.CoreVersion"/>
public uint? MD_CoreVersion => _model.MetaData?.CoreVersion;
/// <inheritdoc cref="Models.N3DS.MetaData.Reserved2"/>
#if NET48
public byte[] MD_Reserved2 => _model.MetaData?.Reserved2;
#else
public byte[]? MD_Reserved2 => _model.MetaData?.Reserved2;
#endif
/// <inheritdoc cref="Models.N3DS.MetaData.IconData"/>
#if NET48
public byte[] MD_IconData => _model.MetaData?.IconData;
#else
public byte[]? MD_IconData => _model.MetaData?.IconData;
#endif
#endregion
@@ -314,7 +406,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the archive</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A CIA archive wrapper on success, null on failure</returns>
#if NET48
public static CIA Create(byte[] data, int offset)
#else
public static CIA? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -334,7 +430,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the archive</param>
/// <returns>A CIA archive wrapper on success, null on failure</returns>
#if NET48
public static CIA Create(Stream data)
#else
public static CIA? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -393,7 +493,7 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" TMD file size: {TMDFileSize} (0x{TMDFileSize:X})");
builder.AppendLine($" Meta size: {MetaSize} (0x{MetaSize:X})");
builder.AppendLine($" Content size: {ContentSize} (0x{ContentSize:X})");
builder.AppendLine($" Content index: {BitConverter.ToString(ContentIndex).Replace('-', ' ')}");
builder.AppendLine($" Content index: {(ContentIndex == null ? "[NULL]" : BitConverter.ToString(ContentIndex).Replace('-', ' '))}");
builder.AppendLine();
}
@@ -427,8 +527,8 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Signature type: {certificate.SignatureType} (0x{certificate.SignatureType:X})");
builder.AppendLine($" Signature size: {certificate.SignatureSize} (0x{certificate.SignatureSize:X})");
builder.AppendLine($" Padding size: {certificate.PaddingSize} (0x{certificate.PaddingSize:X})");
builder.AppendLine($" Signature: {BitConverter.ToString(certificate.Signature).Replace('-', ' ')}");
builder.AppendLine($" Padding: {BitConverter.ToString(certificate.Padding).Replace('-', ' ')}");
builder.AppendLine($" Signature: {(certificate.Signature == null ? "[NULL]" : BitConverter.ToString(certificate.Signature).Replace('-', ' '))}");
builder.AppendLine($" Padding: {(certificate.Padding == null ? "[NULL]" : BitConverter.ToString(certificate.Padding).Replace('-', ' '))}");
builder.AppendLine($" Issuer: {certificate.Issuer ?? "[NULL]"}");
builder.AppendLine($" Key type: {certificate.KeyType} (0x{certificate.KeyType:X})");
builder.AppendLine($" Name: {certificate.Name ?? "[NULL]"}");
@@ -437,13 +537,13 @@ namespace BinaryObjectScanner.Wrappers
{
case SabreTools.Models.N3DS.PublicKeyType.RSA_4096:
case SabreTools.Models.N3DS.PublicKeyType.RSA_2048:
builder.AppendLine($" Modulus: {BitConverter.ToString(certificate.RSAModulus).Replace('-', ' ')}");
builder.AppendLine($" Modulus: {(certificate.RSAModulus == null ? "[NULL]" : BitConverter.ToString(certificate.RSAModulus).Replace('-', ' '))}");
builder.AppendLine($" Public exponent: {certificate.RSAPublicExponent} (0x{certificate.RSAPublicExponent:X})");
builder.AppendLine($" Padding: {BitConverter.ToString(certificate.RSAPadding).Replace('-', ' ')}");
builder.AppendLine($" Padding: {(certificate.RSAPadding == null ? "[NULL]" : BitConverter.ToString(certificate.RSAPadding).Replace('-', ' '))}");
break;
case SabreTools.Models.N3DS.PublicKeyType.EllipticCurve:
builder.AppendLine($" Public key: {BitConverter.ToString(certificate.ECCPublicKey).Replace('-', ' ')}");
builder.AppendLine($" Padding: {BitConverter.ToString(certificate.ECCPadding).Replace('-', ' ')}");
builder.AppendLine($" Public key: {(certificate.ECCPublicKey == null ? "[NULL]" : BitConverter.ToString(certificate.ECCPublicKey).Replace('-', ' '))}");
builder.AppendLine($" Padding: {(certificate.ECCPadding == null ? "[NULL]" : BitConverter.ToString(certificate.ECCPadding).Replace('-', ' '))}");
break;
}
}
@@ -462,35 +562,35 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Signature type: {T_SignatureType} (0x{T_SignatureType:X})");
builder.AppendLine($" Signature size: {T_SignatureSize} (0x{T_SignatureSize:X})");
builder.AppendLine($" Padding size: {T_PaddingSize} (0x{T_PaddingSize:X})");
builder.AppendLine($" Signature: {BitConverter.ToString(T_Signature).Replace('-', ' ')}");
builder.AppendLine($" Padding: {BitConverter.ToString(T_Padding).Replace('-', ' ')}");
builder.AppendLine($" Signature: {(T_Signature == null ? "[NULL]" : BitConverter.ToString(T_Signature).Replace('-', ' '))}");
builder.AppendLine($" Padding: {(T_Padding == null ? "[NULL]" : BitConverter.ToString(T_Padding).Replace('-', ' '))}");
builder.AppendLine($" Issuer: {T_Issuer ?? "[NULL]"}");
builder.AppendLine($" ECC public key: {BitConverter.ToString(T_ECCPublicKey).Replace('-', ' ')}");
builder.AppendLine($" ECC public key: {(T_ECCPublicKey == null ? "[NULL]" : BitConverter.ToString(T_ECCPublicKey).Replace('-', ' '))}");
builder.AppendLine($" Version: {T_Version} (0x{T_Version:X})");
builder.AppendLine($" CaCrlVersion: {T_CaCrlVersion} (0x{T_CaCrlVersion:X})");
builder.AppendLine($" SignerCrlVersion: {T_SignerCrlVersion} (0x{T_SignerCrlVersion:X})");
builder.AppendLine($" Title key: {BitConverter.ToString(T_TitleKey).Replace('-', ' ')}");
builder.AppendLine($" Title key: {(T_TitleKey == null ? "[NULL]" : BitConverter.ToString(T_TitleKey).Replace('-', ' '))}");
builder.AppendLine($" Reserved 1: {T_Reserved1} (0x{T_Reserved1:X})");
builder.AppendLine($" Ticket ID: {T_TicketID} (0x{T_TicketID:X})");
builder.AppendLine($" Console ID: {T_ConsoleID} (0x{T_ConsoleID:X})");
builder.AppendLine($" Title ID {T_TitleID} (0x{T_TitleID:X})");
builder.AppendLine($" Reserved 2: {BitConverter.ToString(T_Reserved2).Replace('-', ' ')}");
builder.AppendLine($" Reserved 2: {(T_Reserved2 == null ? "[NULL]" : BitConverter.ToString(T_Reserved2).Replace('-', ' '))}");
builder.AppendLine($" Ticket title version: {T_TicketTitleVersion} (0x{T_TicketTitleVersion:X})");
builder.AppendLine($" Reserved 3: {BitConverter.ToString(T_Reserved3).Replace('-', ' ')}");
builder.AppendLine($" Reserved 3: {(T_Reserved3 == null ? "[NULL]" : BitConverter.ToString(T_Reserved3).Replace('-', ' '))}");
builder.AppendLine($" License type: {T_LicenseType} (0x{T_LicenseType:X})");
builder.AppendLine($" Common keY index: {T_CommonKeyYIndex} (0x{T_CommonKeyYIndex:X})");
builder.AppendLine($" Reserved 4: {BitConverter.ToString(T_Reserved4).Replace('-', ' ')}");
builder.AppendLine($" Reserved 4: {(T_Reserved4 == null ? "[NULL]" : BitConverter.ToString(T_Reserved4).Replace('-', ' '))}");
builder.AppendLine($" eShop Account ID?: {T_eShopAccountID} (0x{T_eShopAccountID:X})");
builder.AppendLine($" Reserved 5: {T_Reserved5} (0x{T_Reserved5:X})");
builder.AppendLine($" Audit: {T_Audit} (0x{T_Audit:X})");
builder.AppendLine($" Reserved 6: {BitConverter.ToString(T_Reserved6).Replace('-', ' ')}");
builder.AppendLine($" Reserved 6: {(T_Reserved6 == null ? "[NULL]" : BitConverter.ToString(T_Reserved6).Replace('-', ' '))}");
builder.AppendLine($" Limits:");
for (int i = 0; i < T_Limits.Length; i++)
{
builder.AppendLine($" Limit {i}: {T_Limits[i]} (0x{T_Limits[i]:X})");
}
builder.AppendLine($" Content index size: {T_ContentIndexSize} (0x{T_ContentIndexSize:X})");
builder.AppendLine($" Content index: {BitConverter.ToString(T_ContentIndex).Replace('-', ' ')}");
builder.AppendLine($" Content index: {(T_ContentIndex == null ? "[NULL]" : BitConverter.ToString(T_ContentIndex).Replace('-', ' '))}");
builder.AppendLine();
builder.AppendLine(" Ticket Certificate Chain Information:");
@@ -516,8 +616,8 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Signature type: {certificate.SignatureType} (0x{certificate.SignatureType:X})");
builder.AppendLine($" Signature size: {certificate.SignatureSize} (0x{certificate.SignatureSize:X})");
builder.AppendLine($" Padding size: {certificate.PaddingSize} (0x{certificate.PaddingSize:X})");
builder.AppendLine($" Signature: {BitConverter.ToString(certificate.Signature).Replace('-', ' ')}");
builder.AppendLine($" Padding: {BitConverter.ToString(certificate.Padding).Replace('-', ' ')}");
builder.AppendLine($" Signature: {(certificate.Signature == null ? "[NULL]" : BitConverter.ToString(certificate.Signature).Replace('-', ' '))}");
builder.AppendLine($" Padding: {(certificate.Padding == null ? "[NULL]" : BitConverter.ToString(certificate.Padding).Replace('-', ' '))}");
builder.AppendLine($" Issuer: {certificate.Issuer ?? "[NULL]"}");
builder.AppendLine($" Key type: {certificate.KeyType} (0x{certificate.KeyType:X})");
builder.AppendLine($" Name: {certificate.Name ?? "[NULL]"}");
@@ -526,13 +626,13 @@ namespace BinaryObjectScanner.Wrappers
{
case SabreTools.Models.N3DS.PublicKeyType.RSA_4096:
case SabreTools.Models.N3DS.PublicKeyType.RSA_2048:
builder.AppendLine($" Modulus: {BitConverter.ToString(certificate.RSAModulus).Replace('-', ' ')}");
builder.AppendLine($" Modulus: {(certificate.RSAModulus == null ? "[NULL]" : BitConverter.ToString(certificate.RSAModulus).Replace('-', ' '))}");
builder.AppendLine($" Public exponent: {certificate.RSAPublicExponent} (0x{certificate.RSAPublicExponent:X})");
builder.AppendLine($" Padding: {BitConverter.ToString(certificate.RSAPadding).Replace('-', ' ')}");
builder.AppendLine($" Padding: {(certificate.RSAPadding == null ? "[NULL]" : BitConverter.ToString(certificate.RSAPadding).Replace('-', ' '))}");
break;
case SabreTools.Models.N3DS.PublicKeyType.EllipticCurve:
builder.AppendLine($" Public key: {BitConverter.ToString(certificate.ECCPublicKey).Replace('-', ' ')}");
builder.AppendLine($" Padding: {BitConverter.ToString(certificate.ECCPadding).Replace('-', ' ')}");
builder.AppendLine($" Public key: {(certificate.ECCPublicKey == null ? "[NULL]" : BitConverter.ToString(certificate.ECCPublicKey).Replace('-', ' '))}");
builder.AppendLine($" Padding: {(certificate.ECCPadding == null ? "[NULL]" : BitConverter.ToString(certificate.ECCPadding).Replace('-', ' '))}");
break;
}
}
@@ -551,8 +651,8 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Signature type: {TMD_SignatureType} (0x{TMD_SignatureType:X})");
builder.AppendLine($" Signature size: {TMD_SignatureSize} (0x{TMD_SignatureSize:X})");
builder.AppendLine($" Padding size: {TMD_PaddingSize} (0x{TMD_PaddingSize:X})");
builder.AppendLine($" Signature: {BitConverter.ToString(TMD_Signature).Replace('-', ' ')}");
builder.AppendLine($" Padding 1: {BitConverter.ToString(TMD_Padding1).Replace('-', ' ')}");
builder.AppendLine($" Signature: {(TMD_Signature == null ? "[NULL]" : BitConverter.ToString(TMD_Signature).Replace('-', ' '))}");
builder.AppendLine($" Padding 1: {(TMD_Padding1 == null ? "[NULL]" : BitConverter.ToString(TMD_Padding1).Replace('-', ' '))}");
builder.AppendLine($" Issuer: {TMD_Issuer ?? "[NULL]"}");
builder.AppendLine($" Version: {TMD_Version} (0x{TMD_Version:X})");
builder.AppendLine($" CaCrlVersion: {TMD_CaCrlVersion} (0x{TMD_CaCrlVersion:X})");
@@ -564,15 +664,15 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Group ID: {TMD_GroupID} (0x{TMD_GroupID:X})");
builder.AppendLine($" Save data size: {TMD_SaveDataSize} (0x{TMD_SaveDataSize:X})");
builder.AppendLine($" SRL private save data size: {TMD_SRLPrivateSaveDataSize} (0x{TMD_SRLPrivateSaveDataSize:X})");
builder.AppendLine($" Reserved 2: {BitConverter.ToString(TMD_Reserved2).Replace('-', ' ')}");
builder.AppendLine($" Reserved 2: {(TMD_Reserved2 == null ? "[NULL]" : BitConverter.ToString(TMD_Reserved2).Replace('-', ' '))}");
builder.AppendLine($" SRL flag: {TMD_SRLFlag} (0x{TMD_SRLFlag:X})");
builder.AppendLine($" Reserved 3: {BitConverter.ToString(TMD_Reserved3).Replace('-', ' ')}");
builder.AppendLine($" Reserved 3: {(TMD_Reserved3 == null ? "[NULL]" : BitConverter.ToString(TMD_Reserved3).Replace('-', ' '))}");
builder.AppendLine($" Access rights: {TMD_AccessRights} (0x{TMD_AccessRights:X})");
builder.AppendLine($" Title version: {TMD_TitleVersion} (0x{TMD_TitleVersion:X})");
builder.AppendLine($" Content count: {TMD_ContentCount} (0x{TMD_ContentCount:X})");
builder.AppendLine($" Boot content: {TMD_BootContent} (0x{TMD_BootContent:X})");
builder.AppendLine($" Padding 2: {BitConverter.ToString(TMD_Padding2).Replace('-', ' ')}");
builder.AppendLine($" SHA-256 hash of the content info records: {BitConverter.ToString(TMD_SHA256HashContentInfoRecords).Replace('-', ' ')}");
builder.AppendLine($" Padding 2: {(TMD_Padding2 == null ? "[NULL]" : BitConverter.ToString(TMD_Padding2).Replace('-', ' '))}");
builder.AppendLine($" SHA-256 hash of the content info records: {(TMD_SHA256HashContentInfoRecords == null ? "[NULL]" : BitConverter.ToString(TMD_SHA256HashContentInfoRecords).Replace('-', ' '))}");
builder.AppendLine();
builder.AppendLine(" Ticket Content Info Records Information:");
@@ -589,7 +689,7 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Content Info Record {i}");
builder.AppendLine($" Content index offset: {contentInfoRecord.ContentIndexOffset} (0x{contentInfoRecord.ContentIndexOffset:X})");
builder.AppendLine($" Content command count: {contentInfoRecord.ContentCommandCount} (0x{contentInfoRecord.ContentCommandCount:X})");
builder.AppendLine($" SHA-256 hash of the next {contentInfoRecord.ContentCommandCount} records not hashed: {BitConverter.ToString(contentInfoRecord.UnhashedContentRecordsSHA256Hash).Replace('-', ' ')}");
builder.AppendLine($" SHA-256 hash of the next {contentInfoRecord.ContentCommandCount} records not hashed: {(contentInfoRecord.UnhashedContentRecordsSHA256Hash == null ? "[NULL]" : BitConverter.ToString(contentInfoRecord.UnhashedContentRecordsSHA256Hash).Replace('-', ' '))}");
}
}
builder.AppendLine();
@@ -610,7 +710,7 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Content index: {contentChunkRecord.ContentIndex} (0x{contentChunkRecord.ContentIndex:X})");
builder.AppendLine($" Content type: {contentChunkRecord.ContentType} (0x{contentChunkRecord.ContentType:X})");
builder.AppendLine($" Content size: {contentChunkRecord.ContentSize} (0x{contentChunkRecord.ContentSize:X})");
builder.AppendLine($" SHA-256 hash: {BitConverter.ToString(contentChunkRecord.SHA256Hash).Replace('-', ' ')}");
builder.AppendLine($" SHA-256 hash: {(contentChunkRecord.SHA256Hash == null ? "[NULL]" : BitConverter.ToString(contentChunkRecord.SHA256Hash).Replace('-', ' '))}");
}
}
builder.AppendLine();
@@ -638,8 +738,8 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Signature type: {certificate.SignatureType} (0x{certificate.SignatureType:X})");
builder.AppendLine($" Signature size: {certificate.SignatureSize} (0x{certificate.SignatureSize:X})");
builder.AppendLine($" Padding size: {certificate.PaddingSize} (0x{certificate.PaddingSize:X})");
builder.AppendLine($" Signature: {BitConverter.ToString(certificate.Signature).Replace('-', ' ')}");
builder.AppendLine($" Padding: {BitConverter.ToString(certificate.Padding).Replace('-', ' ')}");
builder.AppendLine($" Signature: {(certificate.Signature == null ? "[NULL]" : BitConverter.ToString(certificate.Signature).Replace('-', ' '))}");
builder.AppendLine($" Padding: {(certificate.Padding == null ? "[NULL]" : BitConverter.ToString(certificate.Padding).Replace('-', ' '))}");
builder.AppendLine($" Issuer: {certificate.Issuer ?? "[NULL]"}");
builder.AppendLine($" Key type: {certificate.KeyType} (0x{certificate.KeyType:X})");
builder.AppendLine($" Name: {certificate.Name ?? "[NULL]"}");
@@ -648,13 +748,13 @@ namespace BinaryObjectScanner.Wrappers
{
case SabreTools.Models.N3DS.PublicKeyType.RSA_4096:
case SabreTools.Models.N3DS.PublicKeyType.RSA_2048:
builder.AppendLine($" Modulus: {BitConverter.ToString(certificate.RSAModulus).Replace('-', ' ')}");
builder.AppendLine($" Modulus: {(certificate.RSAModulus == null ? "[NULL]" : BitConverter.ToString(certificate.RSAModulus).Replace('-', ' '))}");
builder.AppendLine($" Public exponent: {certificate.RSAPublicExponent} (0x{certificate.RSAPublicExponent:X})");
builder.AppendLine($" Padding: {BitConverter.ToString(certificate.RSAPadding).Replace('-', ' ')}");
builder.AppendLine($" Padding: {(certificate.RSAPadding == null ? "[NULL]" : BitConverter.ToString(certificate.RSAPadding).Replace('-', ' '))}");
break;
case SabreTools.Models.N3DS.PublicKeyType.EllipticCurve:
builder.AppendLine($" Public key: {BitConverter.ToString(certificate.ECCPublicKey).Replace('-', ' ')}");
builder.AppendLine($" Padding: {BitConverter.ToString(certificate.ECCPadding).Replace('-', ' ')}");
builder.AppendLine($" Public key: {(certificate.ECCPublicKey == null ? "[NULL]" : BitConverter.ToString(certificate.ECCPublicKey).Replace('-', ' '))}");
builder.AppendLine($" Padding: {(certificate.ECCPadding == null ? "[NULL]" : BitConverter.ToString(certificate.ECCPadding).Replace('-', ' '))}");
break;
}
}
@@ -690,20 +790,20 @@ namespace BinaryObjectScanner.Wrappers
}
else
{
builder.AppendLine($" RSA-2048 SHA-256 signature: {BitConverter.ToString(partitionHeader.RSA2048Signature).Replace('-', ' ')}");
builder.AppendLine($" RSA-2048 SHA-256 signature: {(partitionHeader.RSA2048Signature == null ? "[NULL]" : BitConverter.ToString(partitionHeader.RSA2048Signature).Replace('-', ' '))}");
builder.AppendLine($" Magic ID: {partitionHeader.MagicID} (0x{partitionHeader.MagicID:X})");
builder.AppendLine($" Content size in media units: {partitionHeader.ContentSizeInMediaUnits} (0x{partitionHeader.ContentSizeInMediaUnits:X})");
builder.AppendLine($" Partition ID: {partitionHeader.PartitionId} (0x{partitionHeader.PartitionId:X})");
builder.AppendLine($" Maker code: {partitionHeader.MakerCode} (0x{partitionHeader.MakerCode:X})");
builder.AppendLine($" Version: {partitionHeader.Version} (0x{partitionHeader.Version:X})");
builder.AppendLine($" Verification hash: {partitionHeader.VerificationHash} (0x{partitionHeader.VerificationHash:X})");
builder.AppendLine($" Program ID: {BitConverter.ToString(partitionHeader.ProgramId).Replace('-', ' ')}");
builder.AppendLine($" Reserved 1: {BitConverter.ToString(partitionHeader.Reserved1).Replace('-', ' ')}");
builder.AppendLine($" Logo region SHA-256 hash: {BitConverter.ToString(partitionHeader.LogoRegionHash).Replace('-', ' ')}");
builder.AppendLine($" Program ID: {(partitionHeader.ProgramId == null ? "[NULL]" : BitConverter.ToString(partitionHeader.ProgramId).Replace('-', ' '))}");
builder.AppendLine($" Reserved 1: {(partitionHeader.Reserved1 == null ? "[NULL]" : BitConverter.ToString(partitionHeader.Reserved1).Replace('-', ' '))}");
builder.AppendLine($" Logo region SHA-256 hash: {(partitionHeader.LogoRegionHash == null ? "[NULL]" : BitConverter.ToString(partitionHeader.LogoRegionHash).Replace('-', ' '))}");
builder.AppendLine($" Product code: {partitionHeader.ProductCode} (0x{partitionHeader.ProductCode:X})");
builder.AppendLine($" Extended header SHA-256 hash: {BitConverter.ToString(partitionHeader.ExtendedHeaderHash).Replace('-', ' ')}");
builder.AppendLine($" Extended header SHA-256 hash: {(partitionHeader.ExtendedHeaderHash == null ? "[NULL]" : BitConverter.ToString(partitionHeader.ExtendedHeaderHash).Replace('-', ' '))}");
builder.AppendLine($" Extended header size in bytes: {partitionHeader.ExtendedHeaderSizeInBytes} (0x{partitionHeader.ExtendedHeaderSizeInBytes:X})");
builder.AppendLine($" Reserved 2: {BitConverter.ToString(partitionHeader.Reserved2).Replace('-', ' ')}");
builder.AppendLine($" Reserved 2: {(partitionHeader.Reserved2 == null ? "[NULL]" : BitConverter.ToString(partitionHeader.Reserved2).Replace('-', ' '))}");
builder.AppendLine(" Flags:");
builder.AppendLine($" Reserved 0: {partitionHeader.Flags.Reserved0} (0x{partitionHeader.Flags.Reserved0:X})");
builder.AppendLine($" Reserved 1: {partitionHeader.Flags.Reserved1} (0x{partitionHeader.Flags.Reserved1:X})");
@@ -720,13 +820,13 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" ExeFS offset, in media units: {partitionHeader.ExeFSOffsetInMediaUnits} (0x{partitionHeader.ExeFSOffsetInMediaUnits:X})");
builder.AppendLine($" ExeFS size, in media units: {partitionHeader.ExeFSSizeInMediaUnits} (0x{partitionHeader.ExeFSSizeInMediaUnits:X})");
builder.AppendLine($" ExeFS hash region size, in media units: {partitionHeader.ExeFSHashRegionSizeInMediaUnits} (0x{partitionHeader.ExeFSHashRegionSizeInMediaUnits:X})");
builder.AppendLine($" Reserved 3: {BitConverter.ToString(partitionHeader.Reserved3).Replace('-', ' ')}");
builder.AppendLine($" Reserved 3: {(partitionHeader.Reserved3 == null ? "[NULL]" : BitConverter.ToString(partitionHeader.Reserved3).Replace('-', ' '))}");
builder.AppendLine($" RomFS offset, in media units: {partitionHeader.RomFSOffsetInMediaUnits} (0x{partitionHeader.RomFSOffsetInMediaUnits:X})");
builder.AppendLine($" RomFS size, in media units: {partitionHeader.RomFSSizeInMediaUnits} (0x{partitionHeader.RomFSSizeInMediaUnits:X})");
builder.AppendLine($" RomFS hash region size, in media units: {partitionHeader.RomFSHashRegionSizeInMediaUnits} (0x{partitionHeader.RomFSHashRegionSizeInMediaUnits:X})");
builder.AppendLine($" Reserved 4: {BitConverter.ToString(partitionHeader.Reserved4).Replace('-', ' ')}");
builder.AppendLine($" ExeFS superblock SHA-256 hash: {BitConverter.ToString(partitionHeader.ExeFSSuperblockHash).Replace('-', ' ')}");
builder.AppendLine($" RomFS superblock SHA-256 hash: {BitConverter.ToString(partitionHeader.RomFSSuperblockHash).Replace('-', ' ')}");
builder.AppendLine($" Reserved 4: {(partitionHeader.Reserved4 == null ? "[NULL]" : BitConverter.ToString(partitionHeader.Reserved4).Replace('-', ' '))}");
builder.AppendLine($" ExeFS superblock SHA-256 hash: {(partitionHeader.ExeFSSuperblockHash == null ? "[NULL]" : BitConverter.ToString(partitionHeader.ExeFSSuperblockHash).Replace('-', ' '))}");
builder.AppendLine($" RomFS superblock SHA-256 hash: {(partitionHeader.RomFSSuperblockHash == null ? "[NULL]" : BitConverter.ToString(partitionHeader.RomFSSuperblockHash).Replace('-', ' '))}");
}
}
}
@@ -747,11 +847,11 @@ namespace BinaryObjectScanner.Wrappers
}
else
{
builder.AppendLine(value: $" Title ID dependency list: {BitConverter.ToString(MD_TitleIDDependencyList).Replace('-', ' ')}");
builder.AppendLine($" Reserved 1: {BitConverter.ToString(MD_Reserved1).Replace('-', ' ')}");
builder.AppendLine(value: $" Title ID dependency list: {(MD_TitleIDDependencyList == null ? "[NULL]" : BitConverter.ToString(MD_TitleIDDependencyList).Replace('-', ' '))}");
builder.AppendLine($" Reserved 1: {(MD_Reserved1 == null ? "[NULL]" : BitConverter.ToString(MD_Reserved1).Replace('-', ' '))}");
builder.AppendLine($" Core version: {MD_CoreVersion} (0x{MD_CoreVersion:X})");
builder.AppendLine($" Reserved 2: {BitConverter.ToString(MD_Reserved2).Replace('-', ' ')}");
builder.AppendLine($" Icon data: {BitConverter.ToString(MD_IconData).Replace('-', ' ')}");
builder.AppendLine($" Reserved 2: {(MD_Reserved2 == null ? "[NULL]" : BitConverter.ToString(MD_Reserved2).Replace('-', ' '))}");
builder.AppendLine($" Icon data: {(MD_IconData == null ? "[NULL]" : BitConverter.ToString(MD_IconData).Replace('-', ' '))}");
}
builder.AppendLine();
}

View File

@@ -385,15 +385,19 @@ namespace BinaryObjectScanner.Wrappers
Size = directoryEntry.ItemSize,
Encrypted = directoryEntry.DirectoryFlags.HasFlag(SabreTools.Models.GCF.HL_GCF_FLAG.HL_GCF_FLAG_ENCRYPTED),
};
var pathParts = new List<string> { directoryEntry.Name };
var pathParts = new List<string> { directoryEntry.Name ?? string.Empty };
#if NET48
var blockEntries = new List<SabreTools.Models.GCF.BlockEntry>();
#else
var blockEntries = new List<SabreTools.Models.GCF.BlockEntry?>();
#endif
// Traverse the parent tree
uint index = directoryEntry.ParentIndex;
while (index != 0xFFFFFFFF)
{
var parentDirectoryEntry = DirectoryEntries[index];
pathParts.Add(parentDirectoryEntry.Name);
pathParts.Add(parentDirectoryEntry.Name ?? string.Empty);
index = parentDirectoryEntry.ParentIndex;
}
@@ -493,7 +497,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the GCF</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>An GCF wrapper on success, null on failure</returns>
#if NET48
public static GCF Create(byte[] data, int offset)
#else
public static GCF? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -513,7 +521,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the GCF</param>
/// <returns>An GCF wrapper on success, null on failure</returns>
#if NET48
public static GCF Create(Stream data)
#else
public static GCF? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -1113,10 +1125,16 @@ namespace BinaryObjectScanner.Wrappers
return false;
// Create the full output path
filename = Path.Combine(outputDirectory, filename);
filename = Path.Combine(outputDirectory, filename ?? $"file{index}");
// Ensure the output directory is created
Directory.CreateDirectory(Path.GetDirectoryName(filename));
#if NET48
string directoryName = Path.GetDirectoryName(filename);
#else
string? directoryName = Path.GetDirectoryName(filename);
#endif
if (directoryName != null)
Directory.CreateDirectory(directoryName);
// Try to write the data
try
@@ -1130,7 +1148,14 @@ namespace BinaryObjectScanner.Wrappers
{
int readSize = (int)Math.Min(DBH_BlockSize, fileSize);
#if NET48
byte[] data = ReadFromDataSource((int)dataBlockOffsets[i], readSize);
#else
byte[]? data = ReadFromDataSource((int)dataBlockOffsets[i], readSize);
#endif
if (data == null)
return false;
fs.Write(data, 0, data.Length);
}
}
@@ -1155,7 +1180,11 @@ namespace BinaryObjectScanner.Wrappers
/// <summary>
/// Full item path
/// </summary>
#if NET48
public string Path;
#else
public string? Path;
#endif
/// <summary>
/// File size
@@ -1170,7 +1199,11 @@ namespace BinaryObjectScanner.Wrappers
/// <summary>
/// Array of block entries
/// </summary>
#if NET48
public SabreTools.Models.GCF.BlockEntry[] BlockEntries;
#else
public SabreTools.Models.GCF.BlockEntry?[]? BlockEntries;
#endif
}
#endregion

View File

@@ -19,7 +19,11 @@ namespace BinaryObjectScanner.Wrappers
#region Common Header
/// <inheritdoc cref="Models.InstallShieldCabinet.CommonHeader.Signature"/>
#if NET48
public string Signature => _model.CommonHeader.Signature;
#else
public string? Signature => _model.CommonHeader.Signature;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.CommonHeader.Version"/>
public uint Version => _model.CommonHeader.Version;
@@ -93,7 +97,11 @@ namespace BinaryObjectScanner.Wrappers
public uint StringsOffset => _model.Descriptor.StringsOffset;
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.Reserved0"/>
#if NET48
public byte[] Reserved0 => _model.Descriptor.Reserved0;
#else
public byte[]? Reserved0 => _model.Descriptor.Reserved0;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.ComponentListOffset"/>
public uint ComponentListOffset => _model.Descriptor.ComponentListOffset;
@@ -102,7 +110,11 @@ namespace BinaryObjectScanner.Wrappers
public uint FileTableOffset => _model.Descriptor.FileTableOffset;
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.Reserved1"/>
#if NET48
public byte[] Reserved1 => _model.Descriptor.Reserved1;
#else
public byte[]? Reserved1 => _model.Descriptor.Reserved1;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.FileTableSize"/>
public uint FileTableSize => _model.Descriptor.FileTableSize;
@@ -114,13 +126,25 @@ namespace BinaryObjectScanner.Wrappers
public ushort DirectoryCount => _model.Descriptor.DirectoryCount;
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.Reserved2"/>
#if NET48
public byte[] Reserved2 => _model.Descriptor.Reserved2;
#else
public byte[]? Reserved2 => _model.Descriptor.Reserved2;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.Reserved3"/>
#if NET48
public byte[] Reserved3 => _model.Descriptor.Reserved3;
#else
public byte[]? Reserved3 => _model.Descriptor.Reserved3;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.Reserved4"/>
#if NET48
public byte[] Reserved4 => _model.Descriptor.Reserved4;
#else
public byte[]? Reserved4 => _model.Descriptor.Reserved4;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.FileCount"/>
public uint FileCount => _model.Descriptor.FileCount;
@@ -135,16 +159,32 @@ namespace BinaryObjectScanner.Wrappers
public uint ComponentTableOffset => _model.Descriptor.ComponentTableOffset;
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.Reserved5"/>
#if NET48
public byte[] Reserved5 => _model.Descriptor.Reserved5;
#else
public byte[]? Reserved5 => _model.Descriptor.Reserved5;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.Reserved6"/>
#if NET48
public byte[] Reserved6 => _model.Descriptor.Reserved6;
#else
public byte[]? Reserved6 => _model.Descriptor.Reserved6;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.FileGroupOffsets"/>
#if NET48
public uint[] D_FileGroupOffsets => _model.Descriptor.FileGroupOffsets;
#else
public uint[]? D_FileGroupOffsets => _model.Descriptor.FileGroupOffsets;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.ComponentOffsets"/>
#if NET48
public uint[] D_ComponentOffsets => _model.Descriptor.ComponentOffsets;
#else
public uint[]? D_ComponentOffsets => _model.Descriptor.ComponentOffsets;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.SetupTypesOffset"/>
public uint SetupTypesOffset => _model.Descriptor.SetupTypesOffset;
@@ -153,24 +193,40 @@ namespace BinaryObjectScanner.Wrappers
public uint SetupTableOffset => _model.Descriptor.SetupTableOffset;
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.Reserved7"/>
#if NET48
public byte[] Reserved7 => _model.Descriptor.Reserved7;
#else
public byte[]? Reserved7 => _model.Descriptor.Reserved7;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.Reserved8"/>
#if NET48
public byte[] Reserved8 => _model.Descriptor.Reserved8;
#else
public byte[]? Reserved8 => _model.Descriptor.Reserved8;
#endif
#endregion
#region File Descriptor Offsets
/// <inheritdoc cref="Models.InstallShieldCabinet.Cabinet.FileDescriptorOffsets"/>
#if NET48
public uint[] FileDescriptorOffsets => _model.FileDescriptorOffsets;
#else
public uint[]? FileDescriptorOffsets => _model.FileDescriptorOffsets;
#endif
#endregion
#region Directory Descriptors
/// <inheritdoc cref="Models.InstallShieldCabinet.Cabinet.DirectoryNames"/>
#if NET48
public string[] DirectoryNames => _model.DirectoryNames;
#else
public string[]? DirectoryNames => _model.DirectoryNames;
#endif
#endregion
@@ -288,7 +344,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the cabinet</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A cabinet wrapper on success, null on failure</returns>
#if NET48
public static InstallShieldCabinet Create(byte[] data, int offset)
#else
public static InstallShieldCabinet? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -308,7 +368,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the cabinet</param>
/// <returns>A cabinet wrapper on success, null on failure</returns>
#if NET48
public static InstallShieldCabinet Create(Stream data)
#else
public static InstallShieldCabinet? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -430,22 +494,22 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine(" Descriptor Information:");
builder.AppendLine(" -------------------------");
builder.AppendLine($" Strings offset: {StringsOffset} (0x{StringsOffset:X})");
builder.AppendLine($" Reserved 0: {BitConverter.ToString(Reserved0).Replace('-', ' ')}");
builder.AppendLine($" Reserved 0: {(Reserved0 == null ? "[NULL]" : BitConverter.ToString(Reserved0).Replace('-', ' '))}");
builder.AppendLine($" Component list offset: {ComponentListOffset} (0x{ComponentListOffset:X})");
builder.AppendLine($" File table offset: {FileTableOffset} (0x{FileTableOffset:X})");
builder.AppendLine($" Reserved 1: {BitConverter.ToString(Reserved1).Replace('-', ' ')}");
builder.AppendLine($" Reserved 1: {(Reserved1 == null ? "[NULL]" : BitConverter.ToString(Reserved1).Replace('-', ' '))}");
builder.AppendLine($" File table size: {FileTableSize} (0x{FileTableSize:X})");
builder.AppendLine($" File table size 2: {FileTableSize2} (0x{FileTableSize2:X})");
builder.AppendLine($" Directory count: {DirectoryCount} (0x{DirectoryCount:X})");
builder.AppendLine($" Reserved 2: {BitConverter.ToString(Reserved2).Replace('-', ' ')}");
builder.AppendLine($" Reserved 3: {BitConverter.ToString(Reserved3).Replace('-', ' ')}");
builder.AppendLine($" Reserved 4: {BitConverter.ToString(Reserved4).Replace('-', ' ')}");
builder.AppendLine($" Reserved 2: {(Reserved2 == null ? "[NULL]" : BitConverter.ToString(Reserved2).Replace('-', ' '))}");
builder.AppendLine($" Reserved 3: {(Reserved3 == null ? "[NULL]" : BitConverter.ToString(Reserved3).Replace('-', ' '))}");
builder.AppendLine($" Reserved 4: {(Reserved4 == null ? "[NULL]" : BitConverter.ToString(Reserved4).Replace('-', ' '))}");
builder.AppendLine($" File count: {FileCount} (0x{FileCount:X})");
builder.AppendLine($" File table offset 2: {FileTableOffset2} (0x{FileTableOffset2:X})");
builder.AppendLine($" Component table info count: {ComponentTableInfoCount} (0x{ComponentTableInfoCount:X})");
builder.AppendLine($" Component table offset: {ComponentTableOffset} (0x{ComponentTableOffset:X})");
builder.AppendLine($" Reserved 5: {BitConverter.ToString(Reserved5).Replace('-', ' ')}");
builder.AppendLine($" Reserved 6: {BitConverter.ToString(Reserved6).Replace('-', ' ')}");
builder.AppendLine($" Reserved 5: {(Reserved5 == null ? "[NULL]" : BitConverter.ToString(Reserved5).Replace('-', ' '))}");
builder.AppendLine($" Reserved 6: {(Reserved6 == null ? "[NULL]" : BitConverter.ToString(Reserved6).Replace('-', ' '))}");
builder.AppendLine();
builder.AppendLine($" File group offsets:");
@@ -480,8 +544,8 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Setup types offset: {SetupTypesOffset} (0x{SetupTypesOffset:X})");
builder.AppendLine($" Setup table offset: {SetupTableOffset} (0x{SetupTableOffset:X})");
builder.AppendLine($" Reserved 7: {BitConverter.ToString(Reserved7).Replace('-', ' ')}");
builder.AppendLine($" Reserved 8: {BitConverter.ToString(Reserved8).Replace('-', ' ')}");
builder.AppendLine($" Reserved 7: {(Reserved7 == null ? "[NULL]" : BitConverter.ToString(Reserved7).Replace('-', ' '))}");
builder.AppendLine($" Reserved 8: {(Reserved8 == null ? "[NULL]" : BitConverter.ToString(Reserved8).Replace('-', ' '))}");
builder.AppendLine();
}
@@ -554,7 +618,7 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Expanded size: {fileDescriptor.ExpandedSize} (0x{fileDescriptor.ExpandedSize:X})");
builder.AppendLine($" Compressed size: {fileDescriptor.CompressedSize} (0x{fileDescriptor.CompressedSize:X})");
builder.AppendLine($" Data offset: {fileDescriptor.DataOffset} (0x{fileDescriptor.DataOffset:X})");
builder.AppendLine($" MD5: {BitConverter.ToString(fileDescriptor.MD5 ?? new byte[0]).Replace('-', ' ')}");
builder.AppendLine($" MD5: {(fileDescriptor.MD5 == null ? "[NULL]" : BitConverter.ToString(fileDescriptor.MD5).Replace('-', ' '))}");
builder.AppendLine($" Volume: {fileDescriptor.Volume} (0x{fileDescriptor.Volume:X})");
builder.AppendLine($" Link previous: {fileDescriptor.LinkPrevious} (0x{fileDescriptor.LinkPrevious:X})");
builder.AppendLine($" Link next: {fileDescriptor.LinkNext} (0x{fileDescriptor.LinkNext:X})");
@@ -627,10 +691,10 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Name offset: {fileGroup.NameOffset} (0x{fileGroup.NameOffset:X})");
builder.AppendLine($" Name: {fileGroup.Name ?? "[NULL]"}");
builder.AppendLine($" Expanded size: {fileGroup.ExpandedSize} (0x{fileGroup.ExpandedSize:X})");
builder.AppendLine($" Reserved 0: {BitConverter.ToString(fileGroup.Reserved0).Replace('-', ' ')}");
builder.AppendLine($" Reserved 0: {(fileGroup.Reserved0 == null ? "[NULL]" : BitConverter.ToString(fileGroup.Reserved0).Replace('-', ' '))}");
builder.AppendLine($" Compressed size: {fileGroup.CompressedSize} (0x{fileGroup.CompressedSize:X})");
builder.AppendLine($" Reserved 1: {BitConverter.ToString(fileGroup.Reserved1).Replace('-', ' ')}");
builder.AppendLine($" Reserved 2: {BitConverter.ToString(fileGroup.Reserved2).Replace('-', ' ')}");
builder.AppendLine($" Reserved 1: {(fileGroup.Reserved1 == null ? "[NULL]" : BitConverter.ToString(fileGroup.Reserved1).Replace('-', ' '))}");
builder.AppendLine($" Reserved 2: {(fileGroup.Reserved2 == null ? "[NULL]" : BitConverter.ToString(fileGroup.Reserved2).Replace('-', ' '))}");
builder.AppendLine($" Attribute 1: {fileGroup.Attribute1} (0x{fileGroup.Attribute1:X})");
builder.AppendLine($" Attribute 2: {fileGroup.Attribute2} (0x{fileGroup.Attribute2:X})");
builder.AppendLine($" First file: {fileGroup.FirstFile} (0x{fileGroup.FirstFile:X})");
@@ -643,11 +707,11 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Misc. offset: {fileGroup.MiscOffset} (0x{fileGroup.MiscOffset:X})");
builder.AppendLine($" Var 2 offset: {fileGroup.Var2Offset} (0x{fileGroup.Var2Offset:X})");
builder.AppendLine($" Target directory offset: {fileGroup.TargetDirectoryOffset} (0x{fileGroup.TargetDirectoryOffset:X})");
builder.AppendLine($" Reserved 3: {BitConverter.ToString(fileGroup.Reserved3).Replace('-', ' ')}");
builder.AppendLine($" Reserved 4: {BitConverter.ToString(fileGroup.Reserved4).Replace('-', ' ')}");
builder.AppendLine($" Reserved 5: {BitConverter.ToString(fileGroup.Reserved5).Replace('-', ' ')}");
builder.AppendLine($" Reserved 6: {BitConverter.ToString(fileGroup.Reserved6).Replace('-', ' ')}");
builder.AppendLine($" Reserved 7: {BitConverter.ToString(fileGroup.Reserved7).Replace('-', ' ')}");
builder.AppendLine($" Reserved 3: {(fileGroup.Reserved3 == null ? "[NULL]" : BitConverter.ToString(fileGroup.Reserved3).Replace('-', ' '))}");
builder.AppendLine($" Reserved 4: {(fileGroup.Reserved4 == null ? "[NULL]" : BitConverter.ToString(fileGroup.Reserved4).Replace('-', ' '))}");
builder.AppendLine($" Reserved 5: {(fileGroup.Reserved5 == null ? "[NULL]" : BitConverter.ToString(fileGroup.Reserved5).Replace('-', ' '))}");
builder.AppendLine($" Reserved 6: {(fileGroup.Reserved6 == null ? "[NULL]" : BitConverter.ToString(fileGroup.Reserved6).Replace('-', ' '))}");
builder.AppendLine($" Reserved 7: {(fileGroup.Reserved7 == null ? "[NULL]" : BitConverter.ToString(fileGroup.Reserved7).Replace('-', ' '))}");
}
builder.AppendLine();
}
@@ -719,7 +783,7 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Descriptor offset: {component.DescriptorOffset} (0x{component.DescriptorOffset:X})");
builder.AppendLine($" Display name offset: {component.DisplayNameOffset} (0x{component.DisplayNameOffset:X})");
builder.AppendLine($" Display name: {component.DisplayName ?? "[NULL]"}");
builder.AppendLine($" Reserved 0: {BitConverter.ToString(component.Reserved0).Replace('-', ' ')}");
builder.AppendLine($" Reserved 0: {(component.Reserved0 == null ? "[NULL]" : BitConverter.ToString(component.Reserved0).Replace('-', ' '))}");
builder.AppendLine($" Reserved offset 0: {component.ReservedOffset0} (0x{component.ReservedOffset0:X})");
builder.AppendLine($" Reserved offset 1: {component.ReservedOffset1} (0x{component.ReservedOffset1:X})");
builder.AppendLine($" Component index: {component.ComponentIndex} (0x{component.ComponentIndex:X})");
@@ -728,11 +792,11 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Reserved offset 2: {component.ReservedOffset2} (0x{component.ReservedOffset2:X})");
builder.AppendLine($" Reserved offset 3: {component.ReservedOffset3} (0x{component.ReservedOffset3:X})");
builder.AppendLine($" Reserved offset 4: {component.ReservedOffset4} (0x{component.ReservedOffset4:X})");
builder.AppendLine($" Reserved 1: {BitConverter.ToString(component.Reserved1).Replace('-', ' ')}");
builder.AppendLine($" Reserved 1: {(component.Reserved1 == null ? "[NULL]" : BitConverter.ToString(component.Reserved1).Replace('-', ' '))}");
builder.AppendLine($" CLSID offset: {component.CLSIDOffset} (0x{component.CLSIDOffset:X})");
builder.AppendLine($" CLSID: {component.CLSID}");
builder.AppendLine($" Reserved 2: {BitConverter.ToString(component.Reserved2).Replace('-', ' ')}");
builder.AppendLine($" Reserved 3: {BitConverter.ToString(component.Reserved3).Replace('-', ' ')}");
builder.AppendLine($" Reserved 2: {(component.Reserved2 == null ? "[NULL]" : BitConverter.ToString(component.Reserved2).Replace('-', ' '))}");
builder.AppendLine($" Reserved 3: {(component.Reserved3 == null ? "[NULL]" : BitConverter.ToString(component.Reserved3).Replace('-', ' '))}");
builder.AppendLine($" Depends count: {component.DependsCount} (0x{component.DependsCount:X})");
builder.AppendLine($" Depends offset: {component.DependsOffset} (0x{component.DependsOffset:X})");
builder.AppendLine($" File group count: {component.FileGroupCount} (0x{component.FileGroupCount:X})");

View File

@@ -20,7 +20,11 @@ namespace BinaryObjectScanner.Wrappers
#region Standard Fields
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Magic"/>
#if NET48
public string Stub_Magic => _model.Stub.Header.Magic;
#else
public string? Stub_Magic => _model.Stub.Header.Magic;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.LastPageBytes"/>
public ushort Stub_LastPageBytes => _model.Stub.Header.LastPageBytes;
@@ -66,7 +70,11 @@ namespace BinaryObjectScanner.Wrappers
#region PE Extensions
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Reserved1"/>
#if NET48
public ushort[] Stub_Reserved1 => _model.Stub.Header.Reserved1;
#else
public ushort[]? Stub_Reserved1 => _model.Stub.Header.Reserved1;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.OEMIdentifier"/>
public ushort Stub_OEMIdentifier => _model.Stub.Header.OEMIdentifier;
@@ -75,7 +83,11 @@ namespace BinaryObjectScanner.Wrappers
public ushort Stub_OEMInformation => _model.Stub.Header.OEMInformation;
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Reserved2"/>
#if NET48
public ushort[] Stub_Reserved2 => _model.Stub.Header.Reserved2;
#else
public ushort[]? Stub_Reserved2 => _model.Stub.Header.Reserved2;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.NewExeHeaderAddr"/>
public uint Stub_NewExeHeaderAddr => _model.Stub.Header.NewExeHeaderAddr;
@@ -87,7 +99,11 @@ namespace BinaryObjectScanner.Wrappers
#region Information Block
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.Signature"/>
#if NET48
public string Signature => _model.InformationBlock.Signature;
#else
public string? Signature => _model.InformationBlock.Signature;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ByteOrder"/>
public SabreTools.Models.LinearExecutable.ByteOrder ByteOrder => _model.InformationBlock.ByteOrder;
@@ -324,13 +340,21 @@ namespace BinaryObjectScanner.Wrappers
#region Debug Information
/// <inheritdoc cref="Models.LinearExecutable.DebugInformation.Signature"/>
#if NET48
public string DI_Signature => _model.DebugInformation?.Signature;
#else
public string? DI_Signature => _model.DebugInformation?.Signature;
#endif
/// <inheritdoc cref="Models.LinearExecutable.DebugInformation.FormatType"/>
public SabreTools.Models.LinearExecutable.DebugFormatType? DI_FormatType => _model.DebugInformation?.FormatType;
/// <inheritdoc cref="Models.LinearExecutable.DebugInformation.DebuggerData"/>
#if NET48
public byte[] DebuggerData => _model.DebugInformation?.DebuggerData;
#else
public byte[]? DebuggerData => _model.DebugInformation?.DebuggerData;
#endif
#endregion
@@ -370,7 +394,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the executable</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>An LE/LX executable wrapper on success, null on failure</returns>
#if NET48
public static LinearExecutable Create(byte[] data, int offset)
#else
public static LinearExecutable? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -390,7 +418,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the executable</param>
/// <returns>An LE/LX executable wrapper on success, null on failure</returns>
#if NET48
public static LinearExecutable Create(Stream data)
#else
public static LinearExecutable? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -484,10 +516,10 @@ namespace BinaryObjectScanner.Wrappers
{
builder.AppendLine(" MS-DOS Stub Extended Header Information:");
builder.AppendLine(" -------------------------");
builder.AppendLine($" Reserved words: {string.Join(", ", Stub_Reserved1)}");
builder.AppendLine($" Reserved words: {(Stub_Reserved1 == null ? "[NULL]" : string.Join(", ", Stub_Reserved1))}");
builder.AppendLine($" OEM identifier: {Stub_OEMIdentifier} (0x{Stub_OEMIdentifier:X})");
builder.AppendLine($" OEM information: {Stub_OEMInformation} (0x{Stub_OEMInformation:X})");
builder.AppendLine($" Reserved words: {string.Join(", ", Stub_Reserved2)}");
builder.AppendLine($" Reserved words: {(Stub_Reserved2 == null ? "[NULL]" : string.Join(", ", Stub_Reserved2))}");
builder.AppendLine($" New EXE header address: {Stub_NewExeHeaderAddr} (0x{Stub_NewExeHeaderAddr:X})");
builder.AppendLine();
}
@@ -1097,7 +1129,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="length">How many bytes to read, -1 means read until end</param>
/// <returns>Byte array representing the range, null on error</returns>
[Obsolete]
#if NET48
public byte[] ReadArbitraryRange(int rangeStart = -1, int length = -1)
#else
public byte[]? ReadArbitraryRange(int rangeStart = -1, int length = -1)
#endif
{
// If we have an unset range start, read from the start of the source
if (rangeStart == -1)

View File

@@ -17,7 +17,11 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Magic"/>
#if NET48
public string Magic => _model.Header.Magic;
#else
public string? Magic => _model.Header.Magic;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.LastPageBytes"/>
public ushort LastPageBytes => _model.Header.LastPageBytes;
@@ -63,7 +67,11 @@ namespace BinaryObjectScanner.Wrappers
#region PE Extensions
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Reserved1"/>
#if NET48
public ushort[] Reserved1 => _model.Header.Reserved1;
#else
public ushort[]? Reserved1 => _model.Header.Reserved1;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.OEMIdentifier"/>
public ushort OEMIdentifier => _model.Header.OEMIdentifier;
@@ -72,7 +80,11 @@ namespace BinaryObjectScanner.Wrappers
public ushort OEMInformation => _model.Header.OEMInformation;
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Reserved2"/>
#if NET48
public ushort[] Reserved2 => _model.Header.Reserved2;
#else
public ushort[]? Reserved2 => _model.Header.Reserved2;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.NewExeHeaderAddr"/>
public uint NewExeHeaderAddr => _model.Header.NewExeHeaderAddr;
@@ -120,7 +132,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the executable</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>An MS-DOS executable wrapper on success, null on failure</returns>
#if NET48
public static MSDOS Create(byte[] data, int offset)
#else
public static MSDOS? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -140,7 +156,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the executable</param>
/// <returns>An MS-DOS executable wrapper on success, null on failure</returns>
#if NET48
public static MSDOS Create(Stream data)
#else
public static MSDOS? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)

View File

@@ -19,7 +19,11 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.Signature"/>
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.Reserved1"/>
public uint Reserved1 => _model.Header.Reserved1;
@@ -67,19 +71,39 @@ namespace BinaryObjectScanner.Wrappers
public byte DataReservedSize => _model.Header.DataReservedSize;
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.ReservedData"/>
#if NET48
public byte[] ReservedData => _model.Header.ReservedData;
#else
public byte[]? ReservedData => _model.Header.ReservedData;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.CabinetPrev"/>
#if NET48
public string CabinetPrev => _model.Header.CabinetPrev;
#else
public string? CabinetPrev => _model.Header.CabinetPrev;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.DiskPrev"/>
#if NET48
public string DiskPrev => _model.Header.DiskPrev;
#else
public string? DiskPrev => _model.Header.DiskPrev;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.CabinetNext"/>
#if NET48
public string CabinetNext => _model.Header.CabinetNext;
#else
public string? CabinetNext => _model.Header.CabinetNext;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.DiskNext"/>
#if NET48
public string DiskNext => _model.Header.DiskNext;
#else
public string? DiskNext => _model.Header.DiskNext;
#endif
#endregion
@@ -130,12 +154,16 @@ namespace BinaryObjectScanner.Wrappers
{
// All logic is handled by the base class
}/// <summary>
/// Create a Microsoft Cabinet from a byte array and offset
/// </summary>
/// <param name="data">Byte array representing the cabinet</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A cabinet wrapper on success, null on failure</returns>
/// Create a Microsoft Cabinet from a byte array and offset
/// </summary>
/// <param name="data">Byte array representing the cabinet</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A cabinet wrapper on success, null on failure</returns>
#if NET48
public static MicrosoftCabinet Create(byte[] data, int offset)
#else
public static MicrosoftCabinet? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -155,7 +183,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the cabinet</param>
/// <returns>A cabinet wrapper on success, null on failure</returns>
#if NET48
public static MicrosoftCabinet Create(Stream data)
#else
public static MicrosoftCabinet? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -223,7 +255,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="folderIndex">Folder index to check</param>
/// <returns>Byte array representing the data, null on error</returns>
/// <remarks>All but uncompressed are unimplemented</remarks>
#if NET48
public byte[] GetUncompressedData(int folderIndex)
#else
public byte[]? GetUncompressedData(int folderIndex)
#endif
{
// If we have an invalid folder index
if (folderIndex < 0 || folderIndex >= Folders.Length)
@@ -273,7 +309,8 @@ namespace BinaryObjectScanner.Wrappers
return null;
}
data.AddRange(decompressed ?? new byte[0]);
if (decompressed != null)
data.AddRange(decompressed);
}
return data.ToArray();
@@ -329,7 +366,7 @@ namespace BinaryObjectScanner.Wrappers
return false;
// Create the output filename
string fileName = Path.Combine(outputDirectory, file.Name);
string fileName = Path.Combine(outputDirectory, file.Name ?? $"file{index}");
// Get the file data, if possible
byte[] fileData = GetFileData(index);
@@ -390,7 +427,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="fileIndex">File index to check</param>
/// <returns>Byte array representing the data, null on error</returns>
#if NET48
public byte[] GetFileData(int fileIndex)
#else
public byte[]? GetFileData(int fileIndex)
#endif
{
// If we have an invalid file index
if (fileIndex < 0 || fileIndex >= Files.Length)

View File

@@ -20,22 +20,38 @@ namespace BinaryObjectScanner.Wrappers
#region Common to all NCSD files
/// <inheritdoc cref="Models.N3DS.NCSDHeader.RSA2048Signature"/>
#if NET48
public byte[] RSA2048Signature => _model.Header.RSA2048Signature;
#else
public byte[]? RSA2048Signature => _model.Header.RSA2048Signature;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.MagicNumber"/>
#if NET48
public string MagicNumber => _model.Header.MagicNumber;
#else
public string? MagicNumber => _model.Header.MagicNumber;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.ImageSizeInMediaUnits"/>
public uint ImageSizeInMediaUnits => _model.Header.ImageSizeInMediaUnits;
/// <inheritdoc cref="Models.N3DS.NCSDHeader.MediaId"/>
#if NET48
public byte[] MediaId => _model.Header.MediaId;
#else
public byte[]? MediaId => _model.Header.MediaId;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.PartitionsFSType"/>
public SabreTools.Models.N3DS.FilesystemType PartitionsFSType => _model.Header.PartitionsFSType;
/// <inheritdoc cref="Models.N3DS.NCSDHeader.PartitionsCryptType"/>
#if NET48
public byte[] PartitionsCryptType => _model.Header.PartitionsCryptType;
#else
public byte[]? PartitionsCryptType => _model.Header.PartitionsCryptType;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.PartitionsTable"/>
#if NET48
@@ -49,7 +65,11 @@ namespace BinaryObjectScanner.Wrappers
#region CTR Cart Image (CCI) Specific
/// <inheritdoc cref="Models.N3DS.NCSDHeader.ExheaderHash"/>
#if NET48
public byte[] ExheaderHash => _model.Header.ExheaderHash;
#else
public byte[]? ExheaderHash => _model.Header.ExheaderHash;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.AdditionalHeaderSize"/>
public uint AdditionalHeaderSize => _model.Header.AdditionalHeaderSize;
@@ -58,16 +78,32 @@ namespace BinaryObjectScanner.Wrappers
public uint SectorZeroOffset => _model.Header.SectorZeroOffset;
/// <inheritdoc cref="Models.N3DS.NCSDHeader.PartitionFlags"/>
#if NET48
public byte[] PartitionFlags => _model.Header.PartitionFlags;
#else
public byte[]? PartitionFlags => _model.Header.PartitionFlags;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.PartitionIdTable"/>
#if NET48
public ulong[] PartitionIdTable => _model.Header.PartitionIdTable;
#else
public ulong[]? PartitionIdTable => _model.Header.PartitionIdTable;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.Reserved1"/>
#if NET48
public byte[] Reserved1 => _model.Header.Reserved1;
#else
public byte[]? Reserved1 => _model.Header.Reserved1;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.Reserved2"/>
#if NET48
public byte[] Reserved2 => _model.Header.Reserved2;
#else
public byte[]? Reserved2 => _model.Header.Reserved2;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.FirmUpdateByte1"/>
public byte FirmUpdateByte1 => _model.Header.FirmUpdateByte1;
@@ -80,10 +116,18 @@ namespace BinaryObjectScanner.Wrappers
#region Raw NAND Format Specific
/// <inheritdoc cref="Models.N3DS.NCSDHeader.Unknown"/>
#if NET48
public byte[] Unknown => _model.Header.Unknown;
#else
public byte[]? Unknown => _model.Header.Unknown;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.EncryptedMBR"/>
#if NET48
public byte[] EncryptedMBR => _model.Header.EncryptedMBR;
#else
public byte[]? EncryptedMBR => _model.Header.EncryptedMBR;
#endif
#endregion
@@ -98,13 +142,21 @@ namespace BinaryObjectScanner.Wrappers
public uint CIH_CardInfoBitmask => _model.CardInfoHeader.CardInfoBitmask;
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.Reserved1"/>
#if NET48
public byte[] CIH_Reserved1 => _model.CardInfoHeader.Reserved1;
#else
public byte[]? CIH_Reserved1 => _model.CardInfoHeader.Reserved1;
#endif
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.FilledSize"/>
public uint CIH_FilledSize => _model.CardInfoHeader.FilledSize;
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.Reserved2"/>
#if NET48
public byte[] CIH_Reserved2 => _model.CardInfoHeader.Reserved2;
#else
public byte[]? CIH_Reserved2 => _model.CardInfoHeader.Reserved2;
#endif
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.TitleVersion"/>
public ushort CIH_TitleVersion => _model.CardInfoHeader.TitleVersion;
@@ -113,16 +165,28 @@ namespace BinaryObjectScanner.Wrappers
public ushort CIH_CardRevision => _model.CardInfoHeader.CardRevision;
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.Reserved3"/>
#if NET48
public byte[] CIH_Reserved3 => _model.CardInfoHeader.Reserved3;
#else
public byte[]? CIH_Reserved3 => _model.CardInfoHeader.Reserved3;
#endif
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.CVerTitleID"/>
#if NET48
public byte[] CIH_CVerTitleID => _model.CardInfoHeader.CVerTitleID;
#else
public byte[]? CIH_CVerTitleID => _model.CardInfoHeader.CVerTitleID;
#endif
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.CVerVersionNumber"/>
public ushort CIH_CVerVersionNumber => _model.CardInfoHeader.CVerVersionNumber;
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.Reserved4"/>
#if NET48
public byte[] CIH_Reserved4 => _model.CardInfoHeader.Reserved4;
#else
public byte[]? CIH_Reserved4 => _model.CardInfoHeader.Reserved4;
#endif
#endregion
@@ -131,62 +195,134 @@ namespace BinaryObjectScanner.Wrappers
#region Initial Data
/// <inheritdoc cref="Models.N3DS.InitialData.CardSeedKeyY"/>
#if NET48
public byte[] DCIH_ID_CardSeedKeyY => _model.DevelopmentCardInfoHeader?.InitialData?.CardSeedKeyY;
#else
public byte[]? DCIH_ID_CardSeedKeyY => _model.DevelopmentCardInfoHeader?.InitialData?.CardSeedKeyY;
#endif
/// <inheritdoc cref="Models.N3DS.InitialData.EncryptedCardSeed"/>
#if NET48
public byte[] DCIH_ID_EncryptedCardSeed => _model.DevelopmentCardInfoHeader?.InitialData?.EncryptedCardSeed;
#else
public byte[]? DCIH_ID_EncryptedCardSeed => _model.DevelopmentCardInfoHeader?.InitialData?.EncryptedCardSeed;
#endif
/// <inheritdoc cref="Models.N3DS.InitialData.CardSeedAESMAC"/>
#if NET48
public byte[] DCIH_ID_CardSeedAESMAC => _model.DevelopmentCardInfoHeader?.InitialData?.CardSeedAESMAC;
#else
public byte[]? DCIH_ID_CardSeedAESMAC => _model.DevelopmentCardInfoHeader?.InitialData?.CardSeedAESMAC;
#endif
/// <inheritdoc cref="Models.N3DS.InitialData.CardSeedNonce"/>
#if NET48
public byte[] DCIH_ID_CardSeedNonce => _model.DevelopmentCardInfoHeader?.InitialData?.CardSeedNonce;
#else
public byte[]? DCIH_ID_CardSeedNonce => _model.DevelopmentCardInfoHeader?.InitialData?.CardSeedNonce;
#endif
/// <inheritdoc cref="Models.N3DS.InitialData.Reserved3"/>
#if NET48
public byte[] DCIH_ID_Reserved => _model.DevelopmentCardInfoHeader?.InitialData?.Reserved;
#else
public byte[]? DCIH_ID_Reserved => _model.DevelopmentCardInfoHeader?.InitialData?.Reserved;
#endif
/// <inheritdoc cref="Models.N3DS.InitialData.BackupHeader"/>
#if NET48
public SabreTools.Models.N3DS.NCCHHeader DCIH_ID_BackupHeader => _model.DevelopmentCardInfoHeader?.InitialData?.BackupHeader;
#else
public SabreTools.Models.N3DS.NCCHHeader? DCIH_ID_BackupHeader => _model.DevelopmentCardInfoHeader?.InitialData?.BackupHeader;
#endif
#endregion
/// <inheritdoc cref="Models.N3DS.DevelopmentCardInfoHeader.CardDeviceReserved1"/>
#if NET48
public byte[] DCIH_CardDeviceReserved1 => _model.DevelopmentCardInfoHeader?.CardDeviceReserved1;
#else
public byte[]? DCIH_CardDeviceReserved1 => _model.DevelopmentCardInfoHeader?.CardDeviceReserved1;
#endif
/// <inheritdoc cref="Models.N3DS.DevelopmentCardInfoHeader.TitleKey"/>
#if NET48
public byte[] DCIH_TitleKey => _model.DevelopmentCardInfoHeader?.TitleKey;
#else
public byte[]? DCIH_TitleKey => _model.DevelopmentCardInfoHeader?.TitleKey;
#endif
/// <inheritdoc cref="Models.N3DS.DevelopmentCardInfoHeader.CardDeviceReserved2"/>
#if NET48
public byte[] DCIH_CardDeviceReserved2 => _model.DevelopmentCardInfoHeader?.CardDeviceReserved2;
#else
public byte[]? DCIH_CardDeviceReserved2 => _model.DevelopmentCardInfoHeader?.CardDeviceReserved2;
#endif
#region Test Data
/// <inheritdoc cref="Models.N3DS.TestData.Signature"/>
#if NET48
public byte[] DCIH_TD_Signature => _model.DevelopmentCardInfoHeader?.TestData?.Signature;
#else
public byte[]? DCIH_TD_Signature => _model.DevelopmentCardInfoHeader?.TestData?.Signature;
#endif
/// <inheritdoc cref="Models.N3DS.TestData.AscendingByteSequence"/>
#if NET48
public byte[] DCIH_TD_AscendingByteSequence => _model.DevelopmentCardInfoHeader?.TestData?.AscendingByteSequence;
#else
public byte[]? DCIH_TD_AscendingByteSequence => _model.DevelopmentCardInfoHeader?.TestData?.AscendingByteSequence;
#endif
/// <inheritdoc cref="Models.N3DS.TestData.DescendingByteSequence"/>
#if NET48
public byte[] DCIH_TD_DescendingByteSequence => _model.DevelopmentCardInfoHeader?.TestData?.DescendingByteSequence;
#else
public byte[]? DCIH_TD_DescendingByteSequence => _model.DevelopmentCardInfoHeader?.TestData?.DescendingByteSequence;
#endif
/// <inheritdoc cref="Models.N3DS.TestData.Filled00"/>
#if NET48
public byte[] DCIH_TD_Filled00 => _model.DevelopmentCardInfoHeader?.TestData?.Filled00;
#else
public byte[]? DCIH_TD_Filled00 => _model.DevelopmentCardInfoHeader?.TestData?.Filled00;
#endif
/// <inheritdoc cref="Models.N3DS.TestData.FilledFF"/>
#if NET48
public byte[] DCIH_TD_FilledFF => _model.DevelopmentCardInfoHeader?.TestData?.FilledFF;
#else
public byte[]? DCIH_TD_FilledFF => _model.DevelopmentCardInfoHeader?.TestData?.FilledFF;
#endif
/// <inheritdoc cref="Models.N3DS.TestData.Filled0F"/>
#if NET48
public byte[] DCIH_TD_Filled0F => _model.DevelopmentCardInfoHeader?.TestData?.Filled0F;
#else
public byte[]? DCIH_TD_Filled0F => _model.DevelopmentCardInfoHeader?.TestData?.Filled0F;
#endif
/// <inheritdoc cref="Models.N3DS.TestData.FilledF0"/>
#if NET48
public byte[] DCIH_TD_FilledF0 => _model.DevelopmentCardInfoHeader?.TestData?.FilledF0;
#else
public byte[]? DCIH_TD_FilledF0 => _model.DevelopmentCardInfoHeader?.TestData?.FilledF0;
#endif
/// <inheritdoc cref="Models.N3DS.TestData.Filled55"/>
#if NET48
public byte[] DCIH_TD_Filled55 => _model.DevelopmentCardInfoHeader?.TestData?.Filled55;
#else
public byte[]? DCIH_TD_Filled55 => _model.DevelopmentCardInfoHeader?.TestData?.Filled55;
#endif
/// <inheritdoc cref="Models.N3DS.TestData.FilledAA"/>
#if NET48
public byte[] DCIH_TD_FilledAA => _model.DevelopmentCardInfoHeader?.TestData?.FilledAA;
#else
public byte[]? DCIH_TD_FilledAA => _model.DevelopmentCardInfoHeader?.TestData?.FilledAA;
#endif
/// <inheritdoc cref="Models.N3DS.TestData.FinalByte"/>
public byte? DCIH_TD_FinalByte => _model.DevelopmentCardInfoHeader?.TestData?.FinalByte;
@@ -271,7 +407,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the archive</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A 3DS cart image wrapper on success, null on failure</returns>
#if NET48
public static N3DS Create(byte[] data, int offset)
#else
public static N3DS? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -291,7 +431,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the archive</param>
/// <returns>A 3DS cart image wrapper on success, null on failure</returns>
#if NET48
public static N3DS Create(Stream data)
#else
public static N3DS? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -343,12 +487,12 @@ namespace BinaryObjectScanner.Wrappers
{
builder.AppendLine(" NCSD Header Information:");
builder.AppendLine(" -------------------------");
builder.AppendLine($" RSA-2048 SHA-256 signature: {BitConverter.ToString(RSA2048Signature).Replace('-', ' ')}");
builder.AppendLine($" RSA-2048 SHA-256 signature: {(RSA2048Signature == null ? "[NULL]" : BitConverter.ToString(RSA2048Signature).Replace('-', ' '))}");
builder.AppendLine($" Magic number: {MagicNumber} (0x{MagicNumber:X})");
builder.AppendLine($" Image size in media units: {ImageSizeInMediaUnits} (0x{ImageSizeInMediaUnits:X})");
builder.AppendLine($" Media ID: {BitConverter.ToString(MediaId).Replace('-', ' ')}");
builder.AppendLine($" Media ID: {(MediaId == null ? "[NULL]" : BitConverter.ToString(MediaId).Replace('-', ' '))}");
builder.AppendLine($" Partitions filesystem type: {PartitionsFSType} (0x{PartitionsFSType:X})");
builder.AppendLine($" Partitions crypt type: {BitConverter.ToString(PartitionsCryptType).Replace('-', ' ')}");
builder.AppendLine($" Partitions crypt type: {(PartitionsCryptType == null ? "[NULL]" : BitConverter.ToString(PartitionsCryptType).Replace('-', ' '))}");
builder.AppendLine();
builder.AppendLine($" Partition table:");
@@ -365,10 +509,10 @@ namespace BinaryObjectScanner.Wrappers
// If we have a cart image
if (PartitionsFSType == SabreTools.Models.N3DS.FilesystemType.Normal || PartitionsFSType == SabreTools.Models.N3DS.FilesystemType.None)
{
builder.AppendLine($" Exheader SHA-256 hash: {BitConverter.ToString(ExheaderHash).Replace('-', ' ')}");
builder.AppendLine($" Exheader SHA-256 hash: {(ExheaderHash == null ? "[NULL]" : BitConverter.ToString(ExheaderHash).Replace('-', ' '))}");
builder.AppendLine($" Additional header size: {AdditionalHeaderSize} (0x{AdditionalHeaderSize:X})");
builder.AppendLine($" Sector zero offset: {SectorZeroOffset} (0x{SectorZeroOffset:X})");
builder.AppendLine($" Partition flags: {BitConverter.ToString(PartitionFlags).Replace('-', ' ')}");
builder.AppendLine($" Partition flags: {(PartitionFlags == null ? "[NULL]" : BitConverter.ToString(PartitionFlags).Replace('-', ' '))}");
builder.AppendLine();
builder.AppendLine($" Partition ID table:");
@@ -379,8 +523,8 @@ namespace BinaryObjectScanner.Wrappers
}
builder.AppendLine();
builder.AppendLine($" Reserved 1: {BitConverter.ToString(Reserved1).Replace('-', ' ')}");
builder.AppendLine($" Reserved 2: {BitConverter.ToString(Reserved2).Replace('-', ' ')}");
builder.AppendLine($" Reserved 1: {(Reserved1 == null ? "[NULL]" : BitConverter.ToString(Reserved1).Replace('-', ' '))}");
builder.AppendLine($" Reserved 2: {(Reserved2 == null ? "[NULL]" : BitConverter.ToString(Reserved2).Replace('-', ' '))}");
builder.AppendLine($" Firmware update byte 1: {FirmUpdateByte1} (0x{FirmUpdateByte1:X})");
builder.AppendLine($" Firmware update byte 2: {FirmUpdateByte2} (0x{FirmUpdateByte2:X})");
}
@@ -388,8 +532,8 @@ namespace BinaryObjectScanner.Wrappers
// If we have a firmware image
else if (PartitionsFSType == SabreTools.Models.N3DS.FilesystemType.FIRM)
{
builder.AppendLine($" Unknown: {BitConverter.ToString(Unknown).Replace('-', ' ')}");
builder.AppendLine($" Encrypted MBR: {BitConverter.ToString(EncryptedMBR).Replace('-', ' ')}");
builder.AppendLine($" Unknown: {(Unknown == null ? "[NULL]" : BitConverter.ToString(Unknown).Replace('-', ' '))}");
builder.AppendLine($" Encrypted MBR: {(EncryptedMBR == null ? "[NULL]" : BitConverter.ToString(EncryptedMBR).Replace('-', ' '))}");
}
builder.AppendLine();
@@ -405,15 +549,15 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine(" -------------------------");
builder.AppendLine($" Writable address in media units: {CIH_WritableAddressMediaUnits} (0x{CIH_WritableAddressMediaUnits:X})");
builder.AppendLine($" Card info bitmask: {CIH_CardInfoBitmask} (0x{CIH_CardInfoBitmask:X})");
builder.AppendLine($" Reserved 1: {BitConverter.ToString(CIH_Reserved1).Replace('-', ' ')}");
builder.AppendLine($" Reserved 1: {(CIH_Reserved1 == null ? "[NULL]" : BitConverter.ToString(CIH_Reserved1).Replace('-', ' '))}");
builder.AppendLine($" Filled size of cartridge: {CIH_FilledSize} (0x{CIH_FilledSize:X})");
builder.AppendLine($" Reserved 2: {BitConverter.ToString(CIH_Reserved2).Replace('-', ' ')}");
builder.AppendLine($" Reserved 2: {(CIH_Reserved2 == null ? "[NULL]" : BitConverter.ToString(CIH_Reserved2).Replace('-', ' '))}");
builder.AppendLine($" Title version: {CIH_TitleVersion} (0x{CIH_TitleVersion:X})");
builder.AppendLine($" Card revision: {CIH_CardRevision} (0x{CIH_CardRevision:X})");
builder.AppendLine($" Reserved 3: {BitConverter.ToString(CIH_Reserved3).Replace('-', ' ')}");
builder.AppendLine($" Title ID of CVer in included update partition: {BitConverter.ToString(CIH_CVerTitleID).Replace('-', ' ')}");
builder.AppendLine($" Reserved 3: {(CIH_Reserved3 == null ? "[NULL]" : BitConverter.ToString(CIH_Reserved3).Replace('-', ' '))}");
builder.AppendLine($" Title ID of CVer in included update partition: {(CIH_CVerTitleID == null ? "[NULL]" : BitConverter.ToString(CIH_CVerTitleID).Replace('-', ' '))}");
builder.AppendLine($" Version number of CVer in included update partition: {CIH_CVerVersionNumber} (0x{CIH_CVerVersionNumber:X})");
builder.AppendLine($" Reserved 4: {BitConverter.ToString(CIH_Reserved4).Replace('-', ' ')}");
builder.AppendLine($" Reserved 4: {(CIH_Reserved4 == null ? "[NULL]" : BitConverter.ToString(CIH_Reserved4).Replace('-', ' '))}");
builder.AppendLine();
}
@@ -434,11 +578,11 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine();
builder.AppendLine(" Initial Data:");
builder.AppendLine(" -------------------------");
builder.AppendLine($" Card seed keyY: {BitConverter.ToString(DCIH_ID_CardSeedKeyY).Replace('-', ' ')}");
builder.AppendLine($" Encrypted card seed: {BitConverter.ToString(DCIH_ID_EncryptedCardSeed).Replace('-', ' ')}");
builder.AppendLine($" Card seed AES-MAC: {BitConverter.ToString(DCIH_ID_CardSeedAESMAC).Replace('-', ' ')}");
builder.AppendLine($" Card seed nonce: {BitConverter.ToString(DCIH_ID_CardSeedNonce).Replace('-', ' ')}");
builder.AppendLine($" Reserved: {BitConverter.ToString(DCIH_ID_Reserved).Replace('-', ' ')}");
builder.AppendLine($" Card seed keyY: {(DCIH_ID_CardSeedKeyY == null ? "[NULL]" : BitConverter.ToString(DCIH_ID_CardSeedKeyY).Replace('-', ' '))}");
builder.AppendLine($" Encrypted card seed: {(DCIH_ID_EncryptedCardSeed == null ? "[NULL]" : BitConverter.ToString(DCIH_ID_EncryptedCardSeed).Replace('-', ' '))}");
builder.AppendLine($" Card seed AES-MAC: {(DCIH_ID_CardSeedAESMAC == null ? "[NULL]" : BitConverter.ToString(DCIH_ID_CardSeedAESMAC).Replace('-', ' '))}");
builder.AppendLine($" Card seed nonce: {(DCIH_ID_CardSeedNonce == null ? "[NULL]" : BitConverter.ToString(DCIH_ID_CardSeedNonce).Replace('-', ' '))}");
builder.AppendLine($" Reserved: {(DCIH_ID_Reserved == null ? "[NULL]" : BitConverter.ToString(DCIH_ID_Reserved).Replace('-', ' '))}");
builder.AppendLine();
builder.AppendLine(" Backup Header:");
@@ -449,13 +593,13 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Maker code: {DCIH_ID_BackupHeader.MakerCode} (0x{DCIH_ID_BackupHeader.MakerCode:X})");
builder.AppendLine($" Version: {DCIH_ID_BackupHeader.Version} (0x{DCIH_ID_BackupHeader.Version:X})");
builder.AppendLine($" Verification hash: {DCIH_ID_BackupHeader.VerificationHash} (0x{DCIH_ID_BackupHeader.VerificationHash:X})");
builder.AppendLine($" Program ID: {BitConverter.ToString(DCIH_ID_BackupHeader.ProgramId).Replace('-', ' ')}");
builder.AppendLine($" Reserved 1: {BitConverter.ToString(DCIH_ID_BackupHeader.Reserved1).Replace('-', ' ')}");
builder.AppendLine($" Logo region SHA-256 hash: {BitConverter.ToString(DCIH_ID_BackupHeader.LogoRegionHash).Replace('-', ' ')}");
builder.AppendLine($" Program ID: {(DCIH_ID_BackupHeader.ProgramId == null ? "[NULL]" : BitConverter.ToString(DCIH_ID_BackupHeader.ProgramId).Replace('-', ' '))}");
builder.AppendLine($" Reserved 1: {(DCIH_ID_BackupHeader.Reserved1 == null ? "[NULL]" : BitConverter.ToString(DCIH_ID_BackupHeader.Reserved1).Replace('-', ' '))}");
builder.AppendLine($" Logo region SHA-256 hash: {(DCIH_ID_BackupHeader.LogoRegionHash == null ? "[NULL]" : BitConverter.ToString(DCIH_ID_BackupHeader.LogoRegionHash).Replace('-', ' '))}");
builder.AppendLine($" Product code: {DCIH_ID_BackupHeader.ProductCode} (0x{DCIH_ID_BackupHeader.ProductCode:X})");
builder.AppendLine($" Extended header SHA-256 hash: {BitConverter.ToString(DCIH_ID_BackupHeader.ExtendedHeaderHash).Replace('-', ' ')}");
builder.AppendLine($" Extended header SHA-256 hash: {(DCIH_ID_BackupHeader.ExtendedHeaderHash == null ? "[NULL]" : BitConverter.ToString(DCIH_ID_BackupHeader.ExtendedHeaderHash).Replace('-', ' '))}");
builder.AppendLine($" Extended header size in bytes: {DCIH_ID_BackupHeader.ExtendedHeaderSizeInBytes} (0x{DCIH_ID_BackupHeader.ExtendedHeaderSizeInBytes:X})");
builder.AppendLine($" Reserved 2: {BitConverter.ToString(DCIH_ID_BackupHeader.Reserved2).Replace('-', ' ')}");
builder.AppendLine($" Reserved 2: {(DCIH_ID_BackupHeader.Reserved2 == null ? "[NULL]" : BitConverter.ToString(DCIH_ID_BackupHeader.Reserved2).Replace('-', ' '))}");
builder.AppendLine($" Flags: {DCIH_ID_BackupHeader.Flags} (0x{DCIH_ID_BackupHeader.Flags:X})");
builder.AppendLine($" Plain region offset, in media units: {DCIH_ID_BackupHeader.PlainRegionOffsetInMediaUnits} (0x{DCIH_ID_BackupHeader.PlainRegionOffsetInMediaUnits:X})");
builder.AppendLine($" Plain region size, in media units: {DCIH_ID_BackupHeader.PlainRegionSizeInMediaUnits} (0x{DCIH_ID_BackupHeader.PlainRegionSizeInMediaUnits:X})");
@@ -464,31 +608,31 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" ExeFS offset, in media units: {DCIH_ID_BackupHeader.ExeFSOffsetInMediaUnits} (0x{DCIH_ID_BackupHeader.ExeFSOffsetInMediaUnits:X})");
builder.AppendLine($" ExeFS size, in media units: {DCIH_ID_BackupHeader.ExeFSSizeInMediaUnits} (0x{DCIH_ID_BackupHeader.ExeFSSizeInMediaUnits:X})");
builder.AppendLine($" ExeFS hash region size, in media units: {DCIH_ID_BackupHeader.ExeFSHashRegionSizeInMediaUnits} (0x{DCIH_ID_BackupHeader.ExeFSHashRegionSizeInMediaUnits:X})");
builder.AppendLine($" Reserved 3: {BitConverter.ToString(DCIH_ID_BackupHeader.Reserved3).Replace('-', ' ')}");
builder.AppendLine($" Reserved 3: {(DCIH_ID_BackupHeader.Reserved3 == null ? "[NULL]" : BitConverter.ToString(DCIH_ID_BackupHeader.Reserved3).Replace('-', ' '))}");
builder.AppendLine($" RomFS offset, in media units: {DCIH_ID_BackupHeader.RomFSOffsetInMediaUnits} (0x{DCIH_ID_BackupHeader.RomFSOffsetInMediaUnits:X})");
builder.AppendLine($" RomFS size, in media units: {DCIH_ID_BackupHeader.RomFSSizeInMediaUnits} (0x{DCIH_ID_BackupHeader.RomFSSizeInMediaUnits:X})");
builder.AppendLine($" RomFS hash region size, in media units: {DCIH_ID_BackupHeader.RomFSHashRegionSizeInMediaUnits} (0x{DCIH_ID_BackupHeader.RomFSHashRegionSizeInMediaUnits:X})");
builder.AppendLine($" Reserved 4: {BitConverter.ToString(DCIH_ID_BackupHeader.Reserved4).Replace('-', ' ')}");
builder.AppendLine($" ExeFS superblock SHA-256 hash: {BitConverter.ToString(DCIH_ID_BackupHeader.ExeFSSuperblockHash).Replace('-', ' ')}");
builder.AppendLine($" RomFS superblock SHA-256 hash: {BitConverter.ToString(DCIH_ID_BackupHeader.RomFSSuperblockHash).Replace('-', ' ')}");
builder.AppendLine($" Reserved 4: {(DCIH_ID_BackupHeader.Reserved4 == null ? "[NULL]" : BitConverter.ToString(DCIH_ID_BackupHeader.Reserved4).Replace('-', ' '))}");
builder.AppendLine($" ExeFS superblock SHA-256 hash: {(DCIH_ID_BackupHeader.ExeFSSuperblockHash == null ? "[NULL]" : BitConverter.ToString(DCIH_ID_BackupHeader.ExeFSSuperblockHash).Replace('-', ' '))}");
builder.AppendLine($" RomFS superblock SHA-256 hash: {(DCIH_ID_BackupHeader.RomFSSuperblockHash == null ? "[NULL]" : BitConverter.ToString(DCIH_ID_BackupHeader.RomFSSuperblockHash).Replace('-', ' '))}");
builder.AppendLine();
builder.AppendLine($" Card device reserved 1: {BitConverter.ToString(DCIH_CardDeviceReserved1).Replace('-', ' ')}");
builder.AppendLine($" Title key: {BitConverter.ToString(DCIH_TitleKey).Replace('-', ' ')}");
builder.AppendLine($" Card device reserved 2: {BitConverter.ToString(DCIH_CardDeviceReserved2).Replace('-', ' ')}");
builder.AppendLine($" Card device reserved 1: {(DCIH_CardDeviceReserved1 == null ? "[NULL]" : BitConverter.ToString(DCIH_CardDeviceReserved1).Replace('-', ' '))}");
builder.AppendLine($" Title key: {(DCIH_TitleKey == null ? "[NULL]" : BitConverter.ToString(DCIH_TitleKey).Replace('-', ' '))}");
builder.AppendLine($" Card device reserved 2: {(DCIH_CardDeviceReserved2 == null ? "[NULL]" : BitConverter.ToString(DCIH_CardDeviceReserved2).Replace('-', ' '))}");
builder.AppendLine();
builder.AppendLine(" Test Data:");
builder.AppendLine(" -------------------------");
builder.AppendLine($" Signature: {BitConverter.ToString(DCIH_TD_Signature).Replace('-', ' ')}");
builder.AppendLine($" Ascending byte sequence: {BitConverter.ToString(DCIH_TD_AscendingByteSequence).Replace('-', ' ')}");
builder.AppendLine($" Descending byte sequence: {BitConverter.ToString(DCIH_TD_DescendingByteSequence).Replace('-', ' ')}");
builder.AppendLine($" Filled with 00: {BitConverter.ToString(DCIH_TD_Filled00).Replace('-', ' ')}");
builder.AppendLine($" Filled with FF: {BitConverter.ToString(DCIH_TD_FilledFF).Replace('-', ' ')}");
builder.AppendLine($" Filled with 0F: {BitConverter.ToString(DCIH_TD_Filled0F).Replace('-', ' ')}");
builder.AppendLine($" Filled with F0: {BitConverter.ToString(DCIH_TD_FilledF0).Replace('-', ' ')}");
builder.AppendLine($" Filled with 55: {BitConverter.ToString(DCIH_TD_Filled55).Replace('-', ' ')}");
builder.AppendLine($" Filled with AA: {BitConverter.ToString(DCIH_TD_FilledAA).Replace('-', ' ')}");
builder.AppendLine($" Signature: {(DCIH_TD_Signature == null ? "[NULL]" : BitConverter.ToString(DCIH_TD_Signature).Replace('-', ' '))}");
builder.AppendLine($" Ascending byte sequence: {(DCIH_TD_AscendingByteSequence == null ? "[NULL]" : BitConverter.ToString(DCIH_TD_AscendingByteSequence).Replace('-', ' '))}");
builder.AppendLine($" Descending byte sequence: {(DCIH_TD_DescendingByteSequence == null ? "[NULL]" : BitConverter.ToString(DCIH_TD_DescendingByteSequence).Replace('-', ' '))}");
builder.AppendLine($" Filled with 00: {(DCIH_TD_Filled00 == null ? "[NULL]" : BitConverter.ToString(DCIH_TD_Filled00).Replace('-', ' '))}");
builder.AppendLine($" Filled with FF: {(DCIH_TD_FilledFF == null ? "[NULL]" : BitConverter.ToString(DCIH_TD_FilledFF).Replace('-', ' '))}");
builder.AppendLine($" Filled with 0F: {(DCIH_TD_Filled0F == null ? "[NULL]" : BitConverter.ToString(DCIH_TD_Filled0F).Replace('-', ' '))}");
builder.AppendLine($" Filled with F0: {(DCIH_TD_FilledF0 == null ? "[NULL]" : BitConverter.ToString(DCIH_TD_FilledF0).Replace('-', ' '))}");
builder.AppendLine($" Filled with 55: {(DCIH_TD_Filled55 == null ? "[NULL]" : BitConverter.ToString(DCIH_TD_Filled55).Replace('-', ' '))}");
builder.AppendLine($" Filled with AA: {(DCIH_TD_FilledAA == null ? "[NULL]" : BitConverter.ToString(DCIH_TD_FilledAA).Replace('-', ' '))}");
builder.AppendLine($" Final byte: {DCIH_TD_FinalByte}");
}
@@ -523,20 +667,20 @@ namespace BinaryObjectScanner.Wrappers
}
else
{
builder.AppendLine($" RSA-2048 SHA-256 signature: {BitConverter.ToString(partitionHeader.RSA2048Signature).Replace('-', ' ')}");
builder.AppendLine($" RSA-2048 SHA-256 signature: {(partitionHeader.RSA2048Signature == null ? "[NULL]" : BitConverter.ToString(partitionHeader.RSA2048Signature).Replace('-', ' '))}");
builder.AppendLine($" Magic ID: {partitionHeader.MagicID} (0x{partitionHeader.MagicID:X})");
builder.AppendLine($" Content size in media units: {partitionHeader.ContentSizeInMediaUnits} (0x{partitionHeader.ContentSizeInMediaUnits:X})");
builder.AppendLine($" Partition ID: {partitionHeader.PartitionId} (0x{partitionHeader.PartitionId:X})");
builder.AppendLine($" Maker code: {partitionHeader.MakerCode} (0x{partitionHeader.MakerCode:X})");
builder.AppendLine($" Version: {partitionHeader.Version} (0x{partitionHeader.Version:X})");
builder.AppendLine($" Verification hash: {partitionHeader.VerificationHash} (0x{partitionHeader.VerificationHash:X})");
builder.AppendLine($" Program ID: {BitConverter.ToString(partitionHeader.ProgramId).Replace('-', ' ')}");
builder.AppendLine($" Reserved 1: {BitConverter.ToString(partitionHeader.Reserved1).Replace('-', ' ')}");
builder.AppendLine($" Logo region SHA-256 hash: {BitConverter.ToString(partitionHeader.LogoRegionHash).Replace('-', ' ')}");
builder.AppendLine($" Program ID: {(partitionHeader.ProgramId == null ? "[NULL]" : BitConverter.ToString(partitionHeader.ProgramId).Replace('-', ' '))}");
builder.AppendLine($" Reserved 1: {(partitionHeader.Reserved1 == null ? "[NULL]" : BitConverter.ToString(partitionHeader.Reserved1).Replace('-', ' '))}");
builder.AppendLine($" Logo region SHA-256 hash: {(partitionHeader.LogoRegionHash == null ? "[NULL]" : BitConverter.ToString(partitionHeader.LogoRegionHash).Replace('-', ' '))}");
builder.AppendLine($" Product code: {partitionHeader.ProductCode} (0x{partitionHeader.ProductCode:X})");
builder.AppendLine($" Extended header SHA-256 hash: {BitConverter.ToString(partitionHeader.ExtendedHeaderHash).Replace('-', ' ')}");
builder.AppendLine($" Extended header SHA-256 hash: {(partitionHeader.ExtendedHeaderHash == null ? "[NULL]" : BitConverter.ToString(partitionHeader.ExtendedHeaderHash).Replace('-', ' '))}");
builder.AppendLine($" Extended header size in bytes: {partitionHeader.ExtendedHeaderSizeInBytes} (0x{partitionHeader.ExtendedHeaderSizeInBytes:X})");
builder.AppendLine($" Reserved 2: {BitConverter.ToString(partitionHeader.Reserved2).Replace('-', ' ')}");
builder.AppendLine($" Reserved 2: {(partitionHeader.Reserved2 == null ? "[NULL]" : BitConverter.ToString(partitionHeader.Reserved2).Replace('-', ' '))}");
builder.AppendLine(" Flags:");
builder.AppendLine($" Reserved 0: {partitionHeader.Flags.Reserved0} (0x{partitionHeader.Flags.Reserved0:X})");
builder.AppendLine($" Reserved 1: {partitionHeader.Flags.Reserved1} (0x{partitionHeader.Flags.Reserved1:X})");
@@ -553,13 +697,13 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" ExeFS offset, in media units: {partitionHeader.ExeFSOffsetInMediaUnits} (0x{partitionHeader.ExeFSOffsetInMediaUnits:X})");
builder.AppendLine($" ExeFS size, in media units: {partitionHeader.ExeFSSizeInMediaUnits} (0x{partitionHeader.ExeFSSizeInMediaUnits:X})");
builder.AppendLine($" ExeFS hash region size, in media units: {partitionHeader.ExeFSHashRegionSizeInMediaUnits} (0x{partitionHeader.ExeFSHashRegionSizeInMediaUnits:X})");
builder.AppendLine($" Reserved 3: {BitConverter.ToString(partitionHeader.Reserved3).Replace('-', ' ')}");
builder.AppendLine($" Reserved 3: {(partitionHeader.Reserved3 == null ? "[NULL]" : BitConverter.ToString(partitionHeader.Reserved3).Replace('-', ' '))}");
builder.AppendLine($" RomFS offset, in media units: {partitionHeader.RomFSOffsetInMediaUnits} (0x{partitionHeader.RomFSOffsetInMediaUnits:X})");
builder.AppendLine($" RomFS size, in media units: {partitionHeader.RomFSSizeInMediaUnits} (0x{partitionHeader.RomFSSizeInMediaUnits:X})");
builder.AppendLine($" RomFS hash region size, in media units: {partitionHeader.RomFSHashRegionSizeInMediaUnits} (0x{partitionHeader.RomFSHashRegionSizeInMediaUnits:X})");
builder.AppendLine($" Reserved 4: {BitConverter.ToString(partitionHeader.Reserved4).Replace('-', ' ')}");
builder.AppendLine($" ExeFS superblock SHA-256 hash: {BitConverter.ToString(partitionHeader.ExeFSSuperblockHash).Replace('-', ' ')}");
builder.AppendLine($" RomFS superblock SHA-256 hash: {BitConverter.ToString(partitionHeader.RomFSSuperblockHash).Replace('-', ' ')}");
builder.AppendLine($" Reserved 4: {(partitionHeader.Reserved4 == null ? "[NULL]" : BitConverter.ToString(partitionHeader.Reserved4).Replace('-', ' '))}");
builder.AppendLine($" ExeFS superblock SHA-256 hash: {(partitionHeader.ExeFSSuperblockHash == null ? "[NULL]" : BitConverter.ToString(partitionHeader.ExeFSSuperblockHash).Replace('-', ' '))}");
builder.AppendLine($" RomFS superblock SHA-256 hash: {(partitionHeader.RomFSSuperblockHash == null ? "[NULL]" : BitConverter.ToString(partitionHeader.RomFSSuperblockHash).Replace('-', ' '))}");
}
}
}
@@ -592,7 +736,7 @@ namespace BinaryObjectScanner.Wrappers
{
builder.AppendLine($" System control info:");
builder.AppendLine($" Application title: {extendedHeader.SCI.ApplicationTitle}");
builder.AppendLine($" Reserved 1: {BitConverter.ToString(extendedHeader.SCI.Reserved1).Replace('-', ' ')}");
builder.AppendLine($" Reserved 1: {(extendedHeader.SCI.Reserved1 == null ? "[NULL]" : BitConverter.ToString(extendedHeader.SCI.Reserved1).Replace('-', ' '))}");
builder.AppendLine($" Flag: {extendedHeader.SCI.Flag} (0x{extendedHeader.SCI.Flag:X})");
builder.AppendLine($" Remaster version: {extendedHeader.SCI.RemasterVersion} (0x{extendedHeader.SCI.RemasterVersion:X})");
@@ -608,7 +752,7 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Physical region size (in page-multiples): {extendedHeader.SCI.ReadOnlyCodeSetInfo.PhysicalRegionSizeInPages} (0x{extendedHeader.SCI.ReadOnlyCodeSetInfo.PhysicalRegionSizeInPages:X})");
builder.AppendLine($" Size (in bytes): {extendedHeader.SCI.ReadOnlyCodeSetInfo.SizeInBytes} (0x{extendedHeader.SCI.ReadOnlyCodeSetInfo.SizeInBytes:X})");
builder.AppendLine($" Reserved 2: {BitConverter.ToString(extendedHeader.SCI.Reserved2).Replace('-', newChar: ' ')}");
builder.AppendLine($" Reserved 2: {(extendedHeader.SCI.Reserved2 == null ? "[NULL]" : BitConverter.ToString(extendedHeader.SCI.Reserved2).Replace('-', ' '))}");
builder.AppendLine($" Data code set info:");
builder.AppendLine($" Address: {extendedHeader.SCI.DataCodeSetInfo.Address} (0x{extendedHeader.SCI.DataCodeSetInfo.Address:X})");
@@ -616,12 +760,12 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Size (in bytes): {extendedHeader.SCI.DataCodeSetInfo.SizeInBytes} (0x{extendedHeader.SCI.DataCodeSetInfo.SizeInBytes:X})");
builder.AppendLine($" BSS size: {extendedHeader.SCI.BSSSize} (0x{extendedHeader.SCI.BSSSize:X})");
builder.AppendLine($" Dependency module list: {string.Join(", ", extendedHeader.SCI.DependencyModuleList)}");
builder.AppendLine($" Dependency module list: {(extendedHeader.SCI.DependencyModuleList == null ? "[NULL]" : string.Join(", ", extendedHeader.SCI.DependencyModuleList))}");
builder.AppendLine($" System info:");
builder.AppendLine($" SaveData size: {extendedHeader.SCI.SystemInfo.SaveDataSize} (0x{extendedHeader.SCI.SystemInfo.SaveDataSize:X})");
builder.AppendLine($" Jump ID: {extendedHeader.SCI.SystemInfo.JumpID} (0x{extendedHeader.SCI.SystemInfo.JumpID:X})");
builder.AppendLine($" Reserved: {BitConverter.ToString(extendedHeader.SCI.SystemInfo.Reserved).Replace('-', newChar: ' ')}");
builder.AppendLine($" Reserved: {(extendedHeader.SCI.SystemInfo.Reserved == null ? "[NULL]" : BitConverter.ToString(extendedHeader.SCI.SystemInfo.Reserved).Replace('-', ' '))}");
builder.AppendLine($" Access control info:");
builder.AppendLine($" ARM11 local system capabilities:");
@@ -631,30 +775,30 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Flag 2: {extendedHeader.ACI.ARM11LocalSystemCapabilities.Flag2} (0x{extendedHeader.ACI.ARM11LocalSystemCapabilities.Flag2:X})");
builder.AppendLine($" Flag 0: {extendedHeader.ACI.ARM11LocalSystemCapabilities.Flag0} (0x{extendedHeader.ACI.ARM11LocalSystemCapabilities.Flag0:X})");
builder.AppendLine($" Priority: {extendedHeader.ACI.ARM11LocalSystemCapabilities.Priority} (0x{extendedHeader.ACI.ARM11LocalSystemCapabilities.Priority:X})");
builder.AppendLine($" Resource limit descriptors: {string.Join(", ", extendedHeader.ACI.ARM11LocalSystemCapabilities.ResourceLimitDescriptors)}");
builder.AppendLine($" Resource limit descriptors: {(extendedHeader.ACI.ARM11LocalSystemCapabilities.ResourceLimitDescriptors == null ? "[NULL]" : string.Join(", ", extendedHeader.ACI.ARM11LocalSystemCapabilities.ResourceLimitDescriptors))}");
builder.AppendLine($" Storage info:");
builder.AppendLine($" Extdata ID: {extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.ExtdataID} (0x{extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.ExtdataID:X})");
builder.AppendLine($" System savedata IDs: {BitConverter.ToString(extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.SystemSavedataIDs).Replace('-', newChar: ' ')}");
builder.AppendLine($" Storage accessible unique IDs: {BitConverter.ToString(extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.StorageAccessibleUniqueIDs).Replace('-', newChar: ' ')}");
builder.AppendLine($" File system access info: {BitConverter.ToString(extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.FileSystemAccessInfo).Replace('-', newChar: ' ')}");
builder.AppendLine($" System savedata IDs: {(extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.SystemSavedataIDs == null ? "[NULL]" : BitConverter.ToString(extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.SystemSavedataIDs).Replace('-', ' '))}");
builder.AppendLine($" Storage accessible unique IDs: {(extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.StorageAccessibleUniqueIDs == null ? "[NULL]" : BitConverter.ToString(extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.StorageAccessibleUniqueIDs).Replace('-', ' '))}");
builder.AppendLine($" File system access info: {(extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.FileSystemAccessInfo == null ? "[NULL]" : BitConverter.ToString(extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.FileSystemAccessInfo).Replace('-', ' '))}");
builder.AppendLine($" Other attributes: {extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.OtherAttributes} (0x{extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.OtherAttributes:X})");
builder.AppendLine($" Service access control: {string.Join(", ", extendedHeader.ACI.ARM11LocalSystemCapabilities.ServiceAccessControl)}");
builder.AppendLine($" Extended service access control: {string.Join(", ", extendedHeader.ACI.ARM11LocalSystemCapabilities.ExtendedServiceAccessControl)}");
builder.AppendLine($" Reserved: {BitConverter.ToString(extendedHeader.ACI.ARM11LocalSystemCapabilities.Reserved).Replace('-', newChar: ' ')}");
builder.AppendLine($" Service access control: {(extendedHeader.ACI.ARM11LocalSystemCapabilities.ServiceAccessControl == null ? "[NULL]" : string.Join(", ", extendedHeader.ACI.ARM11LocalSystemCapabilities.ServiceAccessControl))}");
builder.AppendLine($" Extended service access control: {(extendedHeader.ACI.ARM11LocalSystemCapabilities.ExtendedServiceAccessControl == null ? "[NULL]" : string.Join(", ", extendedHeader.ACI.ARM11LocalSystemCapabilities.ExtendedServiceAccessControl))}");
builder.AppendLine($" Reserved: {(extendedHeader.ACI.ARM11LocalSystemCapabilities.Reserved == null ? "[NULL]" : BitConverter.ToString(extendedHeader.ACI.ARM11LocalSystemCapabilities.Reserved).Replace('-', ' '))}");
builder.AppendLine($" Resource limit cateogry: {extendedHeader.ACI.ARM11LocalSystemCapabilities.ResourceLimitCategory} (0x{extendedHeader.ACI.ARM11LocalSystemCapabilities.ResourceLimitCategory:X})");
builder.AppendLine($" ARM11 kernel capabilities:");
builder.AppendLine($" Descriptors: {string.Join(", ", extendedHeader.ACI.ARM11KernelCapabilities.Descriptors)}");
builder.AppendLine($" Reserved: {BitConverter.ToString(extendedHeader.ACI.ARM11KernelCapabilities.Reserved).Replace('-', newChar: ' ')}");
builder.AppendLine($" Descriptors: {(extendedHeader.ACI.ARM11KernelCapabilities.Descriptors == null ? "[NULL]" : string.Join(", ", extendedHeader.ACI.ARM11KernelCapabilities.Descriptors))}");
builder.AppendLine($" Reserved: {(extendedHeader.ACI.ARM11KernelCapabilities.Reserved == null ? "[NULL]" : BitConverter.ToString(extendedHeader.ACI.ARM11KernelCapabilities.Reserved).Replace('-', ' '))}");
builder.AppendLine($" ARM9 access control:");
builder.AppendLine($" Descriptors: {BitConverter.ToString(extendedHeader.ACI.ARM9AccessControl.Descriptors).Replace('-', newChar: ' ')}");
builder.AppendLine($" Descriptors: {(extendedHeader.ACI.ARM9AccessControl.Descriptors == null ? "[NULL]" : BitConverter.ToString(extendedHeader.ACI.ARM9AccessControl.Descriptors).Replace('-', ' '))}");
builder.AppendLine($" Descriptor version: {extendedHeader.ACI.ARM9AccessControl.DescriptorVersion} (0x{extendedHeader.ACI.ARM9AccessControl.DescriptorVersion:X})");
builder.AppendLine($" AccessDec signature (RSA-2048-SHA256): {BitConverter.ToString(extendedHeader.AccessDescSignature).Replace('-', ' ')}");
builder.AppendLine($" NCCH HDR RSA-2048 public key: {BitConverter.ToString(extendedHeader.NCCHHDRPublicKey).Replace('-', ' ')}");
builder.AppendLine($" AccessDec signature (RSA-2048-SHA256): {(extendedHeader.AccessDescSignature == null ? "[NULL]" : BitConverter.ToString(extendedHeader.AccessDescSignature).Replace('-', ' '))}");
builder.AppendLine($" NCCH HDR RSA-2048 public key: {(extendedHeader.NCCHHDRPublicKey == null ? "[NULL]" : BitConverter.ToString(extendedHeader.NCCHHDRPublicKey).Replace('-', ' '))}");
builder.AppendLine($" Access control info (for limitations of first ACI):");
@@ -665,26 +809,26 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Flag 2: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Flag2} (0x{extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Flag2:X})");
builder.AppendLine($" Flag 0: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Flag0} (0x{extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Flag0:X})");
builder.AppendLine($" Priority: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Priority} (0x{extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Priority:X})");
builder.AppendLine($" Resource limit descriptors: {string.Join(", ", extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ResourceLimitDescriptors)}");
builder.AppendLine($" Resource limit descriptors: {(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ResourceLimitDescriptors == null ? "[NULL]" : string.Join(", ", extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ResourceLimitDescriptors))}");
builder.AppendLine($" Storage info:");
builder.AppendLine($" Extdata ID: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.ExtdataID} (0x{extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.ExtdataID:X})");
builder.AppendLine($" System savedata IDs: {BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.SystemSavedataIDs).Replace('-', newChar: ' ')}");
builder.AppendLine($" Storage accessible unique IDs: {BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.StorageAccessibleUniqueIDs).Replace('-', newChar: ' ')}");
builder.AppendLine($" File system access info: {BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.FileSystemAccessInfo).Replace('-', newChar: ' ')}");
builder.AppendLine($" System savedata IDs: {(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.SystemSavedataIDs == null ? "[NULL]" : BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.SystemSavedataIDs).Replace('-', ' '))}");
builder.AppendLine($" Storage accessible unique IDs: {(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.StorageAccessibleUniqueIDs == null ? "[NULL]" : BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.StorageAccessibleUniqueIDs).Replace('-', ' '))}");
builder.AppendLine($" File system access info: {(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.FileSystemAccessInfo == null ? "[NULL]" : BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.FileSystemAccessInfo).Replace('-', ' '))}");
builder.AppendLine($" Other attributes: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.OtherAttributes} (0x{extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.OtherAttributes:X})");
builder.AppendLine($" Service access control: {string.Join(", ", extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ServiceAccessControl)}");
builder.AppendLine($" Extended service access control: {string.Join(", ", extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ExtendedServiceAccessControl)}");
builder.AppendLine($" Reserved: {BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Reserved).Replace('-', newChar: ' ')}");
builder.AppendLine($" Service access control: {(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ServiceAccessControl == null ? "[NULL]" : string.Join(", ", extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ServiceAccessControl))}");
builder.AppendLine($" Extended service access control: {(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ExtendedServiceAccessControl == null ? "[NULL]" : string.Join(", ", extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ExtendedServiceAccessControl))}");
builder.AppendLine($" Reserved: {(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Reserved == null ? "[NULL]" : BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Reserved).Replace('-', ' '))}");
builder.AppendLine($" Resource limit cateogry: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ResourceLimitCategory} (0x{extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ResourceLimitCategory:X})");
builder.AppendLine($" ARM11 kernel capabilities:");
builder.AppendLine($" Descriptors: {string.Join(", ", extendedHeader.ACIForLimitations.ARM11KernelCapabilities.Descriptors)}");
builder.AppendLine($" Reserved: {BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11KernelCapabilities.Reserved).Replace('-', newChar: ' ')}");
builder.AppendLine($" Descriptors: {(extendedHeader.ACIForLimitations.ARM11KernelCapabilities.Descriptors == null ? "[NULL]" : string.Join(", ", extendedHeader.ACIForLimitations.ARM11KernelCapabilities.Descriptors))}");
builder.AppendLine($" Reserved: {(extendedHeader.ACIForLimitations.ARM11KernelCapabilities.Reserved == null ? "[NULL]" : BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11KernelCapabilities.Reserved).Replace('-', ' '))}");
builder.AppendLine($" ARM9 access control:");
builder.AppendLine($" Descriptors: {BitConverter.ToString(extendedHeader.ACIForLimitations.ARM9AccessControl.Descriptors).Replace('-', newChar: ' ')}");
builder.AppendLine($" Descriptors: {(extendedHeader.ACIForLimitations.ARM9AccessControl.Descriptors == null ? "[NULL]" : BitConverter.ToString(extendedHeader.ACIForLimitations.ARM9AccessControl.Descriptors).Replace('-', ' '))}");
builder.AppendLine($" Descriptor version: {extendedHeader.ACIForLimitations.ARM9AccessControl.DescriptorVersion} (0x{extendedHeader.ACIForLimitations.ARM9AccessControl.DescriptorVersion:X})");
}
}
@@ -726,14 +870,14 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine(value: $" File size: {fileHeader.FileSize} (0x{fileHeader.FileSize:X})");
}
builder.AppendLine(value: $" Reserved: {BitConverter.ToString(exeFSHeader.Reserved).Replace('-', ' ')}");
builder.AppendLine(value: $" Reserved: {(exeFSHeader.Reserved == null ? "[NULL]" : BitConverter.ToString(exeFSHeader.Reserved).Replace('-', ' '))}");
builder.AppendLine($" File hashes:");
for (int j = 0; j < exeFSHeader.FileHashes.Length; j++)
{
var fileHash = exeFSHeader.FileHashes[j];
builder.AppendLine(value: $" File Hash {j}");
builder.AppendLine(value: $" SHA-256: {BitConverter.ToString(fileHash).Replace('-', ' ')}");
builder.AppendLine(value: $" SHA-256: {(fileHash == null ? "[NULL]" : BitConverter.ToString(fileHash).Replace('-', ' '))}");
}
}
}
@@ -771,16 +915,16 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine(value: $" Level 1 logical offset: {romFSHeader.Level1LogicalOffset} (0x{romFSHeader.Level1LogicalOffset:X})");
builder.AppendLine(value: $" Level 1 hashdata size: {romFSHeader.Level1HashdataSize} (0x{romFSHeader.Level1HashdataSize:X})");
builder.AppendLine(value: $" Level 1 block size: {romFSHeader.Level1BlockSizeLog2} (0x{romFSHeader.Level1BlockSizeLog2:X})");
builder.AppendLine(value: $" Reserved 1: {BitConverter.ToString(romFSHeader.Reserved1).Replace('-', ' ')}");
builder.AppendLine(value: $" Reserved 1: {(romFSHeader.Reserved1 == null ? "[NULL]" : BitConverter.ToString(romFSHeader.Reserved1).Replace('-', ' '))}");
builder.AppendLine(value: $" Level 2 logical offset: {romFSHeader.Level2LogicalOffset} (0x{romFSHeader.Level2LogicalOffset:X})");
builder.AppendLine(value: $" Level 2 hashdata size: {romFSHeader.Level2HashdataSize} (0x{romFSHeader.Level2HashdataSize:X})");
builder.AppendLine(value: $" Level 2 block size: {romFSHeader.Level2BlockSizeLog2} (0x{romFSHeader.Level2BlockSizeLog2:X})");
builder.AppendLine(value: $" Reserved 2: {BitConverter.ToString(romFSHeader.Reserved2).Replace('-', ' ')}");
builder.AppendLine(value: $" Reserved 2: {(romFSHeader.Reserved2 == null ? "[NULL]" : BitConverter.ToString(romFSHeader.Reserved2).Replace('-', ' '))}");
builder.AppendLine(value: $" Level 3 logical offset: {romFSHeader.Level3LogicalOffset} (0x{romFSHeader.Level3LogicalOffset:X})");
builder.AppendLine(value: $" Level 3 hashdata size: {romFSHeader.Level3HashdataSize} (0x{romFSHeader.Level3HashdataSize:X})");
builder.AppendLine(value: $" Level 3 block size: {romFSHeader.Level3BlockSizeLog2} (0x{romFSHeader.Level3BlockSizeLog2:X})");
builder.AppendLine(value: $" Reserved 3: {BitConverter.ToString(romFSHeader.Reserved3).Replace('-', ' ')}");
builder.AppendLine(value: $" Reserved 4: {BitConverter.ToString(romFSHeader.Reserved4).Replace('-', ' ')}");
builder.AppendLine(value: $" Reserved 3: {(romFSHeader.Reserved3 == null ? "[NULL]" : BitConverter.ToString(romFSHeader.Reserved3).Replace('-', ' '))}");
builder.AppendLine(value: $" Reserved 4: {(romFSHeader.Reserved4 == null ? "[NULL]" : BitConverter.ToString(romFSHeader.Reserved4).Replace('-', ' '))}");
builder.AppendLine(value: $" Optional info size: {romFSHeader.OptionalInfoSize} (0x{romFSHeader.OptionalInfoSize:X})");
}
}

View File

@@ -265,7 +265,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the NCF</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>An NCF wrapper on success, null on failure</returns>
#if NET48
public static NCF Create(byte[] data, int offset)
#else
public static NCF? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -285,7 +289,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the NCF</param>
/// <returns>An NCF wrapper on success, null on failure</returns>
#if NET48
public static NCF Create(Stream data)
#else
public static NCF? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)

View File

@@ -22,7 +22,11 @@ namespace BinaryObjectScanner.Wrappers
#region Standard Fields
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Magic"/>
#if NET48
public string Stub_Magic => _model.Stub.Header.Magic;
#else
public string? Stub_Magic => _model.Stub.Header.Magic;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.LastPageBytes"/>
public ushort Stub_LastPageBytes => _model.Stub.Header.LastPageBytes;
@@ -68,7 +72,11 @@ namespace BinaryObjectScanner.Wrappers
#region PE Extensions
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Reserved1"/>
#if NET48
public ushort[] Stub_Reserved1 => _model.Stub.Header.Reserved1;
#else
public ushort[]? Stub_Reserved1 => _model.Stub.Header.Reserved1;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.OEMIdentifier"/>
public ushort Stub_OEMIdentifier => _model.Stub.Header.OEMIdentifier;
@@ -77,7 +85,11 @@ namespace BinaryObjectScanner.Wrappers
public ushort Stub_OEMInformation => _model.Stub.Header.OEMInformation;
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Reserved2"/>
#if NET48
public ushort[] Stub_Reserved2 => _model.Stub.Header.Reserved2;
#else
public ushort[]? Stub_Reserved2 => _model.Stub.Header.Reserved2;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.NewExeHeaderAddr"/>
public uint Stub_NewExeHeaderAddr => _model.Stub.Header.NewExeHeaderAddr;
@@ -89,7 +101,11 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.Magic"/>
#if NET48
public string Magic => _model.Header.Magic;
#else
public string? Magic => _model.Header.Magic;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.LinkerVersion"/>
public byte LinkerVersion => _model.Header.LinkerVersion;
@@ -274,7 +290,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the executable</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>An NE executable wrapper on success, null on failure</returns>
#if NET48
public static NewExecutable Create(byte[] data, int offset)
#else
public static NewExecutable? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -294,7 +314,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the executable</param>
/// <returns>An NE executable wrapper on success, null on failure</returns>
#if NET48
public static NewExecutable Create(Stream data)
#else
public static NewExecutable? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -379,10 +403,10 @@ namespace BinaryObjectScanner.Wrappers
{
builder.AppendLine(" MS-DOS Stub Extended Header Information:");
builder.AppendLine(" -------------------------");
builder.AppendLine($" Reserved words: {string.Join(", ", Stub_Reserved1)}");
builder.AppendLine($" Reserved words: {(Stub_Reserved1 == null ? "[NULL]" : string.Join(", ", Stub_Reserved1))}");
builder.AppendLine($" OEM identifier: {Stub_OEMIdentifier} (0x{Stub_OEMIdentifier:X})");
builder.AppendLine($" OEM information: {Stub_OEMInformation} (0x{Stub_OEMInformation:X})");
builder.AppendLine($" Reserved words: {string.Join(", ", Stub_Reserved2)}");
builder.AppendLine($" Reserved words: {(Stub_Reserved2 == null ? "[NULL]" : string.Join(", ", Stub_Reserved2))}");
builder.AppendLine($" New EXE header address: {Stub_NewExeHeaderAddr} (0x{Stub_NewExeHeaderAddr:X})");
builder.AppendLine();
}
@@ -674,7 +698,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="length">How many bytes to read, -1 means read until end</param>
/// <returns>Byte array representing the range, null on error</returns>
[Obsolete]
#if NET48
public byte[] ReadArbitraryRange(int rangeStart = -1, int length = -1)
#else
public byte[]? ReadArbitraryRange(int rangeStart = -1, int length = -1)
#endif
{
// If we have an unset range start, read from the start of the source
if (rangeStart == -1)

View File

@@ -18,13 +18,21 @@ namespace BinaryObjectScanner.Wrappers
#region Common Header
/// <inheritdoc cref="Models.Nitro.CommonHeader.GameTitle"/>
#if NET48
public string GameTitle => _model.CommonHeader.GameTitle;
#else
public string? GameTitle => _model.CommonHeader.GameTitle;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.GameCode"/>
public uint GameCode => _model.CommonHeader.GameCode;
/// <inheritdoc cref="Models.Nitro.CommonHeader.MakerCode"/>
#if NET48
public string MakerCode => _model.CommonHeader.MakerCode;
#else
public string? MakerCode => _model.CommonHeader.MakerCode;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.UnitCode"/>
public SabreTools.Models.Nitro.Unitcode UnitCode => _model.CommonHeader.UnitCode;
@@ -36,7 +44,11 @@ namespace BinaryObjectScanner.Wrappers
public byte DeviceCapacity => _model.CommonHeader.DeviceCapacity;
/// <inheritdoc cref="Models.Nitro.CommonHeader.Reserved1"/>
#if NET48
public byte[] Reserved1 => _model.CommonHeader.Reserved1;
#else
public byte[]? Reserved1 => _model.CommonHeader.Reserved1;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.GameRevision"/>
public ushort GameRevision => _model.CommonHeader.GameRevision;
@@ -117,7 +129,11 @@ namespace BinaryObjectScanner.Wrappers
public uint ARM7Autoload => _model.CommonHeader.ARM7Autoload;
/// <inheritdoc cref="Models.Nitro.CommonHeader.SecureDisable"/>
#if NET48
public byte[] SecureDisable => _model.CommonHeader.SecureDisable;
#else
public byte[]? SecureDisable => _model.CommonHeader.SecureDisable;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.NTRRegionRomSize"/>
public uint NTRRegionRomSize => _model.CommonHeader.NTRRegionRomSize;
@@ -126,10 +142,18 @@ namespace BinaryObjectScanner.Wrappers
public uint HeaderSize => _model.CommonHeader.HeaderSize;
/// <inheritdoc cref="Models.Nitro.CommonHeader.Reserved2"/>
#if NET48
public byte[] Reserved2 => _model.CommonHeader.Reserved2;
#else
public byte[]? Reserved2 => _model.CommonHeader.Reserved2;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.NintendoLogo"/>
#if NET48
public byte[] NintendoLogo => _model.CommonHeader.NintendoLogo;
#else
public byte[]? NintendoLogo => _model.CommonHeader.NintendoLogo;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.NintendoLogoCRC"/>
public ushort NintendoLogoCRC => _model.CommonHeader.NintendoLogoCRC;
@@ -138,20 +162,36 @@ namespace BinaryObjectScanner.Wrappers
public ushort HeaderCRC => _model.CommonHeader.HeaderCRC;
/// <inheritdoc cref="Models.Nitro.CommonHeader.DebuggerReserved"/>
#if NET48
public byte[] DebuggerReserved => _model.CommonHeader.DebuggerReserved;
#else
public byte[]? DebuggerReserved => _model.CommonHeader.DebuggerReserved;
#endif
#endregion
#region Extended DSi Header
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.GlobalMBK15Settings"/>
#if NET48
public uint[] GlobalMBK15Settings => _model.ExtendedDSiHeader?.GlobalMBK15Settings;
#else
public uint[]? GlobalMBK15Settings => _model.ExtendedDSiHeader?.GlobalMBK15Settings;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.LocalMBK68SettingsARM9"/>
#if NET48
public uint[] LocalMBK68SettingsARM9 => _model.ExtendedDSiHeader?.LocalMBK68SettingsARM9;
#else
public uint[]? LocalMBK68SettingsARM9 => _model.ExtendedDSiHeader?.LocalMBK68SettingsARM9;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.LocalMBK68SettingsARM7"/>
#if NET48
public uint[] LocalMBK68SettingsARM7 => _model.ExtendedDSiHeader?.LocalMBK68SettingsARM7;
#else
public uint[]? LocalMBK68SettingsARM7 => _model.ExtendedDSiHeader?.LocalMBK68SettingsARM7;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.GlobalMBK9Setting"/>
public uint? GlobalMBK9Setting => _model.ExtendedDSiHeader?.GlobalMBK9Setting;
@@ -241,7 +281,11 @@ namespace BinaryObjectScanner.Wrappers
public uint? ModcryptArea2Size => _model.ExtendedDSiHeader?.ModcryptArea2Size;
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.TitleID"/>
#if NET48
public byte[] TitleID => _model.ExtendedDSiHeader?.TitleID;
#else
public byte[]? TitleID => _model.ExtendedDSiHeader?.TitleID;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.DSiWarePublicSavSize"/>
public uint? DSiWarePublicSavSize => _model.ExtendedDSiHeader?.DSiWarePublicSavSize;
@@ -250,50 +294,106 @@ namespace BinaryObjectScanner.Wrappers
public uint? DSiWarePrivateSavSize => _model.ExtendedDSiHeader?.DSiWarePrivateSavSize;
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.ReservedZero"/>
#if NET48
public byte[] ReservedZero => _model.ExtendedDSiHeader?.ReservedZero;
#else
public byte[]? ReservedZero => _model.ExtendedDSiHeader?.ReservedZero;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.Unknown2"/>
#if NET48
public byte[] Unknown2 => _model.ExtendedDSiHeader?.Unknown2;
#else
public byte[]? Unknown2 => _model.ExtendedDSiHeader?.Unknown2;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.ARM9WithSecureAreaSHA1HMACHash"/>
#if NET48
public byte[] ARM9WithSecureAreaSHA1HMACHash => _model.ExtendedDSiHeader?.ARM9WithSecureAreaSHA1HMACHash;
#else
public byte[]? ARM9WithSecureAreaSHA1HMACHash => _model.ExtendedDSiHeader?.ARM9WithSecureAreaSHA1HMACHash;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.ARM7SHA1HMACHash"/>
#if NET48
public byte[] ARM7SHA1HMACHash => _model.ExtendedDSiHeader?.ARM7SHA1HMACHash;
#else
public byte[]? ARM7SHA1HMACHash => _model.ExtendedDSiHeader?.ARM7SHA1HMACHash;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.DigestMasterSHA1HMACHash"/>
#if NET48
public byte[] DigestMasterSHA1HMACHash => _model.ExtendedDSiHeader?.DigestMasterSHA1HMACHash;
#else
public byte[]? DigestMasterSHA1HMACHash => _model.ExtendedDSiHeader?.DigestMasterSHA1HMACHash;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.BannerSHA1HMACHash"/>
#if NET48
public byte[] BannerSHA1HMACHash => _model.ExtendedDSiHeader?.BannerSHA1HMACHash;
#else
public byte[]? BannerSHA1HMACHash => _model.ExtendedDSiHeader?.BannerSHA1HMACHash;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.ARM9iDecryptedSHA1HMACHash"/>
#if NET48
public byte[] ARM9iDecryptedSHA1HMACHash => _model.ExtendedDSiHeader?.ARM9iDecryptedSHA1HMACHash;
#else
public byte[]? ARM9iDecryptedSHA1HMACHash => _model.ExtendedDSiHeader?.ARM9iDecryptedSHA1HMACHash;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.ARM7iDecryptedSHA1HMACHash"/>
#if NET48
public byte[] ARM7iDecryptedSHA1HMACHash => _model.ExtendedDSiHeader?.ARM7iDecryptedSHA1HMACHash;
#else
public byte[]? ARM7iDecryptedSHA1HMACHash => _model.ExtendedDSiHeader?.ARM7iDecryptedSHA1HMACHash;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.Reserved5"/>
#if NET48
public byte[] Reserved5 => _model.ExtendedDSiHeader?.Reserved5;
#else
public byte[]? Reserved5 => _model.ExtendedDSiHeader?.Reserved5;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.ARM9NoSecureAreaSHA1HMACHash"/>
#if NET48
public byte[] ARM9NoSecureAreaSHA1HMACHash => _model.ExtendedDSiHeader?.ARM9NoSecureAreaSHA1HMACHash;
#else
public byte[]? ARM9NoSecureAreaSHA1HMACHash => _model.ExtendedDSiHeader?.ARM9NoSecureAreaSHA1HMACHash;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.Reserved6"/>
#if NET48
public byte[] Reserved6 => _model.ExtendedDSiHeader?.Reserved6;
#else
public byte[]? Reserved6 => _model.ExtendedDSiHeader?.Reserved6;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.ReservedAndUnchecked"/>
#if NET48
public byte[] ReservedAndUnchecked => _model.ExtendedDSiHeader?.ReservedAndUnchecked;
#else
public byte[]? ReservedAndUnchecked => _model.ExtendedDSiHeader?.ReservedAndUnchecked;
#endif
/// <inheritdoc cref="Models.Nitro.ExtendedDSiHeader.RSASignature"/>
#if NET48
public byte[] RSASignature => _model.ExtendedDSiHeader?.RSASignature;
#else
public byte[]? RSASignature => _model.ExtendedDSiHeader?.RSASignature;
#endif
#endregion
#region Secure Area
/// <inheritdoc cref="Models.Nitro.Cart.SecureArea"/>
#if NET48
public byte[] SecureArea => _model.SecureArea;
#else
public byte[]? SecureArea => _model.SecureArea;
#endif
#endregion
@@ -358,7 +458,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the archive</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A NDS cart image wrapper on success, null on failure</returns>
#if NET48
public static Nitro Create(byte[] data, int offset)
#else
public static Nitro? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -378,7 +482,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the archive</param>
/// <returns>A NDS cart image wrapper on success, null on failure</returns>
#if NET48
public static Nitro Create(Stream data)
#else
public static Nitro? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -434,7 +542,7 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Unit code: {UnitCode} (0x{UnitCode:X})");
builder.AppendLine($" Encryption seed select: {EncryptionSeedSelect} (0x{EncryptionSeedSelect:X})");
builder.AppendLine($" Device capacity: {DeviceCapacity} (0x{DeviceCapacity:X})");
builder.AppendLine($" Reserved 1: {BitConverter.ToString(Reserved1).Replace('-', ' ')}");
builder.AppendLine($" Reserved 1: {(Reserved1 == null ? "[NULL]" : BitConverter.ToString(Reserved1).Replace('-', ' '))}");
builder.AppendLine($" Game revision: {GameRevision} (0x{GameRevision:X})");
builder.AppendLine($" Rom version: {RomVersion} (0x{RomVersion:X})");
builder.AppendLine($" ARM9 rom offset: {ARM9RomOffset} (0x{ARM9RomOffset:X})");
@@ -463,11 +571,11 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Secure disable: {SecureDisable} (0x{SecureDisable:X})");
builder.AppendLine($" NTR region rom size: {NTRRegionRomSize} (0x{NTRRegionRomSize:X})");
builder.AppendLine($" Header size: {HeaderSize} (0x{HeaderSize:X})");
builder.AppendLine($" Reserved 2: {BitConverter.ToString(Reserved2).Replace('-', ' ')}");
builder.AppendLine($" Nintendo logo: {BitConverter.ToString(NintendoLogo).Replace('-', ' ')}");
builder.AppendLine($" Reserved 2: {(Reserved2 == null ? "[NULL]" : BitConverter.ToString(Reserved2).Replace('-', ' '))}");
builder.AppendLine($" Nintendo logo: {(NintendoLogo == null ? "[NULL]" : BitConverter.ToString(NintendoLogo).Replace('-', ' '))}");
builder.AppendLine($" Nintendo logo CRC: {NintendoLogoCRC} (0x{NintendoLogoCRC:X})");
builder.AppendLine($" Header CRC: {HeaderCRC} (0x{HeaderCRC:X})");
builder.AppendLine($" Debugger reserved: {BitConverter.ToString(DebuggerReserved).Replace('-', ' ')}");
builder.AppendLine($" Debugger reserved: {(DebuggerReserved == null ? "[NULL]" : BitConverter.ToString(DebuggerReserved).Replace('-', ' '))}");
builder.AppendLine();
}
@@ -485,9 +593,9 @@ namespace BinaryObjectScanner.Wrappers
}
else
{
builder.AppendLine($" Global MBK1..MBK5 settings: {string.Join(", ", GlobalMBK15Settings)}");
builder.AppendLine($" Local MBK6..MBK8 settings for ARM9: {string.Join(", ", LocalMBK68SettingsARM9)}");
builder.AppendLine($" Local MBK6..MBK8 settings for ARM7: {string.Join(", ", LocalMBK68SettingsARM7)}");
builder.AppendLine($" Global MBK1..MBK5 settings: {(GlobalMBK15Settings == null ? "[NULL]" : string.Join(", ", GlobalMBK15Settings))}");
builder.AppendLine($" Local MBK6..MBK8 settings for ARM9: {(LocalMBK68SettingsARM9 == null ? "[NULL]" : string.Join(", ", LocalMBK68SettingsARM9))}");
builder.AppendLine($" Local MBK6..MBK8 settings for ARM7: {(LocalMBK68SettingsARM7 == null ? "[NULL]" : string.Join(", ", LocalMBK68SettingsARM7))}");
builder.AppendLine($" Global MBK9 setting: {GlobalMBK9Setting} (0x{GlobalMBK9Setting:X})");
builder.AppendLine($" Region flags: {RegionFlags} (0x{RegionFlags:X})");
builder.AppendLine($" Access control: {AccessControl} (0x{AccessControl:X})");
@@ -517,22 +625,22 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Modcrypt area 1 size: {ModcryptArea1Size} (0x{ModcryptArea1Size:X})");
builder.AppendLine($" Modcrypt area 2 offset: {ModcryptArea2Offset} (0x{ModcryptArea2Offset:X})");
builder.AppendLine($" Modcrypt area 2 size: {ModcryptArea2Size} (0x{ModcryptArea2Size:X})");
builder.AppendLine($" Title ID: {BitConverter.ToString(TitleID).Replace('-', ' ')}");
builder.AppendLine($" Title ID: {(TitleID == null ? "[NULL]" : BitConverter.ToString(TitleID).Replace('-', ' '))}");
builder.AppendLine($" DSiWare 'public.sav' size: {DSiWarePublicSavSize} (0x{DSiWarePublicSavSize:X})");
builder.AppendLine($" DSiWare 'private.sav' size: {DSiWarePrivateSavSize} (0x{DSiWarePrivateSavSize:X})");
builder.AppendLine($" Reserved (zero): {BitConverter.ToString(ReservedZero).Replace('-', ' ')}");
builder.AppendLine($" Unknown 2: {BitConverter.ToString(Unknown2).Replace('-', ' ')}");
builder.AppendLine($" ARM9 (with encrypted secure area) SHA1 HMAC hash: {BitConverter.ToString(ARM9WithSecureAreaSHA1HMACHash).Replace('-', ' ')}");
builder.AppendLine($" ARM7 SHA1 HMAC hash: {BitConverter.ToString(ARM7SHA1HMACHash).Replace('-', ' ')}");
builder.AppendLine($" Digest master SHA1 HMAC hash: {BitConverter.ToString(DigestMasterSHA1HMACHash).Replace('-', ' ')}");
builder.AppendLine($" Banner SHA1 HMAC hash: {BitConverter.ToString(BannerSHA1HMACHash).Replace('-', ' ')}");
builder.AppendLine($" ARM9i (decrypted) SHA1 HMAC hash: {BitConverter.ToString(ARM9iDecryptedSHA1HMACHash).Replace('-', ' ')}");
builder.AppendLine($" ARM7i (decrypted) SHA1 HMAC hash: {BitConverter.ToString(ARM7iDecryptedSHA1HMACHash).Replace('-', ' ')}");
builder.AppendLine($" Reserved 5: {BitConverter.ToString(Reserved5).Replace('-', ' ')}");
builder.AppendLine($" ARM9 (without secure area) SHA1 HMAC hash: {BitConverter.ToString(ARM9NoSecureAreaSHA1HMACHash).Replace('-', ' ')}");
builder.AppendLine($" Reserved 6: {BitConverter.ToString(Reserved6).Replace('-', ' ')}");
builder.AppendLine($" Reserved and unchecked region: {BitConverter.ToString(ReservedAndUnchecked).Replace('-', ' ')}");
builder.AppendLine($" RSA signature: {BitConverter.ToString(RSASignature).Replace('-', ' ')}");
builder.AppendLine($" Reserved (zero): {(ReservedZero == null ? "[NULL]" : BitConverter.ToString(ReservedZero).Replace('-', ' '))}");
builder.AppendLine($" Unknown 2: {(Unknown2 == null ? "[NULL]" : BitConverter.ToString(Unknown2).Replace('-', ' '))}");
builder.AppendLine($" ARM9 (with encrypted secure area) SHA1 HMAC hash: {(ARM9WithSecureAreaSHA1HMACHash == null ? "[NULL]" : BitConverter.ToString(ARM9WithSecureAreaSHA1HMACHash).Replace('-', ' '))}");
builder.AppendLine($" ARM7 SHA1 HMAC hash: {(ARM7SHA1HMACHash == null ? "[NULL]" : BitConverter.ToString(ARM7SHA1HMACHash).Replace('-', ' '))}");
builder.AppendLine($" Digest master SHA1 HMAC hash: {(DigestMasterSHA1HMACHash == null ? "[NULL]" : BitConverter.ToString(DigestMasterSHA1HMACHash).Replace('-', ' '))}");
builder.AppendLine($" Banner SHA1 HMAC hash: {(BannerSHA1HMACHash == null ? "[NULL]" : BitConverter.ToString(BannerSHA1HMACHash).Replace('-', ' '))}");
builder.AppendLine($" ARM9i (decrypted) SHA1 HMAC hash: {(ARM9iDecryptedSHA1HMACHash == null ? "[NULL]" : BitConverter.ToString(ARM9iDecryptedSHA1HMACHash).Replace('-', ' '))}");
builder.AppendLine($" ARM7i (decrypted) SHA1 HMAC hash: {(ARM7iDecryptedSHA1HMACHash == null ? "[NULL]" : BitConverter.ToString(ARM7iDecryptedSHA1HMACHash).Replace('-', ' '))}");
builder.AppendLine($" Reserved 5: {(Reserved5 == null ? "[NULL]" : BitConverter.ToString(Reserved5).Replace('-', ' '))}");
builder.AppendLine($" ARM9 (without secure area) SHA1 HMAC hash: {(ARM9NoSecureAreaSHA1HMACHash == null ? "[NULL]" : BitConverter.ToString(ARM9NoSecureAreaSHA1HMACHash).Replace('-', ' '))}");
builder.AppendLine($" Reserved 6: {(Reserved6 == null ? "[NULL]" : BitConverter.ToString(Reserved6).Replace('-', ' '))}");
builder.AppendLine($" Reserved and unchecked region: {(ReservedAndUnchecked == null ? "[NULL]" : BitConverter.ToString(ReservedAndUnchecked).Replace('-', ' '))}");
builder.AppendLine($" RSA signature: {(RSASignature == null ? "[NULL]" : BitConverter.ToString(RSASignature).Replace('-', ' '))}");
}
builder.AppendLine();
}
@@ -545,7 +653,7 @@ namespace BinaryObjectScanner.Wrappers
{
builder.AppendLine(" Secure Area Information:");
builder.AppendLine(" -------------------------");
builder.AppendLine($" {BitConverter.ToString(SecureArea).Replace('-', ' ')}");
builder.AppendLine($" {(SecureArea == null ? "[NULL]" : BitConverter.ToString(SecureArea).Replace('-', ' '))}");
builder.AppendLine();
}

View File

@@ -17,7 +17,11 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.PAK.Header.Signature"/>
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
#endif
/// <inheritdoc cref="Models.PAK.Header.DirectoryOffset"/>
public uint DirectoryOffset => _model.Header.DirectoryOffset;
@@ -76,7 +80,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the PAK</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A PAK wrapper on success, null on failure</returns>
#if NET48
public static PAK Create(byte[] data, int offset)
#else
public static PAK? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -96,7 +104,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the PAK</param>
/// <returns>A PAK wrapper on success, null on failure</returns>
#if NET48
public static PAK Create(Stream data)
#else
public static PAK? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -229,20 +241,36 @@ namespace BinaryObjectScanner.Wrappers
return false;
// Read the item data
#if NET48
byte[] data = ReadFromDataSource((int)directoryItem.ItemOffset, (int)directoryItem.ItemLength);
#else
byte[] data = ReadFromDataSource((int)directoryItem.ItemOffset, (int)directoryItem.ItemLength);
#endif
if (data == null)
return false;
// Create the filename
#if NET48
string filename = directoryItem.ItemName;
#else
string? filename = directoryItem.ItemName;
#endif
// If we have an invalid output directory
if (string.IsNullOrWhiteSpace(outputDirectory))
return false;
// Create the full output path
filename = Path.Combine(outputDirectory, filename);
filename = Path.Combine(outputDirectory, filename ?? $"file{index}");
// Ensure the output directory is created
Directory.CreateDirectory(Path.GetDirectoryName(filename));
#if NET48
string directoryName = Path.GetDirectoryName(filename);
#else
string? directoryName = Path.GetDirectoryName(filename);
#endif
if (directoryName != null)
Directory.CreateDirectory(directoryName);
// Try to write the data
try

View File

@@ -20,7 +20,11 @@ namespace BinaryObjectScanner.Wrappers
public uint HeaderSize => _model.Header.HeaderSize;
/// <inheritdoc cref="Models.PFF.Header.Signature"/>
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
#endif
/// <inheritdoc cref="Models.PFF.Header.NumberOfFiles"/>
public uint NumberOfFiles => _model.Header.NumberOfFiles;
@@ -53,7 +57,11 @@ namespace BinaryObjectScanner.Wrappers
public uint Reserved => _model.Footer.Reserved;
/// <inheritdoc cref="Models.PFF.Footer.KingTag"/>
#if NET48
public string KingTag => _model.Footer.KingTag;
#else
public string? KingTag => _model.Footer.KingTag;
#endif
#endregion
@@ -82,12 +90,16 @@ namespace BinaryObjectScanner.Wrappers
{
// All logic is handled by the base class
}/// <summary>
/// Create a PFF archive from a byte array and offset
/// </summary>
/// <param name="data">Byte array representing the archive</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A PFF archive wrapper on success, null on failure</returns>
/// Create a PFF archive from a byte array and offset
/// </summary>
/// <param name="data">Byte array representing the archive</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A PFF archive wrapper on success, null on failure</returns>
#if NET48
public static PFF Create(byte[] data, int offset)
#else
public static PFF? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -107,7 +119,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the archive</param>
/// <returns>A PFF archive wrapper on success, null on failure</returns>
#if NET48
public static PFF Create(Stream data)
#else
public static PFF? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -181,11 +197,17 @@ namespace BinaryObjectScanner.Wrappers
Directory.CreateDirectory(outputDirectory);
// Create the output path
string filePath = Path.Combine(outputDirectory, file.FileName);
string filePath = Path.Combine(outputDirectory, file.FileName ?? $"file{index}");
using (FileStream fs = File.OpenWrite(filePath))
{
// Read the data block
#if NET48
byte[] data = ReadFromDataSource(offset, size);
#else
byte[]? data = ReadFromDataSource(offset, size);
#endif
if (data == null)
return false;
// Write the data -- TODO: Compressed data?
fs.Write(data, 0, size);

View File

@@ -134,43 +134,71 @@ namespace BinaryObjectScanner.Wrappers
public ushort TrackLength => _model.Header.TrackLength;
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Track"/>
#if NET48
public string Track => _model.Header.Track;
#else
public string? Track => _model.Header.Track;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.ArtistLength"/>
public ushort ArtistLength => _model.Header.ArtistLength;
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Artist"/>
#if NET48
public string Artist => _model.Header.Artist;
#else
public string? Artist => _model.Header.Artist;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.AlbumLength"/>
public ushort AlbumLength => _model.Header.AlbumLength;
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Album"/>
#if NET48
public string Album => _model.Header.Album;
#else
public string? Album => _model.Header.Album;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.WriterLength"/>
public ushort WriterLength => _model.Header.WriterLength;
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Writer"/>
#if NET48
public string Writer => _model.Header.Writer;
#else
public string? Writer => _model.Header.Writer;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.PublisherLength"/>
public ushort PublisherLength => _model.Header.PublisherLength;
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Publisher"/>
#if NET48
public string Publisher => _model.Header.Publisher;
#else
public string? Publisher => _model.Header.Publisher;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.LabelLength"/>
public ushort LabelLength => _model.Header.LabelLength;
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Label"/>
#if NET48
public string Label => _model.Header.Label;
#else
public string? Label => _model.Header.Label;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.CommentsLength"/>
public ushort CommentsLength => _model.Header.CommentsLength;
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Comments"/>
#if NET48
public string Comments => _model.Header.Comments;
#else
public string? Comments => _model.Header.Comments;
#endif
#endregion
@@ -180,7 +208,11 @@ namespace BinaryObjectScanner.Wrappers
public uint UB1_Length => _model.UnknownBlock1.Length;
/// <inheritdoc cref="Models.PlayJ.UnknownBlock1.Data"/>
#if NET48
public byte[] UB1_Data => _model.UnknownBlock1.Data;
#else
public byte[]? UB1_Data => _model.UnknownBlock1.Data;
#endif
#endregion
@@ -196,7 +228,11 @@ namespace BinaryObjectScanner.Wrappers
#region Unknown Block 3
/// <inheritdoc cref="Models.PlayJ.UnknownBlock3.Data"/>
#if NET48
public byte[] UB3_Data => _model.UnknownBlock3.Data;
#else
public byte[]? UB3_Data => _model.UnknownBlock3.Data;
#endif
#endregion
@@ -256,7 +292,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the archive</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A PlayJ audio file wrapper on success, null on failure</returns>
#if NET48
public static PlayJAudioFile Create(byte[] data, int offset)
#else
public static PlayJAudioFile? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -276,7 +316,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the archive</param>
/// <returns>A PlayJ audio file wrapper on success, null on failure</returns>
#if NET48
public static PlayJAudioFile Create(Stream data)
#else
public static PlayJAudioFile? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -404,7 +448,7 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine(" Unknown Block 1 Information:");
builder.AppendLine(" -------------------------");
builder.AppendLine($" Length: {UB1_Length} (0x{UB1_Length:X})");
builder.AppendLine($" Data: {BitConverter.ToString(UB1_Data ?? new byte[0]).Replace('-', ' ')}");
builder.AppendLine($" Data: {(UB1_Data == null ? "[NULL]" : BitConverter.ToString(UB1_Data).Replace('-', ' '))}");
builder.AppendLine();
}
@@ -428,7 +472,7 @@ namespace BinaryObjectScanner.Wrappers
{
builder.AppendLine(" Unknown Block 3 Information:");
builder.AppendLine(" -------------------------");
builder.AppendLine($" Data: {BitConverter.ToString(UB3_Data ?? new byte[0]).Replace('-', ' ')}");
builder.AppendLine($" Data: {(UB3_Data == null ? "[NULL]" : BitConverter.ToString(UB3_Data).Replace('-', ' '))}");
builder.AppendLine();
}
@@ -450,7 +494,7 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" File name length: {dataFile.FileNameLength} (0x{dataFile.FileNameLength:X})");
builder.AppendLine($" File name: {dataFile.FileName ?? "[NULL]"}");
builder.AppendLine($" Data length: {dataFile.DataLength} (0x{dataFile.DataLength:X})");
builder.AppendLine($" Data: {BitConverter.ToString(dataFile.Data ?? new byte[0]).Replace('-', ' ')}");
builder.AppendLine($" Data: {(dataFile.Data == null ? "[NULL]" : BitConverter.ToString(dataFile.Data).Replace('-', ' '))}");
}
}
builder.AppendLine();

File diff suppressed because it is too large Load Diff

View File

@@ -17,7 +17,11 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.Quantum.Header.Signature"/>
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
#endif
/// <inheritdoc cref="Models.Quantum.Header.MajorVersion"/>
public byte MajorVersion => _model.Header.MajorVersion;
@@ -82,7 +86,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the archive</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A Quantum archive wrapper on success, null on failure</returns>
#if NET48
public static Quantum Create(byte[] data, int offset)
#else
public static Quantum? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -102,7 +110,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the archive</param>
/// <returns>A Quantum archive wrapper on success, null on failure</returns>
#if NET48
public static Quantum Create(Stream data)
#else
public static Quantum? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)

View File

@@ -21,7 +21,11 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.SGA.Header4.Signature"/>
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
#endif
/// <inheritdoc cref="Models.SGA.Header4.MajorVersion"/>
public ushort MajorVersion => _model.Header.MajorVersion;
@@ -410,7 +414,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the SGA</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>An SGA wrapper on success, null on failure</returns>
#if NET48
public static SGA Create(byte[] data, int offset)
#else
public static SGA? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -430,7 +438,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the SGA</param>
/// <returns>An SGA wrapper on success, null on failure</returns>
#if NET48
public static SGA Create(Stream data)
#else
public static SGA? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -737,7 +749,11 @@ namespace BinaryObjectScanner.Wrappers
return false;
// Create the filename
#if NET48
string filename;
#else
string? filename;
#endif
switch (MajorVersion)
{
case 4:
@@ -748,16 +764,24 @@ namespace BinaryObjectScanner.Wrappers
}
// Loop through and get all parent directories
#if NET48
var parentNames = new List<string> { filename };
#else
var parentNames = new List<string?> { filename };
#endif
// Get the parent directory
#if NET48
object folder;
#else
object? folder;
#endif
switch (MajorVersion)
{
case 4: folder = (Folders as SabreTools.Models.SGA.Folder4[]).FirstOrDefault(f => index >= f.FileStartIndex && index <= f.FileEndIndex); break;
case 4: folder = (Folders as SabreTools.Models.SGA.Folder4[])?.FirstOrDefault(f => index >= f.FileStartIndex && index <= f.FileEndIndex); break;
case 5:
case 6:
case 7: folder = (Folders as SabreTools.Models.SGA.Folder5[]).FirstOrDefault(f => index >= f.FileStartIndex && index <= f.FileEndIndex); break;
case 7: folder = (Folders as SabreTools.Models.SGA.Folder5[])?.FirstOrDefault(f => index >= f.FileStartIndex && index <= f.FileEndIndex); break;
default: return false;
}
@@ -815,7 +839,11 @@ namespace BinaryObjectScanner.Wrappers
}
// Read the compressed data directly
#if NET48
byte[] compressedData = ReadFromDataSource((int)fileOffset, (int)fileSize);
#else
byte[]? compressedData = ReadFromDataSource((int)fileOffset, (int)fileSize);
#endif
if (compressedData == null)
return false;
@@ -842,7 +870,13 @@ namespace BinaryObjectScanner.Wrappers
filename = Path.Combine(outputDirectory, filename);
// Ensure the output directory is created
Directory.CreateDirectory(Path.GetDirectoryName(filename));
#if NET48
string directoryName = Path.GetDirectoryName(filename);
#else
string? directoryName = Path.GetDirectoryName(filename);
#endif
if (directoryName != null)
Directory.CreateDirectory(directoryName);
// Try to write the data
try

View File

@@ -16,7 +16,11 @@ namespace BinaryObjectScanner.Wrappers
#region Pass-Through Properties
/// <inheritdoc cref="Models.VBSP.Header.Signature"/>
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
#endif
/// <inheritdoc cref="Models.VBSP.Header.Version"/>
public int Version => _model.Header.Version;
@@ -69,7 +73,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the VBSP</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A VBSP wrapper on success, null on failure</returns>
#if NET48
public static VBSP Create(byte[] data, int offset)
#else
public static VBSP? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -89,7 +97,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the VBSP</param>
/// <returns>An VBSP wrapper on success, null on failure</returns>
#if NET48
public static VBSP Create(Stream data)
#else
public static VBSP? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -176,7 +188,7 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Offset: {lump.Offset} (0x{lump.Offset:X})");
builder.AppendLine($" Length: {lump.Length} (0x{lump.Length:X})");
builder.AppendLine($" Version: {lump.Version} (0x{lump.Version:X})");
builder.AppendLine($" 4CC: {string.Join(", ", lump.FourCC)}");
builder.AppendLine($" 4CC: {(lump.FourCC == null ? "[NULL]" : string.Join(", ", lump.FourCC))}");
}
}
builder.AppendLine();
@@ -236,7 +248,11 @@ namespace BinaryObjectScanner.Wrappers
return false;
// Read the data
#if NET48
byte[] data = ReadFromDataSource((int)lump.Offset, (int)lump.Length);
#else
byte[]? data = ReadFromDataSource((int)lump.Offset, (int)lump.Length);
#endif
if (data == null)
return false;
@@ -260,7 +276,13 @@ namespace BinaryObjectScanner.Wrappers
filename = Path.Combine(outputDirectory, filename);
// Ensure the output directory is created
Directory.CreateDirectory(Path.GetDirectoryName(filename));
#if NET48
string directoryName = Path.GetDirectoryName(filename);
#else
string? directoryName = Path.GetDirectoryName(filename);
#endif
if (directoryName != null)
Directory.CreateDirectory(directoryName);
// Try to write the data
try

View File

@@ -76,7 +76,11 @@ namespace BinaryObjectScanner.Wrappers
/// <summary>
/// Array of archive filenames attached to the given VPK
/// </summary>
#if NET48
public string[] ArchiveFilenames
#else
public string[]? ArchiveFilenames
#endif
{
get
{
@@ -90,18 +94,28 @@ namespace BinaryObjectScanner.Wrappers
// If the filename is not the right format
string extension = Path.GetExtension(fs.Name).TrimStart('.');
string fileName = Path.Combine(Path.GetDirectoryName(fs.Name), Path.GetFileNameWithoutExtension(fs.Name));
#if NET48
string directoryName = Path.GetDirectoryName(fs.Name);
#else
string? directoryName = Path.GetDirectoryName(fs.Name);
#endif
string fileName = directoryName == null
? Path.GetFileNameWithoutExtension(fs.Name)
: Path.Combine(directoryName, Path.GetFileNameWithoutExtension(fs.Name));
if (fileName.Length < 3)
return null;
else if (fileName.Substring(fileName.Length - 3) != "dir")
return null;
// Get the archive count
int archiveCount = DirectoryItems
.Select(di => di.DirectoryEntry)
.Select(de => de.ArchiveIndex)
.Where(ai => ai != HL_VPK_NO_ARCHIVE)
.Max();
int archiveCount = DirectoryItems == null
? 0
: DirectoryItems
.Select(di => di.DirectoryEntry)
.Select(de => de.ArchiveIndex)
.Where(ai => ai != HL_VPK_NO_ARCHIVE)
.Max();
// Build the list of archive filenames to populate
_archiveFilenames = new string[archiveCount];
@@ -160,7 +174,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the VPK</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A VPK wrapper on success, null on failure</returns>
#if NET48
public static VPK Create(byte[] data, int offset)
#else
public static VPK? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -180,7 +198,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the VPK</param>
/// <returns>A VPK wrapper on success, null on failure</returns>
#if NET48
public static VPK Create(Stream data)
#else
public static VPK? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -278,7 +300,7 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Archive index: {archiveHash.ArchiveIndex} (0x{archiveHash.ArchiveIndex:X})");
builder.AppendLine($" Archive offset: {archiveHash.ArchiveOffset} (0x{archiveHash.ArchiveOffset:X})");
builder.AppendLine($" Length: {archiveHash.Length} (0x{archiveHash.Length:X})");
builder.AppendLine($" Hash: {BitConverter.ToString(archiveHash.Hash).Replace("-", string.Empty)}");
builder.AppendLine($" Hash: {(archiveHash.Hash == null ? "[NULL]" : BitConverter.ToString(archiveHash.Hash).Replace("-", string.Empty))}");
}
}
builder.AppendLine();
@@ -302,11 +324,18 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryItem = DirectoryItems[i];
builder.AppendLine($" Directory Item {i}");
builder.AppendLine($" Extension: {directoryItem.Extension}");
builder.AppendLine($" Path: {directoryItem.Path}");
builder.AppendLine($" Name: {directoryItem.Name}");
PrintDirectoryEntry(directoryItem.DirectoryEntry, builder);
// TODO: Print out preload data?
if (directoryItem == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Extension: {directoryItem.Extension}");
builder.AppendLine($" Path: {directoryItem.Path}");
builder.AppendLine($" Name: {directoryItem.Name}");
PrintDirectoryEntry(directoryItem.DirectoryEntry, builder);
// TODO: Print out preload data?
}
}
}
builder.AppendLine();
@@ -316,7 +345,11 @@ namespace BinaryObjectScanner.Wrappers
/// Print directory entry information
/// </summary>
/// <param name="builder">StringBuilder to append information to</param>
#if NET48
private void PrintDirectoryEntry(SabreTools.Models.VPK.DirectoryEntry directoryEntry, StringBuilder builder)
#else
private void PrintDirectoryEntry(SabreTools.Models.VPK.DirectoryEntry? directoryEntry, StringBuilder builder)
#endif
{
if (directoryEntry == null)
{
@@ -387,7 +420,11 @@ namespace BinaryObjectScanner.Wrappers
return false;
// If we have an item with no archive
#if NET48
byte[] data;
#else
byte[]? data;
#endif
if (directoryItem.DirectoryEntry.ArchiveIndex == HL_VPK_NO_ARCHIVE)
{
if (directoryItem.PreloadData == null)
@@ -415,7 +452,11 @@ namespace BinaryObjectScanner.Wrappers
return false;
// Try to open the archive
#if NET48
Stream archiveStream = null;
#else
Stream? archiveStream = null;
#endif
try
{
// Open the archive
@@ -437,10 +478,14 @@ namespace BinaryObjectScanner.Wrappers
}
// If we have preload data, prepend it
if (directoryItem.PreloadData != null)
if (data != null && directoryItem.PreloadData != null)
data = directoryItem.PreloadData.Concat(data).ToArray();
}
// If there is nothing to write out
if (data == null)
return false;
// Create the filename
string filename = $"{directoryItem.Name}.{directoryItem.Extension}";
if (!string.IsNullOrWhiteSpace(directoryItem.Path))
@@ -454,7 +499,13 @@ namespace BinaryObjectScanner.Wrappers
filename = Path.Combine(outputDirectory, filename);
// Ensure the output directory is created
Directory.CreateDirectory(Path.GetDirectoryName(filename));
#if NET48
string directoryName = Path.GetDirectoryName(filename);
#else
string? directoryName = Path.GetDirectoryName(filename);
#endif
if (directoryName != null)
Directory.CreateDirectory(directoryName);
// Try to write the data
try

View File

@@ -17,7 +17,11 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.WAD.Header.Signature"/>
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
#endif
/// <inheritdoc cref="Models.WAD.Header.LumpCount"/>
public uint LumpCount => _model.Header.LumpCount;
@@ -87,7 +91,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the WAD</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A WAD wrapper on success, null on failure</returns>
#if NET48
public static WAD Create(byte[] data, int offset)
#else
public static WAD? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -107,7 +115,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the WAD</param>
/// <returns>An WAD wrapper on success, null on failure</returns>
#if NET48
public static WAD Create(Stream data)
#else
public static WAD? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -284,7 +296,11 @@ namespace BinaryObjectScanner.Wrappers
return false;
// Read the data -- TODO: Handle uncompressed lumps (see BSP.ExtractTexture)
#if NET48
byte[] data = ReadFromDataSource((int)lump.Offset, (int)lump.Length);
#else
byte[]? data = ReadFromDataSource((int)lump.Offset, (int)lump.Length);
#endif
if (data == null)
return false;
@@ -299,7 +315,13 @@ namespace BinaryObjectScanner.Wrappers
filename = Path.Combine(outputDirectory, filename);
// Ensure the output directory is created
Directory.CreateDirectory(Path.GetDirectoryName(filename));
#if NET48
string directoryName = Path.GetDirectoryName(filename);
#else
string? directoryName = Path.GetDirectoryName(filename);
#endif
if (directoryName != null)
Directory.CreateDirectory(directoryName);
// Try to write the data
try

View File

@@ -27,7 +27,7 @@ namespace BinaryObjectScanner.Wrappers
/// Internal model
/// </summary>
/// <remarks>TODO: Should this have a public getter?</remarks>
protected T _model = default;
protected T _model;
/// <summary>
/// Source of the original data
@@ -190,7 +190,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="position">Position in the source to read from</param>
/// <param name="length">Length of the requested data</param>
/// <returns>Byte array containing the requested data, null on error</returns>
#if NET48
protected byte[] ReadFromDataSource(int position, int length)
#else
protected byte[]? ReadFromDataSource(int position, int length)
#endif
{
// Validate the data source
if (!DataSourceIsValid())
@@ -201,12 +205,20 @@ namespace BinaryObjectScanner.Wrappers
return null;
// Read and return the data
#if NET48
byte[] sectionData = null;
#else
byte[]? sectionData = null;
#endif
switch (_dataSource)
{
case DataSource.ByteArray:
sectionData = new byte[length];
#if NET48
Array.Copy(_byteArrayData, _byteArrayOffset + position, sectionData, 0, length);
#else
Array.Copy(_byteArrayData!, _byteArrayOffset + position, sectionData, 0, length);
#endif
break;
case DataSource.Stream:
@@ -227,7 +239,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="length">Length of the requested data</param>
/// <param name="charLimit">Number of characters needed to be a valid string</param>
/// <returns>String list containing the requested data, null on error</returns>
#if NET48
protected List<string> ReadStringsFromDataSource(int position, int length, int charLimit = 5)
#else
protected List<string>? ReadStringsFromDataSource(int position, int length, int charLimit = 5)
#endif
{
// Read the data as a byte array first
byte[] sourceData = ReadFromDataSource(position, length);

View File

@@ -11,7 +11,11 @@ namespace BinaryObjectScanner.Wrappers
/// <summary>
/// Create an instance of a wrapper based on file type
/// </summary>
#if NET48
public static IWrapper CreateWrapper(SupportedFileType fileType, Stream data)
#else
public static IWrapper? CreateWrapper(SupportedFileType fileType, Stream? data)
#endif
{
switch (fileType)
{
@@ -59,8 +63,12 @@ namespace BinaryObjectScanner.Wrappers
/// Create an instance of a wrapper based on the executable type
/// </summary>
/// <param name="stream">Stream data to parse</param>
/// <returns>WrapperBase representing the executable, null on error</returns>
/// <returns>IWrapper representing the executable, null on error</returns>
#if NET48
public static IWrapper CreateExecutableWrapper(Stream stream)
#else
public static IWrapper? CreateExecutableWrapper(Stream? stream)
#endif
{
// Try to get an MS-DOS wrapper first
IWrapper wrapper = MSDOS.Create(stream);

View File

@@ -18,7 +18,11 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.XZP.Header.Signature"/>
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
#endif
/// <inheritdoc cref="Models.XZP.Header.Version"/>
public uint Version => _model.Header.Version;
@@ -96,7 +100,11 @@ namespace BinaryObjectScanner.Wrappers
public uint F_FileLength => _model.Footer.FileLength;
/// <inheritdoc cref="Models.XZP.Footer.Signature"/>
#if NET48
public string F_Signature => _model.Footer.Signature;
#else
public string? F_Signature => _model.Footer.Signature;
#endif
#endregion
@@ -138,7 +146,11 @@ namespace BinaryObjectScanner.Wrappers
/// <param name="data">Byte array representing the XZP</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A XZP wrapper on success, null on failure</returns>
#if NET48
public static XZP Create(byte[] data, int offset)
#else
public static XZP? Create(byte[]? data, int offset)
#endif
{
// If the data is invalid
if (data == null)
@@ -158,7 +170,11 @@ namespace BinaryObjectScanner.Wrappers
/// </summary>
/// <param name="data">Stream representing the XZP</param>
/// <returns>A XZP wrapper on success, null on failure</returns>
#if NET48
public static XZP Create(Stream data)
#else
public static XZP? Create(Stream? data)
#endif
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
@@ -400,20 +416,36 @@ namespace BinaryObjectScanner.Wrappers
return false;
// Load the item data
#if NET48
byte[] data = ReadFromDataSource((int)directoryEntry.EntryOffset, (int)directoryEntry.EntryLength);
#else
byte[]? data = ReadFromDataSource((int)directoryEntry.EntryOffset, (int)directoryEntry.EntryLength);
#endif
if (data == null)
return false;
// Create the filename
#if NET48
string filename = directoryItem.Name;
#else
string? filename = directoryItem.Name;
#endif
// If we have an invalid output directory
if (string.IsNullOrWhiteSpace(outputDirectory))
return false;
// Create the full output path
filename = Path.Combine(outputDirectory, filename);
filename = Path.Combine(outputDirectory, filename ?? $"file{index}");
// Ensure the output directory is created
Directory.CreateDirectory(Path.GetDirectoryName(filename));
#if NET48
string directoryName = Path.GetDirectoryName(filename);
#else
string? directoryName = Path.GetDirectoryName(filename);
#endif
if (directoryName != null)
Directory.CreateDirectory(directoryName);
// Try to write the data
try