Fix "dereference" warnings

This commit is contained in:
Matt Nadareski
2023-09-13 00:08:11 -04:00
parent 24e9455733
commit ec616fcdac
27 changed files with 3543 additions and 611 deletions

View File

@@ -388,7 +388,7 @@ namespace BinaryObjectScanner.Utilities
#region BDPlusSVM
if (extension.Equals(value: "svm", StringComparison.OrdinalIgnoreCase))
if (extension.Equals("svm", StringComparison.OrdinalIgnoreCase))
return SupportedFileType.BDPlusSVM;
#endregion
@@ -513,7 +513,7 @@ namespace BinaryObjectScanner.Utilities
return SupportedFileType.N3DS;
// CIA package -- Not currently supported
// else if (extension.Equals(value: "cia", StringComparison.OrdinalIgnoreCase))
// else if (extension.Equals("cia", StringComparison.OrdinalIgnoreCase))
// return SupportedFileType.N3DS;
#endregion

View File

@@ -142,6 +142,12 @@ namespace BinaryObjectScanner.Wrappers
{
var record = Records[i];
builder.AppendLine($" Record Entry {i}");
if (record == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Record type: {record.RecordType} (0x{record.RecordType:X})");
builder.AppendLine($" Record length: {record.RecordLength} (0x{record.RecordLength:X})");
@@ -149,14 +155,17 @@ namespace BinaryObjectScanner.Wrappers
{
case SabreTools.Models.AACS.RecordType.EndOfMediaKeyBlock:
var eomkb = record as SabreTools.Models.AACS.EndOfMediaKeyBlockRecord;
builder.AppendLine($" Signature data: {(eomkb.SignatureData == null ? "[NULL]" : BitConverter.ToString(eomkb.SignatureData).Replace('-', ' '))}");
if (eomkb != null)
{
builder.AppendLine($" Signature data: {(eomkb.SignatureData == null ? "[NULL]" : BitConverter.ToString(eomkb.SignatureData).Replace('-', ' '))}");
}
break;
case SabreTools.Models.AACS.RecordType.ExplicitSubsetDifference:
var esd = record as SabreTools.Models.AACS.ExplicitSubsetDifferenceRecord;
builder.AppendLine($" Subset Differences:");
builder.AppendLine(" -------------------------");
if (esd.SubsetDifferences == null || esd.SubsetDifferences.Length == 0)
if (esd?.SubsetDifferences == null || esd.SubsetDifferences.Length == 0)
{
builder.AppendLine($" No subset differences");
}
@@ -166,8 +175,15 @@ namespace BinaryObjectScanner.Wrappers
{
var sd = esd.SubsetDifferences[j];
builder.AppendLine($" Subset Difference {j}");
builder.AppendLine($" Mask: {sd.Mask} (0x{sd.Mask:X})");
builder.AppendLine($" Number: {sd.Number} (0x{sd.Number:X})");
if (sd == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Mask: {sd.Mask} (0x{sd.Mask:X})");
builder.AppendLine($" Number: {sd.Number} (0x{sd.Number:X})");
}
}
}
break;
@@ -176,7 +192,7 @@ namespace BinaryObjectScanner.Wrappers
var mkd = record as SabreTools.Models.AACS.MediaKeyDataRecord;
builder.AppendLine($" Media Keys:");
builder.AppendLine(" -------------------------");
if (mkd.MediaKeyData == null || mkd.MediaKeyData.Length == 0)
if (mkd?.MediaKeyData == null || mkd.MediaKeyData.Length == 0)
{
builder.AppendLine($" No media keys");
}
@@ -192,10 +208,11 @@ namespace BinaryObjectScanner.Wrappers
case SabreTools.Models.AACS.RecordType.SubsetDifferenceIndex:
var sdi = record as SabreTools.Models.AACS.SubsetDifferenceIndexRecord;
builder.AppendLine($" Span: {sdi.Span} (0x{sdi.Span:X})");
if (sdi != null)
builder.AppendLine($" Span: {sdi.Span} (0x{sdi.Span:X})");
builder.AppendLine($" Offsets:");
builder.AppendLine(" -------------------------");
if (sdi.Offsets == null || sdi.Offsets.Length == 0)
if (sdi?.Offsets == null || sdi.Offsets.Length == 0)
{
builder.AppendLine($" No offsets");
}
@@ -211,16 +228,20 @@ namespace BinaryObjectScanner.Wrappers
case SabreTools.Models.AACS.RecordType.TypeAndVersion:
var tav = record as SabreTools.Models.AACS.TypeAndVersionRecord;
builder.AppendLine($" Media key block type: {tav.MediaKeyBlockType} (0x{tav.MediaKeyBlockType:X})");
builder.AppendLine($" Version number: {tav.VersionNumber} (0x{tav.VersionNumber:X})");
if (tav != null)
{
builder.AppendLine($" Media key block type: {tav.MediaKeyBlockType} (0x{tav.MediaKeyBlockType:X})");
builder.AppendLine($" Version number: {tav.VersionNumber} (0x{tav.VersionNumber:X})");
}
break;
case SabreTools.Models.AACS.RecordType.DriveRevocationList:
var drl = record as SabreTools.Models.AACS.DriveRevocationListRecord;
builder.AppendLine($" Total number of entries: {drl.TotalNumberOfEntries} (0x{drl.TotalNumberOfEntries:X})");
if (drl != null)
builder.AppendLine($" Total number of entries: {drl.TotalNumberOfEntries} (0x{drl.TotalNumberOfEntries:X})");
builder.AppendLine($" Signature Blocks:");
builder.AppendLine(" -------------------------");
if (drl.SignatureBlocks == null || drl.SignatureBlocks.Length == 0)
if (drl?.SignatureBlocks == null || drl.SignatureBlocks.Length == 0)
{
builder.AppendLine($" No signature blocks");
}
@@ -230,21 +251,35 @@ namespace BinaryObjectScanner.Wrappers
{
var block = drl.SignatureBlocks[j];
builder.AppendLine($" Signature Block {j}");
builder.AppendLine($" Number of entries: {block.NumberOfEntries}");
builder.AppendLine($" Entry Fields:");
builder.AppendLine(" -------------------------");
if (block.EntryFields == null || block.EntryFields.Length == 0)
if (block == null)
{
builder.AppendLine($" No entry fields");
builder.AppendLine(" [NULL]");
}
else
{
for (int k = 0; k < block.EntryFields.Length; k++)
builder.AppendLine($" Number of entries: {block.NumberOfEntries}");
builder.AppendLine($" Entry Fields:");
builder.AppendLine(" -------------------------");
if (block.EntryFields == null || block.EntryFields.Length == 0)
{
var ef = block.EntryFields[k];
builder.AppendLine($" Entry {k}");
builder.AppendLine($" Range: {ef.Range} (0x{ef.Range:X})");
builder.AppendLine($" Drive ID: {(ef.DriveID == null ? "[NULL]" : BitConverter.ToString(ef.DriveID).Replace('-', ' '))}");
builder.AppendLine($" No entry fields");
}
else
{
for (int k = 0; k < block.EntryFields.Length; k++)
{
var ef = block.EntryFields[k];
builder.AppendLine($" Entry {k}");
if (ef == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Range: {ef.Range} (0x{ef.Range:X})");
builder.AppendLine($" Drive ID: {(ef.DriveID == null ? "[NULL]" : BitConverter.ToString(ef.DriveID).Replace('-', ' '))}");
}
}
}
}
}
@@ -253,10 +288,11 @@ namespace BinaryObjectScanner.Wrappers
case SabreTools.Models.AACS.RecordType.HostRevocationList:
var hrl = record as SabreTools.Models.AACS.HostRevocationListRecord;
builder.AppendLine($" Total number of entries: {hrl.TotalNumberOfEntries} (0x{hrl.TotalNumberOfEntries:X})");
if (hrl != null)
builder.AppendLine($" Total number of entries: {hrl.TotalNumberOfEntries} (0x{hrl.TotalNumberOfEntries:X})");
builder.AppendLine($" Signature Blocks:");
builder.AppendLine(" -------------------------");
if (hrl.SignatureBlocks == null || hrl.SignatureBlocks.Length == 0)
if (hrl?.SignatureBlocks == null || hrl.SignatureBlocks.Length == 0)
{
builder.AppendLine($" No signature blocks");
}
@@ -264,23 +300,38 @@ namespace BinaryObjectScanner.Wrappers
{
for (int j = 0; j < hrl.SignatureBlocks.Length; j++)
{
var block = hrl.SignatureBlocks[j];
builder.AppendLine($" Signature Block {j}");
builder.AppendLine($" Number of entries: {block.NumberOfEntries}");
builder.AppendLine($" Entry Fields:");
builder.AppendLine(" -------------------------");
if (block.EntryFields == null || block.EntryFields.Length == 0)
var block = hrl.SignatureBlocks[j];
if (block == null)
{
builder.AppendLine($" No entry fields");
builder.AppendLine(" [NULL]");
}
else
{
for (int k = 0; k < block.EntryFields.Length; k++)
builder.AppendLine($" Number of entries: {block.NumberOfEntries}");
builder.AppendLine($" Entry Fields:");
builder.AppendLine(" -------------------------");
if (block.EntryFields == null || block.EntryFields.Length == 0)
{
var ef = block.EntryFields[k];
builder.AppendLine($" Entry {k}");
builder.AppendLine($" Range: {ef.Range} (0x{ef.Range:X})");
builder.AppendLine($" Host ID: {(ef.HostID == null ? "[NULL]" : BitConverter.ToString(ef.HostID).Replace('-', ' '))}");
builder.AppendLine($" No entry fields");
}
else
{
for (int k = 0; k < block.EntryFields.Length; k++)
{
var ef = block.EntryFields[k];
builder.AppendLine($" Entry {k}");
if (ef == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Range: {ef.Range} (0x{ef.Range:X})");
builder.AppendLine($" Host ID: {(ef.HostID == null ? "[NULL]" : BitConverter.ToString(ef.HostID).Replace('-', ' '))}");
}
}
}
}
}
@@ -289,12 +340,14 @@ namespace BinaryObjectScanner.Wrappers
case SabreTools.Models.AACS.RecordType.VerifyMediaKey:
var vmk = record as SabreTools.Models.AACS.VerifyMediaKeyRecord;
builder.AppendLine($" Ciphertext value: {(vmk.CiphertextValue == null ? "[NULL]" : BitConverter.ToString(vmk.CiphertextValue).Replace('-', ' '))}");
if (vmk != null)
builder.AppendLine($" Ciphertext value: {(vmk.CiphertextValue == null ? "[NULL]" : BitConverter.ToString(vmk.CiphertextValue).Replace('-', ' '))}");
break;
case SabreTools.Models.AACS.RecordType.Copyright:
var c = record as SabreTools.Models.AACS.CopyrightRecord;
builder.AppendLine($" Copyright: {c.Copyright ?? "[NULL]"}");
if (c != null)
builder.AppendLine($" Copyright: {c.Copyright ?? "[NULL]"}");
break;
}
}

View File

@@ -22,14 +22,22 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string Magic => _model.Header.Magic;
#else
public string? Magic => _model.Header.Magic;
public string? Magic => _model.Header?.Magic;
#endif
/// <inheritdoc cref="Models.BFPK.Header.Version"/>
#if NET48
public int Version => _model.Header.Version;
#else
public int? Version => _model.Header?.Version;
#endif
/// <inheritdoc cref="Models.BFPK.Header.Files"/>
#if NET48
public int Files => _model.Header.Files;
#else
public int? Files => _model.Header?.Files;
#endif
#endregion
@@ -271,11 +279,19 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = FileTable[i];
builder.AppendLine($" File Table Entry {i}");
builder.AppendLine($" Name size: {entry.NameSize} (0x{entry.NameSize:X})");
builder.AppendLine($" Name: {entry.Name}");
builder.AppendLine($" Uncompressed size: {entry.UncompressedSize} (0x{entry.UncompressedSize:X})");
builder.AppendLine($" Offset: {entry.Offset} (0x{entry.Offset:X})");
builder.AppendLine($" Compressed Size: {entry.CompressedSize} (0x{entry.CompressedSize:X})");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
else
{
builder.AppendLine($" Name size: {entry.NameSize} (0x{entry.NameSize:X})");
builder.AppendLine($" Name: {entry.Name}");
builder.AppendLine($" Uncompressed size: {entry.UncompressedSize} (0x{entry.UncompressedSize:X})");
builder.AppendLine($" Offset: {entry.Offset} (0x{entry.Offset:X})");
builder.AppendLine($" Compressed Size: {entry.CompressedSize} (0x{entry.CompressedSize:X})");
}
}
}
builder.AppendLine();

View File

@@ -20,7 +20,11 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.BSP.Header.Version"/>
#if NET48
public uint Version => _model.Header.Version;
#else
public uint? Version => _model.Header?.Version;
#endif
#endregion
@@ -38,13 +42,17 @@ namespace BinaryObjectScanner.Wrappers
#region Texture Header
/// <inheritdoc cref="Models.BSP.TextureHeader.TextureCount"/>
#if NET48
public uint TextureCount => _model.TextureHeader.TextureCount;
#else
public uint? TextureCount => _model.TextureHeader?.TextureCount;
#endif
/// <inheritdoc cref="Models.BSP.TextureHeader.Offsets"/>
#if NET48
public uint[] Offsets => _model.TextureHeader.Offsets;
#else
public uint[]? Offsets => _model.TextureHeader.Offsets;
public uint[]? Offsets => _model.TextureHeader?.Offsets;
#endif
#endregion
@@ -202,8 +210,15 @@ namespace BinaryObjectScanner.Wrappers
}
builder.AppendLine($" Lump {i}{specialLumpName}");
builder.AppendLine($" Offset: {lump.Offset} (0x{lump.Offset:X})");
builder.AppendLine($" Length: {lump.Length} (0x{lump.Length:X})");
if (lump == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Offset: {lump.Offset} (0x{lump.Offset:X})");
builder.AppendLine($" Length: {lump.Length} (0x{lump.Length:X})");
}
}
}
builder.AppendLine();
@@ -219,9 +234,16 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine(" -------------------------");
builder.AppendLine($" Texture count: {TextureCount}");
builder.AppendLine($" Offsets:");
for (int i = 0; i < Offsets.Length; i++)
if (Offsets == null || Offsets.Length == 0)
{
builder.AppendLine($" Offset {i}: {Offsets[i]} (0x{Offsets[i]:X})");
builder.AppendLine(" No offsets");
}
else
{
for (int i = 0; i < Offsets.Length; i++)
{
builder.AppendLine($" Offset {i}: {Offsets[i]} (0x{Offsets[i]:X})");
}
}
builder.AppendLine();
}
@@ -244,17 +266,31 @@ namespace BinaryObjectScanner.Wrappers
{
var texture = Textures[i];
builder.AppendLine($" Texture {i}");
builder.AppendLine($" Name: {texture.Name}");
builder.AppendLine($" Width: {texture.Width} (0x{texture.Width:X})");
builder.AppendLine($" Height: {texture.Height} (0x{texture.Height:X})");
builder.AppendLine($" Offsets:");
for (int j = 0; j < texture.Offsets.Length; j++)
if (texture == null)
{
builder.AppendLine($" Offset {j}: {Offsets[i]} (0x{texture.Offsets[j]:X})");
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Name: {texture.Name}");
builder.AppendLine($" Width: {texture.Width} (0x{texture.Width:X})");
builder.AppendLine($" Height: {texture.Height} (0x{texture.Height:X})");
builder.AppendLine($" Offsets:");
if (texture.Offsets == null || texture.Offsets.Length == 0)
{
builder.AppendLine($" No offsets");
}
else
{
for (int j = 0; j < texture.Offsets.Length; j++)
{
builder.AppendLine($" Offset {j}: {texture.Offsets[i]} (0x{texture.Offsets[j]:X})");
}
}
// Skip texture data
builder.AppendLine($" Palette size: {texture.PaletteSize} (0x{texture.PaletteSize:X})");
// Skip palette data
}
// Skip texture data
builder.AppendLine($" Palette size: {texture.PaletteSize} (0x{texture.PaletteSize:X})");
// Skip palette data
}
}
builder.AppendLine();
@@ -457,6 +493,10 @@ namespace BinaryObjectScanner.Wrappers
private static byte[]? CreateTextureData(SabreTools.Models.BSP.Texture texture)
#endif
{
// If there's no palette data
if (texture.PaletteData == null || texture.PaletteData.Length == 0)
return null;
// If there's no texture data
if (texture.TextureData == null || texture.TextureData.Length == 0)
return null;

View File

@@ -19,65 +19,129 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.CFB.FileHeader.Signature"/>
#if NET48
public ulong Signature => _model.Header.Signature;
#else
public ulong? Signature => _model.Header?.Signature;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.CLSID"/>
#if NET48
public Guid CLSID => _model.Header.CLSID;
#else
public Guid? CLSID => _model.Header?.CLSID;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.MinorVersion"/>
#if NET48
public ushort MinorVersion => _model.Header.MinorVersion;
#else
public ushort? MinorVersion => _model.Header?.MinorVersion;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.MajorVersion"/>
#if NET48
public ushort MajorVersion => _model.Header.MajorVersion;
#else
public ushort? MajorVersion => _model.Header?.MajorVersion;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.ByteOrder"/>
#if NET48
public ushort ByteOrder => _model.Header.ByteOrder;
#else
public ushort? ByteOrder => _model.Header?.ByteOrder;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.SectorShift"/>
#if NET48
public ushort SectorShift => _model.Header.SectorShift;
#else
public ushort? SectorShift => _model.Header?.SectorShift;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.MiniSectorShift"/>
#if NET48
public ushort MiniSectorShift => _model.Header.MiniSectorShift;
#else
public ushort? MiniSectorShift => _model.Header?.MiniSectorShift;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.Reserved"/>
#if NET48
public byte[] Reserved => _model.Header.Reserved;
#else
public byte[]? Reserved => _model.Header.Reserved;
public byte[]? Reserved => _model.Header?.Reserved;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.NumberOfDirectorySectors"/>
#if NET48
public uint NumberOfDirectorySectors => _model.Header.NumberOfDirectorySectors;
#else
public uint? NumberOfDirectorySectors => _model.Header?.NumberOfDirectorySectors;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.NumberOfFATSectors"/>
#if NET48
public uint NumberOfFATSectors => _model.Header.NumberOfFATSectors;
#else
public uint? NumberOfFATSectors => _model.Header?.NumberOfFATSectors;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.FirstDirectorySectorLocation"/>
#if NET48
public uint FirstDirectorySectorLocation => _model.Header.FirstDirectorySectorLocation;
#else
public uint? FirstDirectorySectorLocation => _model.Header?.FirstDirectorySectorLocation;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.TransactionSignatureNumber"/>
#if NET48
public uint TransactionSignatureNumber => _model.Header.TransactionSignatureNumber;
#else
public uint? TransactionSignatureNumber => _model.Header?.TransactionSignatureNumber;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.MiniStreamCutoffSize"/>
#if NET48
public uint MiniStreamCutoffSize => _model.Header.MiniStreamCutoffSize;
#else
public uint? MiniStreamCutoffSize => _model.Header?.MiniStreamCutoffSize;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.FirstMiniFATSectorLocation"/>
#if NET48
public uint FirstMiniFATSectorLocation => _model.Header.FirstMiniFATSectorLocation;
#else
public uint? FirstMiniFATSectorLocation => _model.Header?.FirstMiniFATSectorLocation;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.NumberOfMiniFATSectors"/>
#if NET48
public uint NumberOfMiniFATSectors => _model.Header.NumberOfMiniFATSectors;
#else
public uint? NumberOfMiniFATSectors => _model.Header?.NumberOfMiniFATSectors;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.FirstDIFATSectorLocation"/>
#if NET48
public uint FirstDIFATSectorLocation => _model.Header.FirstDIFATSectorLocation;
#else
public uint? FirstDIFATSectorLocation => _model.Header?.FirstDIFATSectorLocation;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.NumberOfDIFATSectors"/>
#if NET48
public uint NumberOfDIFATSectors => _model.Header.NumberOfDIFATSectors;
#else
public uint? NumberOfDIFATSectors => _model.Header?.NumberOfDIFATSectors;
#endif
/// <inheritdoc cref="Models.CFB.FileHeader.DIFAT"/>
#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
@@ -133,12 +197,20 @@ namespace BinaryObjectScanner.Wrappers
/// <summary>
/// Normal sector size in bytes
/// </summary>
#if NET48
public long SectorSize => (long)Math.Pow(2, SectorShift);
#else
public long SectorSize => (long)Math.Pow(2, SectorShift ?? 0);
#endif
/// <summary>
/// Mini sector size in bytes
/// </summary>
#if NET48
public long MiniSectorSize => (long)Math.Pow(2, MiniSectorShift);
#else
public long MiniSectorSize => (long)Math.Pow(2, MiniSectorShift ?? 0);
#endif
#endregion
@@ -236,7 +308,7 @@ namespace BinaryObjectScanner.Wrappers
#endif
{
// If we have an invalid sector
if (startingSector < 0 || (long)startingSector >= FATSectorNumbers.Length)
if (startingSector < 0 || FATSectorNumbers == null || (long)startingSector >= FATSectorNumbers.Length)
return null;
// Setup the returned list
@@ -340,15 +412,15 @@ namespace BinaryObjectScanner.Wrappers
#endif
{
// If we have an invalid sector
if (startingSector < 0 || (long)startingSector >= MiniFATSectorNumbers.Length)
if (startingSector < 0 || MiniFATSectorNumbers == null || (long)startingSector >= MiniFATSectorNumbers.Length)
return null;
// Setup the returned list
#if NET48
#if NET48
var sectors = new List<SabreTools.Models.CFB.SectorNumber> { startingSector };
#else
#else
var sectors = new List<SabreTools.Models.CFB.SectorNumber?> { startingSector };
#endif
#endif
var lastSector = startingSector;
while (true)
@@ -476,9 +548,16 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" First DIFAT sector location: {FirstDIFATSectorLocation} (0x{FirstDIFATSectorLocation:X})");
builder.AppendLine($" Number of DIFAT sectors: {NumberOfDIFATSectors} (0x{NumberOfDIFATSectors:X})");
builder.AppendLine($" DIFAT:");
for (int i = 0; i < DIFAT.Length; i++)
if (DIFAT == null || DIFAT.Length == 0)
{
builder.AppendLine($" DIFAT Entry {i}: {DIFAT[i]} (0x{DIFAT[i]:X})");
builder.AppendLine(" No DIFAT entries");
}
else
{
for (int i = 0; i < DIFAT.Length; i++)
{
builder.AppendLine($" DIFAT Entry {i}: {DIFAT[i]} (0x{DIFAT[i]:X})");
}
}
builder.AppendLine();
}
@@ -567,19 +646,26 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryEntry = DirectoryEntries[i];
builder.AppendLine($" Directory Entry {i}");
builder.AppendLine($" Name: {directoryEntry.Name}");
builder.AppendLine($" Name length: {directoryEntry.NameLength} (0x{directoryEntry.NameLength:X})");
builder.AppendLine($" Object type: {directoryEntry.ObjectType} (0x{directoryEntry.ObjectType:X})");
builder.AppendLine($" Color flag: {directoryEntry.ColorFlag} (0x{directoryEntry.ColorFlag:X})");
builder.AppendLine($" Left sibling ID: {directoryEntry.LeftSiblingID} (0x{directoryEntry.LeftSiblingID:X})");
builder.AppendLine($" Right sibling ID: {directoryEntry.RightSiblingID} (0x{directoryEntry.RightSiblingID:X})");
builder.AppendLine($" Child ID: {directoryEntry.ChildID} (0x{directoryEntry.ChildID:X})");
builder.AppendLine($" CLSID: {directoryEntry.CLSID}");
builder.AppendLine($" State bits: {directoryEntry.StateBits} (0x{directoryEntry.StateBits:X})");
builder.AppendLine($" Creation time: {directoryEntry.CreationTime} (0x{directoryEntry.CreationTime:X})");
builder.AppendLine($" Modification time: {directoryEntry.ModifiedTime} (0x{directoryEntry.ModifiedTime:X})");
builder.AppendLine($" Staring sector location: {directoryEntry.StartingSectorLocation} (0x{directoryEntry.StartingSectorLocation:X})");
builder.AppendLine($" Stream size: {directoryEntry.StreamSize} (0x{directoryEntry.StreamSize:X})");
if (directoryEntry == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Name: {directoryEntry.Name}");
builder.AppendLine($" Name length: {directoryEntry.NameLength} (0x{directoryEntry.NameLength:X})");
builder.AppendLine($" Object type: {directoryEntry.ObjectType} (0x{directoryEntry.ObjectType:X})");
builder.AppendLine($" Color flag: {directoryEntry.ColorFlag} (0x{directoryEntry.ColorFlag:X})");
builder.AppendLine($" Left sibling ID: {directoryEntry.LeftSiblingID} (0x{directoryEntry.LeftSiblingID:X})");
builder.AppendLine($" Right sibling ID: {directoryEntry.RightSiblingID} (0x{directoryEntry.RightSiblingID:X})");
builder.AppendLine($" Child ID: {directoryEntry.ChildID} (0x{directoryEntry.ChildID:X})");
builder.AppendLine($" CLSID: {directoryEntry.CLSID}");
builder.AppendLine($" State bits: {directoryEntry.StateBits} (0x{directoryEntry.StateBits:X})");
builder.AppendLine($" Creation time: {directoryEntry.CreationTime} (0x{directoryEntry.CreationTime:X})");
builder.AppendLine($" Modification time: {directoryEntry.ModifiedTime} (0x{directoryEntry.ModifiedTime:X})");
builder.AppendLine($" Staring sector location: {directoryEntry.StartingSectorLocation} (0x{directoryEntry.StartingSectorLocation:X})");
builder.AppendLine($" Stream size: {directoryEntry.StreamSize} (0x{directoryEntry.StreamSize:X})");
}
}
}
builder.AppendLine();

View File

@@ -18,34 +18,66 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.N3DS.CIAHeader.HeaderSize"/>
#if NET48
public uint HeaderSize => _model.Header.HeaderSize;
#else
public uint? HeaderSize => _model.Header?.HeaderSize;
#endif
/// <inheritdoc cref="Models.N3DS.CIAHeader.Type"/>
#if NET48
public ushort Type => _model.Header.Type;
#else
public ushort? Type => _model.Header?.Type;
#endif
/// <inheritdoc cref="Models.N3DS.CIAHeader.Version"/>
#if NET48
public ushort Version => _model.Header.Version;
#else
public ushort? Version => _model.Header?.Version;
#endif
/// <inheritdoc cref="Models.N3DS.CIAHeader.CertificateChainSize"/>
#if NET48
public uint CertificateChainSize => _model.Header.CertificateChainSize;
#else
public uint? CertificateChainSize => _model.Header?.CertificateChainSize;
#endif
/// <inheritdoc cref="Models.N3DS.CIAHeader.TicketSize"/>
#if NET48
public uint TicketSize => _model.Header.TicketSize;
#else
public uint? TicketSize => _model.Header?.TicketSize;
#endif
/// <inheritdoc cref="Models.N3DS.CIAHeader.TMDFileSize"/>
#if NET48
public uint TMDFileSize => _model.Header.TMDFileSize;
#else
public uint? TMDFileSize => _model.Header?.TMDFileSize;
#endif
/// <inheritdoc cref="Models.N3DS.CIAHeader.MetaSize"/>
#if NET48
public uint MetaSize => _model.Header.MetaSize;
#else
public uint? MetaSize => _model.Header?.MetaSize;
#endif
/// <inheritdoc cref="Models.N3DS.CIAHeader.ContentSize"/>
#if NET48
public ulong ContentSize => _model.Header.ContentSize;
#else
public ulong? ContentSize => _model.Header?.ContentSize;
#endif
/// <inheritdoc cref="Models.N3DS.CIAHeader.ContentIndex"/>
#if NET48
public byte[] ContentIndex => _model.Header.ContentIndex;
#else
public byte[]? ContentIndex => _model.Header.ContentIndex;
public byte[]? ContentIndex => _model.Header?.ContentIndex;
#endif
#endregion
@@ -64,138 +96,206 @@ namespace BinaryObjectScanner.Wrappers
#region Ticket
/// <inheritdoc cref="Models.N3DS.Ticket.SignatureType"/>
#if NET48
public SabreTools.Models.N3DS.SignatureType T_SignatureType => _model.Ticket.SignatureType;
#else
public SabreTools.Models.N3DS.SignatureType? T_SignatureType => _model.Ticket?.SignatureType;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.SignatureSize"/>
#if NET48
public ushort T_SignatureSize => _model.Ticket.SignatureSize;
#else
public ushort? T_SignatureSize => _model.Ticket?.SignatureSize;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.PaddingSize"/>
#if NET48
public byte T_PaddingSize => _model.Ticket.PaddingSize;
#else
public byte? T_PaddingSize => _model.Ticket?.PaddingSize;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.Signature"/>
#if NET48
public byte[] T_Signature => _model.Ticket.Signature;
#else
public byte[]? T_Signature => _model.Ticket.Signature;
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;
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;
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;
public byte[]? T_ECCPublicKey => _model.Ticket?.ECCPublicKey;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.Version"/>
#if NET48
public byte T_Version => _model.Ticket.Version;
#else
public byte? T_Version => _model.Ticket?.Version;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.CaCrlVersion"/>
#if NET48
public byte T_CaCrlVersion => _model.Ticket.CaCrlVersion;
#else
public byte? T_CaCrlVersion => _model.Ticket?.CaCrlVersion;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.SignerCrlVersion"/>
#if NET48
public byte T_SignerCrlVersion => _model.Ticket.SignerCrlVersion;
#else
public byte? T_SignerCrlVersion => _model.Ticket?.SignerCrlVersion;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.TitleKey"/>
#if NET48
public byte[] T_TitleKey => _model.Ticket.TitleKey;
#else
public byte[]? T_TitleKey => _model.Ticket.TitleKey;
public byte[]? T_TitleKey => _model.Ticket?.TitleKey;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved1"/>
#if NET48
public byte T_Reserved1 => _model.Ticket.Reserved1;
#else
public byte? T_Reserved1 => _model.Ticket?.Reserved1;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.TicketID"/>
#if NET48
public ulong T_TicketID => _model.Ticket.TicketID;
#else
public ulong? T_TicketID => _model.Ticket?.TicketID;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.ConsoleID"/>
#if NET48
public uint T_ConsoleID => _model.Ticket.ConsoleID;
#else
public uint? T_ConsoleID => _model.Ticket?.ConsoleID;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.TitleID"/>
#if NET48
public ulong T_TitleID => _model.Ticket.TitleID;
#else
public ulong? T_TitleID => _model.Ticket?.TitleID;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved2"/>
#if NET48
public byte[] T_Reserved2 => _model.Ticket.Reserved2;
#else
public byte[]? T_Reserved2 => _model.Ticket.Reserved2;
public byte[]? T_Reserved2 => _model.Ticket?.Reserved2;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.TicketTitleVersion"/>
#if NET48
public ushort T_TicketTitleVersion => _model.Ticket.TicketTitleVersion;
#else
public ushort? T_TicketTitleVersion => _model.Ticket?.TicketTitleVersion;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved3"/>
#if NET48
public byte[] T_Reserved3 => _model.Ticket.Reserved3;
#else
public byte[]? T_Reserved3 => _model.Ticket.Reserved3;
public byte[]? T_Reserved3 => _model.Ticket?.Reserved3;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.LicenseType"/>
#if NET48
public byte T_LicenseType => _model.Ticket.LicenseType;
#else
public byte? T_LicenseType => _model.Ticket?.LicenseType;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.CommonKeyYIndex"/>
#if NET48
public byte T_CommonKeyYIndex => _model.Ticket.CommonKeyYIndex;
#else
public byte? T_CommonKeyYIndex => _model.Ticket?.CommonKeyYIndex;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved4"/>
#if NET48
public byte[] T_Reserved4 => _model.Ticket.Reserved4;
#else
public byte[]? T_Reserved4 => _model.Ticket.Reserved4;
public byte[]? T_Reserved4 => _model.Ticket?.Reserved4;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.eShopAccountID"/>
#if NET48
public uint T_eShopAccountID => _model.Ticket.eShopAccountID;
#else
public uint? T_eShopAccountID => _model.Ticket?.eShopAccountID;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved5"/>
#if NET48
public byte T_Reserved5 => _model.Ticket.Reserved5;
#else
public byte? T_Reserved5 => _model.Ticket?.Reserved5;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.Audit"/>
#if NET48
public byte T_Audit => _model.Ticket.Audit;
#else
public byte? T_Audit => _model.Ticket?.Audit;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved6"/>
#if NET48
public byte[] T_Reserved6 => _model.Ticket.Reserved6;
#else
public byte[]? T_Reserved6 => _model.Ticket.Reserved6;
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;
public uint[]? T_Limits => _model.Ticket?.Limits;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.ContentIndexSize"/>
#if NET48
public uint T_ContentIndexSize => _model.Ticket.ContentIndexSize;
#else
public uint? T_ContentIndexSize => _model.Ticket?.ContentIndexSize;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.ContentIndex"/>
#if NET48
public byte[] T_ContentIndex => _model.Ticket.ContentIndex;
#else
public byte[]? T_ContentIndex => _model.Ticket.ContentIndex;
public byte[]? T_ContentIndex => _model.Ticket?.ContentIndex;
#endif
/// <inheritdoc cref="Models.N3DS.Ticket.CertificateChain"/>
#if NET48
public SabreTools.Models.N3DS.Certificate[] T_CertificateChain => _model.Ticket.CertificateChain;
#else
public SabreTools.Models.N3DS.Certificate?[]? T_CertificateChain => _model.Ticket.CertificateChain;
public SabreTools.Models.N3DS.Certificate?[]? T_CertificateChain => _model.Ticket?.CertificateChain;
#endif
#endregion
@@ -203,127 +303,199 @@ namespace BinaryObjectScanner.Wrappers
#region Title Metadata
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SignatureType"/>
#if NET48
public SabreTools.Models.N3DS.SignatureType TMD_SignatureType => _model.TMDFileData.SignatureType;
#else
public SabreTools.Models.N3DS.SignatureType? TMD_SignatureType => _model.TMDFileData?.SignatureType;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SignatureSize"/>
#if NET48
public ushort TMD_SignatureSize => _model.TMDFileData.SignatureSize;
#else
public ushort? TMD_SignatureSize => _model.TMDFileData?.SignatureSize;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.PaddingSize"/>
#if NET48
public byte TMD_PaddingSize => _model.TMDFileData.PaddingSize;
#else
public byte? TMD_PaddingSize => _model.TMDFileData?.PaddingSize;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Signature"/>
#if NET48
public byte[] TMD_Signature => _model.TMDFileData.Signature;
#else
public byte[]? TMD_Signature => _model.TMDFileData.Signature;
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;
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;
public string? TMD_Issuer => _model.TMDFileData?.Issuer;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Version"/>
#if NET48
public byte TMD_Version => _model.TMDFileData.Version;
#else
public byte? TMD_Version => _model.TMDFileData?.Version;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.CaCrlVersion"/>
#if NET48
public byte TMD_CaCrlVersion => _model.TMDFileData.CaCrlVersion;
#else
public byte? TMD_CaCrlVersion => _model.TMDFileData?.CaCrlVersion;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SignerCrlVersion"/>
#if NET48
public byte TMD_SignerCrlVersion => _model.TMDFileData.SignerCrlVersion;
#else
public byte? TMD_SignerCrlVersion => _model.TMDFileData?.SignerCrlVersion;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Reserved1"/>
#if NET48
public byte TMD_Reserved1 => _model.TMDFileData.Reserved1;
#else
public byte? TMD_Reserved1 => _model.TMDFileData?.Reserved1;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SystemVersion"/>
#if NET48
public ulong TMD_SystemVersion => _model.TMDFileData.SystemVersion;
#else
public ulong? TMD_SystemVersion => _model.TMDFileData?.SystemVersion;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.TitleID"/>
#if NET48
public ulong TMD_TitleID => _model.TMDFileData.TitleID;
#else
public ulong? TMD_TitleID => _model.TMDFileData?.TitleID;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.TitleType"/>
#if NET48
public uint TMD_TitleType => _model.TMDFileData.TitleType;
#else
public uint? TMD_TitleType => _model.TMDFileData?.TitleType;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.GroupID"/>
#if NET48
public ushort TMD_GroupID => _model.TMDFileData.GroupID;
#else
public ushort? TMD_GroupID => _model.TMDFileData?.GroupID;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SaveDataSize"/>
#if NET48
public uint TMD_SaveDataSize => _model.TMDFileData.SaveDataSize;
#else
public uint? TMD_SaveDataSize => _model.TMDFileData?.SaveDataSize;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SRLPrivateSaveDataSize"/>
#if NET48
public uint TMD_SRLPrivateSaveDataSize => _model.TMDFileData.SRLPrivateSaveDataSize;
#else
public uint? TMD_SRLPrivateSaveDataSize => _model.TMDFileData?.SRLPrivateSaveDataSize;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Reserved2"/>
#if NET48
public byte[] TMD_Reserved2 => _model.TMDFileData.Reserved2;
#else
public byte[]? TMD_Reserved2 => _model.TMDFileData.Reserved2;
public byte[]? TMD_Reserved2 => _model.TMDFileData?.Reserved2;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SRLFlag"/>
#if NET48
public byte TMD_SRLFlag => _model.TMDFileData.SRLFlag;
#else
public byte? TMD_SRLFlag => _model.TMDFileData?.SRLFlag;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Reserved3"/>
#if NET48
public byte[] TMD_Reserved3 => _model.TMDFileData.Reserved3;
#else
public byte[]? TMD_Reserved3 => _model.TMDFileData.Reserved3;
public byte[]? TMD_Reserved3 => _model.TMDFileData?.Reserved3;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.AccessRights"/>
#if NET48
public uint TMD_AccessRights => _model.TMDFileData.AccessRights;
#else
public uint? TMD_AccessRights => _model.TMDFileData?.AccessRights;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.TitleVersion"/>
#if NET48
public ushort TMD_TitleVersion => _model.TMDFileData.TitleVersion;
#else
public ushort? TMD_TitleVersion => _model.TMDFileData?.TitleVersion;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.ContentCount"/>
#if NET48
public ushort TMD_ContentCount => _model.TMDFileData.ContentCount;
#else
public ushort? TMD_ContentCount => _model.TMDFileData?.ContentCount;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.BootContent"/>
#if NET48
public ushort TMD_BootContent => _model.TMDFileData.BootContent;
#else
public ushort? TMD_BootContent => _model.TMDFileData?.BootContent;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Padding2"/>
#if NET48
public byte[] TMD_Padding2 => _model.TMDFileData.Padding2;
#else
public byte[]? TMD_Padding2 => _model.TMDFileData.Padding2;
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;
public byte[]? TMD_SHA256HashContentInfoRecords => _model.TMDFileData?.SHA256HashContentInfoRecords;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.ContentInfoRecords"/>
#if NET48
public SabreTools.Models.N3DS.ContentInfoRecord[] TMD_ContentInfoRecords => _model.TMDFileData.ContentInfoRecords;
#else
public SabreTools.Models.N3DS.ContentInfoRecord?[]? TMD_ContentInfoRecords => _model.TMDFileData.ContentInfoRecords;
public SabreTools.Models.N3DS.ContentInfoRecord?[]? TMD_ContentInfoRecords => _model.TMDFileData?.ContentInfoRecords;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.ContentChunkRecords"/>
#if NET48
public SabreTools.Models.N3DS.ContentChunkRecord[] TMD_ContentChunkRecords => _model.TMDFileData.ContentChunkRecords;
#else
public SabreTools.Models.N3DS.ContentChunkRecord?[]? TMD_ContentChunkRecords => _model.TMDFileData.ContentChunkRecords;
public SabreTools.Models.N3DS.ContentChunkRecord?[]? TMD_ContentChunkRecords => _model.TMDFileData?.ContentChunkRecords;
#endif
/// <inheritdoc cref="Models.N3DS.TitleMetadata.CertificateChain"/>
#if NET48
public SabreTools.Models.N3DS.Certificate[] TMD_CertificateChain => _model.TMDFileData.CertificateChain;
#else
public SabreTools.Models.N3DS.Certificate?[]? TMD_CertificateChain => _model.TMDFileData.CertificateChain;
public SabreTools.Models.N3DS.Certificate?[]? TMD_CertificateChain => _model.TMDFileData?.CertificateChain;
#endif
#endregion
@@ -524,6 +696,12 @@ namespace BinaryObjectScanner.Wrappers
}
builder.AppendLine($" Certificate {i}{certificateName}");
if (certificate == null)
{
builder.AppendLine(" [NULL]");
continue;
}
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})");
@@ -585,9 +763,16 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Audit: {T_Audit} (0x{T_Audit:X})");
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++)
if (T_Limits == null || T_Limits.Length == 0)
{
builder.AppendLine($" Limit {i}: {T_Limits[i]} (0x{T_Limits[i]:X})");
builder.AppendLine(" No limits");
}
else
{
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: {(T_ContentIndex == null ? "[NULL]" : BitConverter.ToString(T_ContentIndex).Replace('-', ' '))}");
@@ -613,6 +798,12 @@ namespace BinaryObjectScanner.Wrappers
}
builder.AppendLine($" Certificate {i}{certificateName}");
if (certificate == null)
{
builder.AppendLine(" [NULL]");
continue;
}
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})");
@@ -687,6 +878,12 @@ namespace BinaryObjectScanner.Wrappers
{
var contentInfoRecord = TMD_ContentInfoRecords[i];
builder.AppendLine($" Content Info Record {i}");
if (contentInfoRecord == null)
{
builder.AppendLine(" [NULL]");
continue;
}
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: {(contentInfoRecord.UnhashedContentRecordsSHA256Hash == null ? "[NULL]" : BitConverter.ToString(contentInfoRecord.UnhashedContentRecordsSHA256Hash).Replace('-', ' '))}");
@@ -706,6 +903,12 @@ namespace BinaryObjectScanner.Wrappers
{
var contentChunkRecord = TMD_ContentChunkRecords[i];
builder.AppendLine($" Content Chunk Record {i}");
if (contentChunkRecord == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Content ID: {contentChunkRecord.ContentId} (0x{contentChunkRecord.ContentId:X})");
builder.AppendLine($" Content index: {contentChunkRecord.ContentIndex} (0x{contentChunkRecord.ContentIndex:X})");
builder.AppendLine($" Content type: {contentChunkRecord.ContentType} (0x{contentChunkRecord.ContentType:X})");
@@ -735,6 +938,12 @@ namespace BinaryObjectScanner.Wrappers
}
builder.AppendLine($" Certificate {i}{certificateName}");
if (certificate == null)
{
builder.AppendLine(" [NULL]");
continue;
}
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})");
@@ -780,6 +989,12 @@ namespace BinaryObjectScanner.Wrappers
{
var partitionHeader = Partitions[i];
builder.AppendLine($" NCCH Partition Header {i}");
if (partitionHeader == null)
{
builder.AppendLine(" [NULL]");
continue;
}
if (partitionHeader.MagicID == string.Empty)
{
builder.AppendLine($" Empty partition, no data can be parsed");
@@ -805,14 +1020,21 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Extended header size in bytes: {partitionHeader.ExtendedHeaderSizeInBytes} (0x{partitionHeader.ExtendedHeaderSizeInBytes:X})");
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})");
builder.AppendLine($" Reserved 2: {partitionHeader.Flags.Reserved2} (0x{partitionHeader.Flags.Reserved2:X})");
builder.AppendLine($" Crypto method: {partitionHeader.Flags.CryptoMethod} (0x{partitionHeader.Flags.CryptoMethod:X})");
builder.AppendLine($" Content platform: {partitionHeader.Flags.ContentPlatform} (0x{partitionHeader.Flags.ContentPlatform:X})");
builder.AppendLine($" Content type: {partitionHeader.Flags.MediaPlatformIndex} (0x{partitionHeader.Flags.MediaPlatformIndex:X})");
builder.AppendLine($" Content unit size: {partitionHeader.Flags.ContentUnitSize} (0x{partitionHeader.Flags.ContentUnitSize:X})");
builder.AppendLine($" Bitmasks: {partitionHeader.Flags.BitMasks} (0x{partitionHeader.Flags.BitMasks:X})");
if (partitionHeader.Flags == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Reserved 0: {partitionHeader.Flags.Reserved0} (0x{partitionHeader.Flags.Reserved0:X})");
builder.AppendLine($" Reserved 1: {partitionHeader.Flags.Reserved1} (0x{partitionHeader.Flags.Reserved1:X})");
builder.AppendLine($" Reserved 2: {partitionHeader.Flags.Reserved2} (0x{partitionHeader.Flags.Reserved2:X})");
builder.AppendLine($" Crypto method: {partitionHeader.Flags.CryptoMethod} (0x{partitionHeader.Flags.CryptoMethod:X})");
builder.AppendLine($" Content platform: {partitionHeader.Flags.ContentPlatform} (0x{partitionHeader.Flags.ContentPlatform:X})");
builder.AppendLine($" Content type: {partitionHeader.Flags.MediaPlatformIndex} (0x{partitionHeader.Flags.MediaPlatformIndex:X})");
builder.AppendLine($" Content unit size: {partitionHeader.Flags.ContentUnitSize} (0x{partitionHeader.Flags.ContentUnitSize:X})");
builder.AppendLine($" Bitmasks: {partitionHeader.Flags.BitMasks} (0x{partitionHeader.Flags.BitMasks:X})");
}
builder.AppendLine($" Plain region offset, in media units: {partitionHeader.PlainRegionOffsetInMediaUnits} (0x{partitionHeader.PlainRegionOffsetInMediaUnits:X})");
builder.AppendLine($" Plain region size, in media units: {partitionHeader.PlainRegionSizeInMediaUnits} (0x{partitionHeader.PlainRegionSizeInMediaUnits:X})");
builder.AppendLine($" Logo region offset, in media units: {partitionHeader.LogoRegionOffsetInMediaUnits} (0x{partitionHeader.LogoRegionOffsetInMediaUnits:X})");
@@ -843,11 +1065,11 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine(" -------------------------");
if (_model.MetaData == null || MetaSize == 0)
{
builder.AppendLine(value: " No meta file data");
builder.AppendLine(" No meta file data");
}
else
{
builder.AppendLine(value: $" Title ID dependency list: {(MD_TitleIDDependencyList == null ? "[NULL]" : BitConverter.ToString(MD_TitleIDDependencyList).Replace('-', ' '))}");
builder.AppendLine($" 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: {(MD_Reserved2 == null ? "[NULL]" : BitConverter.ToString(MD_Reserved2).Replace('-', ' '))}");

View File

@@ -19,65 +19,141 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.GCF.Header.Dummy0"/>
#if NET48
public uint Dummy0 => _model.Header.Dummy0;
#else
public uint? Dummy0 => _model.Header?.Dummy0;
#endif
/// <inheritdoc cref="Models.GCF.Header.MajorVersion"/>
#if NET48
public uint MajorVersion => _model.Header.MajorVersion;
#else
public uint? MajorVersion => _model.Header?.MajorVersion;
#endif
/// <inheritdoc cref="Models.GCF.Header.MinorVersion"/>
#if NET48
public uint MinorVersion => _model.Header.MinorVersion;
#else
public uint? MinorVersion => _model.Header?.MinorVersion;
#endif
/// <inheritdoc cref="Models.GCF.Header.CacheID"/>
#if NET48
public uint CacheID => _model.Header.CacheID;
#else
public uint? CacheID => _model.Header?.CacheID;
#endif
/// <inheritdoc cref="Models.GCF.Header.LastVersionPlayed"/>
#if NET48
public uint LastVersionPlayed => _model.Header.LastVersionPlayed;
#else
public uint? LastVersionPlayed => _model.Header?.LastVersionPlayed;
#endif
/// <inheritdoc cref="Models.GCF.Header.Dummy1"/>
#if NET48
public uint Dummy1 => _model.Header.Dummy1;
#else
public uint? Dummy1 => _model.Header?.Dummy1;
#endif
/// <inheritdoc cref="Models.GCF.Header.Dummy2"/>
#if NET48
public uint Dummy2 => _model.Header.Dummy2;
#else
public uint? Dummy2 => _model.Header?.Dummy2;
#endif
/// <inheritdoc cref="Models.GCF.Header.FileSize"/>
#if NET48
public uint FileSize => _model.Header.FileSize;
#else
public uint? FileSize => _model.Header?.FileSize;
#endif
/// <inheritdoc cref="Models.GCF.Header.BlockSize"/>
#if NET48
public uint BlockSize => _model.Header.BlockSize;
#else
public uint? BlockSize => _model.Header?.BlockSize;
#endif
/// <inheritdoc cref="Models.GCF.Header.BlockCount"/>
#if NET48
public uint BlockCount => _model.Header.BlockCount;
#else
public uint? BlockCount => _model.Header?.BlockCount;
#endif
/// <inheritdoc cref="Models.GCF.Header.Dummy3"/>
#if NET48
public uint Dummy3 => _model.Header.Dummy3;
#else
public uint? Dummy3 => _model.Header?.Dummy3;
#endif
#endregion
#region Block Entry Header
/// <inheritdoc cref="Models.GCF.BlockEntryHeader.BlockCount"/>
#if NET48
public uint BEH_BlockCount => _model.BlockEntryHeader.BlockCount;
#else
public uint? BEH_BlockCount => _model.BlockEntryHeader?.BlockCount;
#endif
/// <inheritdoc cref="Models.GCF.BlockEntryHeader.BlocksUsed"/>
#if NET48
public uint BEH_BlocksUsed => _model.BlockEntryHeader.BlocksUsed;
#else
public uint? BEH_BlocksUsed => _model.BlockEntryHeader?.BlocksUsed;
#endif
/// <inheritdoc cref="Models.GCF.BlockEntryHeader.Dummy0"/>
#if NET48
public uint BEH_Dummy0 => _model.BlockEntryHeader.Dummy0;
#else
public uint? BEH_Dummy0 => _model.BlockEntryHeader?.Dummy0;
#endif
/// <inheritdoc cref="Models.GCF.BlockEntryHeader.Dummy1"/>
#if NET48
public uint BEH_Dummy1 => _model.BlockEntryHeader.Dummy1;
#else
public uint? BEH_Dummy1 => _model.BlockEntryHeader?.Dummy1;
#endif
/// <inheritdoc cref="Models.GCF.BlockEntryHeader.Dummy2"/>
#if NET48
public uint BEH_Dummy2 => _model.BlockEntryHeader.Dummy2;
#else
public uint? BEH_Dummy2 => _model.BlockEntryHeader?.Dummy2;
#endif
/// <inheritdoc cref="Models.GCF.BlockEntryHeader.Dummy3"/>
#if NET48
public uint BEH_Dummy3 => _model.BlockEntryHeader.Dummy3;
#else
public uint? BEH_Dummy3 => _model.BlockEntryHeader?.Dummy3;
#endif
/// <inheritdoc cref="Models.GCF.BlockEntryHeader.Dummy4"/>
#if NET48
public uint BEH_Dummy4 => _model.BlockEntryHeader.Dummy4;
#else
public uint? BEH_Dummy4 => _model.BlockEntryHeader?.Dummy4;
#endif
/// <inheritdoc cref="Models.GCF.BlockEntryHeader.Checksum"/>
#if NET48
public uint BEH_Checksum => _model.BlockEntryHeader.Checksum;
#else
public uint? BEH_Checksum => _model.BlockEntryHeader?.Checksum;
#endif
#endregion
@@ -95,16 +171,32 @@ namespace BinaryObjectScanner.Wrappers
#region Fragmentation Map Header
/// <inheritdoc cref="Models.GCF.FragmentationMapHeader.BlockCount"/>
#if NET48
public uint FMH_BlockCount => _model.FragmentationMapHeader.BlockCount;
#else
public uint? FMH_BlockCount => _model.FragmentationMapHeader?.BlockCount;
#endif
/// <inheritdoc cref="Models.GCF.FragmentationMapHeader.FirstUnusedEntry"/>
#if NET48
public uint FMH_FirstUnusedEntry => _model.FragmentationMapHeader.FirstUnusedEntry;
#else
public uint? FMH_FirstUnusedEntry => _model.FragmentationMapHeader?.FirstUnusedEntry;
#endif
/// <inheritdoc cref="Models.GCF.FragmentationMapHeader.Terminator"/>
#if NET48
public uint FMH_Terminator => _model.FragmentationMapHeader.Terminator;
#else
public uint? FMH_Terminator => _model.FragmentationMapHeader?.Terminator;
#endif
/// <inheritdoc cref="Models.GCF.FragmentationMapHeader.Checksum"/>
#if NET48
public uint FMH_Checksum => _model.FragmentationMapHeader.Checksum;
#else
public uint? FMH_Checksum => _model.FragmentationMapHeader?.Checksum;
#endif
#endregion
@@ -152,46 +244,102 @@ namespace BinaryObjectScanner.Wrappers
#region Directory Header
/// <inheritdoc cref="Models.GCF.DirectoryHeader.Dummy0"/>
#if NET48
public uint DH_Dummy0 => _model.DirectoryHeader.Dummy0;
#else
public uint? DH_Dummy0 => _model.DirectoryHeader?.Dummy0;
#endif
/// <inheritdoc cref="Models.GCF.DirectoryHeader.CacheID"/>
#if NET48
public uint DH_CacheID => _model.DirectoryHeader.CacheID;
#else
public uint? DH_CacheID => _model.DirectoryHeader?.CacheID;
#endif
/// <inheritdoc cref="Models.GCF.DirectoryHeader.LastVersionPlayed"/>
#if NET48
public uint DH_LastVersionPlayed => _model.DirectoryHeader.LastVersionPlayed;
#else
public uint? DH_LastVersionPlayed => _model.DirectoryHeader?.LastVersionPlayed;
#endif
/// <inheritdoc cref="Models.GCF.DirectoryHeader.ItemCount"/>
#if NET48
public uint DH_ItemCount => _model.DirectoryHeader.ItemCount;
#else
public uint? DH_ItemCount => _model.DirectoryHeader?.ItemCount;
#endif
/// <inheritdoc cref="Models.GCF.DirectoryHeader.FileCount"/>
#if NET48
public uint DH_FileCount => _model.DirectoryHeader.FileCount;
#else
public uint? DH_FileCount => _model.DirectoryHeader?.FileCount;
#endif
/// <inheritdoc cref="Models.GCF.DirectoryHeader.Dummy1"/>
#if NET48
public uint DH_Dummy1 => _model.DirectoryHeader.Dummy1;
#else
public uint? DH_Dummy1 => _model.DirectoryHeader?.Dummy1;
#endif
/// <inheritdoc cref="Models.GCF.DirectoryHeader.DirectorySize"/>
#if NET48
public uint DH_DirectorySize => _model.DirectoryHeader.DirectorySize;
#else
public uint? DH_DirectorySize => _model.DirectoryHeader?.DirectorySize;
#endif
/// <inheritdoc cref="Models.GCF.DirectoryHeader.NameSize"/>
#if NET48
public uint DH_NameSize => _model.DirectoryHeader.NameSize;
#else
public uint? DH_NameSize => _model.DirectoryHeader?.NameSize;
#endif
/// <inheritdoc cref="Models.GCF.DirectoryHeader.Info1Count"/>
#if NET48
public uint DH_Info1Count => _model.DirectoryHeader.Info1Count;
#else
public uint? DH_Info1Count => _model.DirectoryHeader?.Info1Count;
#endif
/// <inheritdoc cref="Models.GCF.DirectoryHeader.CopyCount"/>
#if NET48
public uint DH_CopyCount => _model.DirectoryHeader.CopyCount;
#else
public uint? DH_CopyCount => _model.DirectoryHeader?.CopyCount;
#endif
/// <inheritdoc cref="Models.GCF.DirectoryHeader.LocalCount"/>
#if NET48
public uint DH_LocalCount => _model.DirectoryHeader.LocalCount;
#else
public uint? DH_LocalCount => _model.DirectoryHeader?.LocalCount;
#endif
/// <inheritdoc cref="Models.GCF.DirectoryHeader.Dummy2"/>
#if NET48
public uint DH_Dummy2 => _model.DirectoryHeader.Dummy2;
#else
public uint? DH_Dummy2 => _model.DirectoryHeader?.Dummy2;
#endif
/// <inheritdoc cref="Models.GCF.DirectoryHeader.Dummy3"/>
#if NET48
public uint DH_Dummy3 => _model.DirectoryHeader.Dummy3;
#else
public uint? DH_Dummy3 => _model.DirectoryHeader?.Dummy3;
#endif
/// <inheritdoc cref="Models.GCF.DirectoryHeader.Checksum"/>
#if NET48
public uint DH_Checksum => _model.DirectoryHeader.Checksum;
#else
public uint? DH_Checksum => _model.DirectoryHeader?.Checksum;
#endif
#endregion
@@ -285,26 +433,50 @@ namespace BinaryObjectScanner.Wrappers
#region Checksum Header
/// <inheritdoc cref="Models.GCF.ChecksumHeader.Dummy0"/>
#if NET48
public uint CH_Dummy0 => _model.ChecksumHeader.Dummy0;
#else
public uint? CH_Dummy0 => _model.ChecksumHeader?.Dummy0;
#endif
/// <inheritdoc cref="Models.GCF.ChecksumHeader.ChecksumSize"/>
#if NET48
public uint CH_ChecksumSize => _model.ChecksumHeader.ChecksumSize;
#else
public uint? CH_ChecksumSize => _model.ChecksumHeader?.ChecksumSize;
#endif
#endregion
#region Checksum Map Header
/// <inheritdoc cref="Models.GCF.ChecksumMapHeader.Dummy0"/>
#if NET48
public uint CMH_Dummy0 => _model.ChecksumMapHeader.Dummy0;
#else
public uint? CMH_Dummy0 => _model.ChecksumMapHeader?.Dummy0;
#endif
/// <inheritdoc cref="Models.GCF.ChecksumMapHeader.Dummy1"/>
#if NET48
public uint CMH_Dummy1 => _model.ChecksumMapHeader.Dummy1;
#else
public uint? CMH_Dummy1 => _model.ChecksumMapHeader?.Dummy1;
#endif
/// <inheritdoc cref="Models.GCF.ChecksumMapHeader.ItemCount"/>
#if NET48
public uint CMH_ItemCount => _model.ChecksumMapHeader.ItemCount;
#else
public uint? CMH_ItemCount => _model.ChecksumMapHeader?.ItemCount;
#endif
/// <inheritdoc cref="Models.GCF.ChecksumMapHeader.ChecksumCount"/>
#if NET48
public uint CMH_ChecksumCount => _model.ChecksumMapHeader.ChecksumCount;
#else
public uint? CMH_ChecksumCount => _model.ChecksumMapHeader?.ChecksumCount;
#endif
#endregion
@@ -333,22 +505,46 @@ namespace BinaryObjectScanner.Wrappers
#region Data Block Header
/// <inheritdoc cref="Models.GCF.DataBlockHeader.LastVersionPlayed"/>
#if NET48
public uint DBH_LastVersionPlayed => _model.DataBlockHeader.LastVersionPlayed;
#else
public uint? DBH_LastVersionPlayed => _model.DataBlockHeader?.LastVersionPlayed;
#endif
/// <inheritdoc cref="Models.GCF.DataBlockHeader.BlockCount"/>
#if NET48
public uint DBH_BlockCount => _model.DataBlockHeader.BlockCount;
#else
public uint? DBH_BlockCount => _model.DataBlockHeader?.BlockCount;
#endif
/// <inheritdoc cref="Models.GCF.DataBlockHeader.BlockSize"/>
#if NET48
public uint DBH_BlockSize => _model.DataBlockHeader.BlockSize;
#else
public uint? DBH_BlockSize => _model.DataBlockHeader?.BlockSize;
#endif
/// <inheritdoc cref="Models.GCF.DataBlockHeader.FirstBlockOffset"/>
#if NET48
public uint DBH_FirstBlockOffset => _model.DataBlockHeader.FirstBlockOffset;
#else
public uint? DBH_FirstBlockOffset => _model.DataBlockHeader?.FirstBlockOffset;
#endif
/// <inheritdoc cref="Models.GCF.DataBlockHeader.BlocksUsed"/>
#if NET48
public uint DBH_BlocksUsed => _model.DataBlockHeader.BlocksUsed;
#else
public uint? DBH_BlocksUsed => _model.DataBlockHeader?.BlocksUsed;
#endif
/// <inheritdoc cref="Models.GCF.DataBlockHeader.Checksum"/>
#if NET48
public uint DBH_Checksum => _model.DataBlockHeader.Checksum;
#else
public uint? DBH_Checksum => _model.DataBlockHeader?.Checksum;
#endif
#endregion
@@ -359,7 +555,11 @@ namespace BinaryObjectScanner.Wrappers
/// <summary>
/// Set of all files and their information
/// </summary>
#if NET48
public FileInfo[] Files
#else
public FileInfo[]? Files
#endif
{
get
{
@@ -367,6 +567,10 @@ namespace BinaryObjectScanner.Wrappers
if (_files != null)
return _files;
// If we don't have a required property
if (DirectoryEntries == null || DirectoryMapEntries == null || BlockEntries == null)
return null;
// Otherwise, scan and build the files
var files = new List<FileInfo>();
for (int i = 0; i < DirectoryEntries.Length; i++)
@@ -374,6 +578,8 @@ namespace BinaryObjectScanner.Wrappers
// Get the directory entry
var directoryEntry = DirectoryEntries[i];
var directoryMapEntry = DirectoryMapEntries[i];
if (directoryEntry == null || directoryMapEntry == null)
continue;
// If we have a directory, skip for now
if (!directoryEntry.DirectoryFlags.HasFlag(SabreTools.Models.GCF.HL_GCF_FLAG.HL_GCF_FLAG_FILE))
@@ -397,6 +603,9 @@ namespace BinaryObjectScanner.Wrappers
while (index != 0xFFFFFFFF)
{
var parentDirectoryEntry = DirectoryEntries[index];
if (parentDirectoryEntry == null)
break;
pathParts.Add(parentDirectoryEntry.Name ?? string.Empty);
index = parentDirectoryEntry.ParentIndex;
}
@@ -406,6 +615,9 @@ namespace BinaryObjectScanner.Wrappers
while (index != DBH_BlockCount)
{
var nextBlock = BlockEntries[index];
if (nextBlock == null)
break;
blockEntries.Add(nextBlock);
index = nextBlock.NextBlockEntryIndex;
}
@@ -430,7 +642,11 @@ namespace BinaryObjectScanner.Wrappers
/// <summary>
/// Set of all data block offsets
/// </summary>
#if NET48
public long[] DataBlockOffsets
#else
public long[]? DataBlockOffsets
#endif
{
get
{
@@ -438,11 +654,25 @@ namespace BinaryObjectScanner.Wrappers
if (_dataBlockOffsets != null)
return _dataBlockOffsets;
#if NET6_0_OR_GREATER
// If we don't have a block count, offset, or size
if (DBH_BlockCount == null || DBH_FirstBlockOffset == null || DBH_BlockSize == null)
return null;
#endif
// Otherwise, build the data block set
#if NET48
_dataBlockOffsets = new long[DBH_BlockCount];
#else
_dataBlockOffsets = new long[DBH_BlockCount.Value];
#endif
for (int i = 0; i < DBH_BlockCount; i++)
{
#if NET48
long dataBlockOffset = DBH_FirstBlockOffset + (i * DBH_BlockSize);
#else
long dataBlockOffset = DBH_FirstBlockOffset.Value + (i * DBH_BlockSize.Value);
#endif
_dataBlockOffsets[i] = dataBlockOffset;
}
@@ -458,12 +688,20 @@ namespace BinaryObjectScanner.Wrappers
/// <summary>
/// Set of all files and their information
/// </summary>
#if NET48
private FileInfo[] _files = null;
#else
private FileInfo[]? _files = null;
#endif
/// <summary>
/// Set of all data block offsets
/// </summary>
#if NET48
private long[] _dataBlockOffsets = null;
#else
private long[]? _dataBlockOffsets = null;
#endif
#endregion
@@ -655,6 +893,12 @@ namespace BinaryObjectScanner.Wrappers
{
var blockEntry = BlockEntries[i];
builder.AppendLine($" Block Entry {i}");
if (blockEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Entry flags: {blockEntry.EntryFlags} (0x{blockEntry.EntryFlags:X})");
builder.AppendLine($" File data offset: {blockEntry.FileDataOffset} (0x{blockEntry.FileDataOffset:X})");
builder.AppendLine($" File data size: {blockEntry.FileDataSize} (0x{blockEntry.FileDataSize:X})");
@@ -700,6 +944,12 @@ namespace BinaryObjectScanner.Wrappers
{
var fragmentationMap = FragmentationMaps[i];
builder.AppendLine($" Fragmentation Map {i}");
if (fragmentationMap == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Next data block index: {fragmentationMap.NextDataBlockIndex} (0x{fragmentationMap.NextDataBlockIndex:X})");
}
}
@@ -747,6 +997,12 @@ namespace BinaryObjectScanner.Wrappers
{
var blockEntryMap = BlockEntryMaps[i];
builder.AppendLine($" Block Entry Map {i}");
if (blockEntryMap == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Previous data block index: {blockEntryMap.PreviousBlockEntryIndex} (0x{blockEntryMap.PreviousBlockEntryIndex:X})");
builder.AppendLine($" Next data block index: {blockEntryMap.NextBlockEntryIndex} (0x{blockEntryMap.NextBlockEntryIndex:X})");
}
@@ -797,6 +1053,12 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryEntry = DirectoryEntries[i];
builder.AppendLine($" Directory Entry {i}");
if (directoryEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Name offset: {directoryEntry.NameOffset} (0x{directoryEntry.NameOffset:X})");
builder.AppendLine($" Name: {directoryEntry.Name ?? "[NULL]"}");
builder.AppendLine($" Item size: {directoryEntry.ItemSize} (0x{directoryEntry.ItemSize:X})");
@@ -828,6 +1090,12 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryInfoEntry = DirectoryInfo1Entries[i];
builder.AppendLine($" Directory Info 1 Entry {i}");
if (directoryInfoEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Dummy 0: {directoryInfoEntry.Dummy0} (0x{directoryInfoEntry.Dummy0:X})");
}
}
@@ -852,6 +1120,12 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryInfoEntry = DirectoryInfo2Entries[i];
builder.AppendLine($" Directory Info 2 Entry {i}");
if (directoryInfoEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Dummy 0: {directoryInfoEntry.Dummy0} (0x{directoryInfoEntry.Dummy0:X})");
}
}
@@ -865,7 +1139,7 @@ namespace BinaryObjectScanner.Wrappers
private void PrintDirectoryCopyEntries(StringBuilder builder)
{
builder.AppendLine(" Directory Copy Entries Information:");
builder.AppendLine(value: " -------------------------");
builder.AppendLine(" -------------------------");
if (DirectoryCopyEntries == null || DirectoryCopyEntries.Length == 0)
{
builder.AppendLine(" No directory copy entries");
@@ -876,6 +1150,12 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryCopyEntry = DirectoryCopyEntries[i];
builder.AppendLine($" Directory Copy Entry {i}");
if (directoryCopyEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Directory index: {directoryCopyEntry.DirectoryIndex} (0x{directoryCopyEntry.DirectoryIndex:X})");
}
}
@@ -889,7 +1169,7 @@ namespace BinaryObjectScanner.Wrappers
private void PrintDirectoryLocalEntries(StringBuilder builder)
{
builder.AppendLine(" Directory Local Entries Information:");
builder.AppendLine(value: " -------------------------");
builder.AppendLine(" -------------------------");
if (DirectoryLocalEntries == null || DirectoryLocalEntries.Length == 0)
{
builder.AppendLine(" No directory local entries");
@@ -900,6 +1180,12 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryLocalEntry = DirectoryLocalEntries[i];
builder.AppendLine($" Directory Local Entry {i}");
if (directoryLocalEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Directory index: {directoryLocalEntry.DirectoryIndex} (0x{directoryLocalEntry.DirectoryIndex:X})");
}
}
@@ -933,7 +1219,7 @@ namespace BinaryObjectScanner.Wrappers
private void PrintDirectoryMapEntries(StringBuilder builder)
{
builder.AppendLine(" Directory Map Entries Information:");
builder.AppendLine(value: " -------------------------");
builder.AppendLine(" -------------------------");
if (DirectoryMapEntries == null || DirectoryMapEntries.Length == 0)
{
builder.AppendLine(" No directory map entries");
@@ -944,6 +1230,12 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryMapEntry = DirectoryMapEntries[i];
builder.AppendLine($" Directory Map Entry {i}");
if (directoryMapEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" First block index: {directoryMapEntry.FirstBlockIndex} (0x{directoryMapEntry.FirstBlockIndex:X})");
}
}
@@ -985,7 +1277,7 @@ namespace BinaryObjectScanner.Wrappers
private void PrintChecksumMapEntries(StringBuilder builder)
{
builder.AppendLine(" Checksum Map Entries Information:");
builder.AppendLine(value: " -------------------------");
builder.AppendLine(" -------------------------");
if (ChecksumMapEntries == null || ChecksumMapEntries.Length == 0)
{
builder.AppendLine(" No checksum map entries");
@@ -996,6 +1288,12 @@ namespace BinaryObjectScanner.Wrappers
{
var checksumMapEntry = ChecksumMapEntries[i];
builder.AppendLine($" Checksum Map Entry {i}");
if (checksumMapEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Checksum count: {checksumMapEntry.ChecksumCount} (0x{checksumMapEntry.ChecksumCount:X})");
builder.AppendLine($" First checksum index: {checksumMapEntry.FirstChecksumIndex} (0x{checksumMapEntry.FirstChecksumIndex:X})");
}
@@ -1010,7 +1308,7 @@ namespace BinaryObjectScanner.Wrappers
private void PrintChecksumEntries(StringBuilder builder)
{
builder.AppendLine(" Checksum Entries Information:");
builder.AppendLine(value: " -------------------------");
builder.AppendLine(" -------------------------");
if (ChecksumEntries == null || ChecksumEntries.Length == 0)
{
builder.AppendLine(" No checksum entries");
@@ -1021,6 +1319,12 @@ namespace BinaryObjectScanner.Wrappers
{
var checksumEntry = ChecksumEntries[i];
builder.AppendLine($" Checksum Entry {i}");
if (checksumEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Checksum: {checksumEntry.Checksum} (0x{checksumEntry.Checksum:X})");
}
}
@@ -1085,7 +1389,7 @@ namespace BinaryObjectScanner.Wrappers
public bool ExtractFile(int index, string outputDirectory)
{
// If we have no files
if (Files == null || Files.Length == 0)
if (Files == null || Files.Length == 0 || DataBlockOffsets == null)
return false;
// If the files index is invalid
@@ -1094,7 +1398,7 @@ namespace BinaryObjectScanner.Wrappers
// Get the file
var file = Files[index];
if (file.Size == 0)
if (file?.BlockEntries == null || file.Size == 0)
return false;
// If the file is encrypted -- TODO: Revisit later
@@ -1106,6 +1410,8 @@ namespace BinaryObjectScanner.Wrappers
for (int i = 0; i < file.BlockEntries.Length; i++)
{
var blockEntry = file.BlockEntries[i];
if (blockEntry == null)
continue;
uint dataBlockIndex = blockEntry.FirstDataBlockIndex;
long blockEntrySize = blockEntry.FileDataSize;
@@ -1113,12 +1419,20 @@ namespace BinaryObjectScanner.Wrappers
{
long dataBlockOffset = DataBlockOffsets[dataBlockIndex++];
dataBlockOffsets.Add(dataBlockOffset);
#if NET48
blockEntrySize -= DBH_BlockSize;
#else
blockEntrySize -= DBH_BlockSize ?? 0;
#endif
}
}
// Create the filename
#if NET48
string filename = file.Path;
#else
string? filename = file.Path;
#endif
// If we have an invalid output directory
if (string.IsNullOrWhiteSpace(outputDirectory))
@@ -1146,11 +1460,11 @@ namespace BinaryObjectScanner.Wrappers
long fileSize = file.Size;
for (int i = 0; i < dataBlockOffsets.Count; i++)
{
int readSize = (int)Math.Min(DBH_BlockSize, fileSize);
#if NET48
int readSize = (int)Math.Min(DBH_BlockSize, fileSize);
byte[] data = ReadFromDataSource((int)dataBlockOffsets[i], readSize);
#else
int readSize = (int)Math.Min(DBH_BlockSize ?? 0, fileSize);
byte[]? data = ReadFromDataSource((int)dataBlockOffsets[i], readSize);
#endif
if (data == null)

View File

@@ -22,188 +22,316 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string Signature => _model.CommonHeader.Signature;
#else
public string? Signature => _model.CommonHeader.Signature;
public string? Signature => _model.CommonHeader?.Signature;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.CommonHeader.Version"/>
#if NET48
public uint Version => _model.CommonHeader.Version;
#else
public uint? Version => _model.CommonHeader?.Version;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.CommonHeader.VolumeInfo"/>
#if NET48
public uint VolumeInfo => _model.CommonHeader.VolumeInfo;
#else
public uint? VolumeInfo => _model.CommonHeader?.VolumeInfo;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.CommonHeader.DescriptorOffset"/>
#if NET48
public uint DescriptorOffset => _model.CommonHeader.DescriptorOffset;
#else
public uint? DescriptorOffset => _model.CommonHeader?.DescriptorOffset;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.CommonHeader.DescriptorSize"/>
#if NET48
public uint DescriptorSize => _model.CommonHeader.DescriptorSize;
#else
public uint? DescriptorSize => _model.CommonHeader?.DescriptorSize;
#endif
#endregion
#region Volume Header
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.DataOffset"/>
#if NET48
public uint DataOffset => _model.VolumeHeader.DataOffset;
#else
public uint? DataOffset => _model.VolumeHeader?.DataOffset;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.DataOffsetHigh"/>
#if NET48
public uint DataOffsetHigh => _model.VolumeHeader.DataOffsetHigh;
#else
public uint? DataOffsetHigh => _model.VolumeHeader?.DataOffsetHigh;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.FirstFileIndex"/>
#if NET48
public uint FirstFileIndex => _model.VolumeHeader.FirstFileIndex;
#else
public uint? FirstFileIndex => _model.VolumeHeader?.FirstFileIndex;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.LastFileIndex"/>
#if NET48
public uint LastFileIndex => _model.VolumeHeader.LastFileIndex;
#else
public uint? LastFileIndex => _model.VolumeHeader?.LastFileIndex;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.FirstFileOffset"/>
#if NET48
public uint FirstFileOffset => _model.VolumeHeader.FirstFileOffset;
#else
public uint? FirstFileOffset => _model.VolumeHeader?.FirstFileOffset;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.FirstFileOffsetHigh"/>
#if NET48
public uint FirstFileOffsetHigh => _model.VolumeHeader.FirstFileOffsetHigh;
#else
public uint? FirstFileOffsetHigh => _model.VolumeHeader?.FirstFileOffsetHigh;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.FirstFileSizeExpanded"/>
#if NET48
public uint FirstFileSizeExpanded => _model.VolumeHeader.FirstFileSizeExpanded;
#else
public uint? FirstFileSizeExpanded => _model.VolumeHeader?.FirstFileSizeExpanded;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.FirstFileSizeExpandedHigh"/>
#if NET48
public uint FirstFileSizeExpandedHigh => _model.VolumeHeader.FirstFileSizeExpandedHigh;
#else
public uint? FirstFileSizeExpandedHigh => _model.VolumeHeader?.FirstFileSizeExpandedHigh;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.FirstFileSizeCompressed"/>
#if NET48
public uint FirstFileSizeCompressed => _model.VolumeHeader.FirstFileSizeCompressed;
#else
public uint? FirstFileSizeCompressed => _model.VolumeHeader?.FirstFileSizeCompressed;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.FirstFileSizeCompressedHigh"/>
#if NET48
public uint FirstFileSizeCompressedHigh => _model.VolumeHeader.FirstFileSizeCompressedHigh;
#else
public uint? FirstFileSizeCompressedHigh => _model.VolumeHeader?.FirstFileSizeCompressedHigh;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.LastFileOffset"/>
#if NET48
public uint LastFileOffset => _model.VolumeHeader.LastFileOffset;
#else
public uint? LastFileOffset => _model.VolumeHeader?.LastFileOffset;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.LastFileOffsetHigh"/>
#if NET48
public uint LastFileOffsetHigh => _model.VolumeHeader.LastFileOffsetHigh;
#else
public uint? LastFileOffsetHigh => _model.VolumeHeader?.LastFileOffsetHigh;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.LastFileSizeExpanded"/>
#if NET48
public uint LastFileSizeExpanded => _model.VolumeHeader.LastFileSizeExpanded;
#else
public uint? LastFileSizeExpanded => _model.VolumeHeader?.LastFileSizeExpanded;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.LastFileSizeExpandedHigh"/>
#if NET48
public uint LastFileSizeExpandedHigh => _model.VolumeHeader.LastFileSizeExpandedHigh;
#else
public uint? LastFileSizeExpandedHigh => _model.VolumeHeader?.LastFileSizeExpandedHigh;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.LastFileSizeCompressed"/>
#if NET48
public uint LastFileSizeCompressed => _model.VolumeHeader.LastFileSizeCompressed;
#else
public uint? LastFileSizeCompressed => _model.VolumeHeader?.LastFileSizeCompressed;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.VolumeHeader.LastFileSizeCompressedHigh"/>
#if NET48
public uint LastFileSizeCompressedHigh => _model.VolumeHeader.LastFileSizeCompressedHigh;
#else
public uint? LastFileSizeCompressedHigh => _model.VolumeHeader?.LastFileSizeCompressedHigh;
#endif
#endregion
#region Descriptor
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.StringsOffset"/>
#if NET48
public uint StringsOffset => _model.Descriptor.StringsOffset;
#else
public uint? StringsOffset => _model.Descriptor?.StringsOffset;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.Reserved0"/>
#if NET48
public byte[] Reserved0 => _model.Descriptor.Reserved0;
#else
public byte[]? Reserved0 => _model.Descriptor.Reserved0;
public byte[]? Reserved0 => _model.Descriptor?.Reserved0;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.ComponentListOffset"/>
#if NET48
public uint ComponentListOffset => _model.Descriptor.ComponentListOffset;
#else
public uint? ComponentListOffset => _model.Descriptor?.ComponentListOffset;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.FileTableOffset"/>
#if NET48
public uint FileTableOffset => _model.Descriptor.FileTableOffset;
#else
public uint? FileTableOffset => _model.Descriptor?.FileTableOffset;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.Reserved1"/>
#if NET48
public byte[] Reserved1 => _model.Descriptor.Reserved1;
#else
public byte[]? Reserved1 => _model.Descriptor.Reserved1;
public byte[]? Reserved1 => _model.Descriptor?.Reserved1;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.FileTableSize"/>
#if NET48
public uint FileTableSize => _model.Descriptor.FileTableSize;
#else
public uint? FileTableSize => _model.Descriptor?.FileTableSize;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.FileTableSize2"/>
#if NET48
public uint FileTableSize2 => _model.Descriptor.FileTableSize2;
#else
public uint? FileTableSize2 => _model.Descriptor?.FileTableSize2;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.DirectoryCount"/>
#if NET48
public ushort DirectoryCount => _model.Descriptor.DirectoryCount;
#else
public ushort? DirectoryCount => _model.Descriptor?.DirectoryCount;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.Reserved2"/>
#if NET48
public byte[] Reserved2 => _model.Descriptor.Reserved2;
#else
public byte[]? Reserved2 => _model.Descriptor.Reserved2;
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;
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;
public byte[]? Reserved4 => _model.Descriptor?.Reserved4;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.FileCount"/>
#if NET48
public uint FileCount => _model.Descriptor.FileCount;
#else
public uint? FileCount => _model.Descriptor?.FileCount;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.FileTableOffset2"/>
#if NET48
public uint FileTableOffset2 => _model.Descriptor.FileTableOffset2;
#else
public uint? FileTableOffset2 => _model.Descriptor?.FileTableOffset2;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.ComponentTableInfoCount"/>
#if NET48
public ushort ComponentTableInfoCount => _model.Descriptor.ComponentTableInfoCount;
#else
public ushort? ComponentTableInfoCount => _model.Descriptor?.ComponentTableInfoCount;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.ComponentTableOffset"/>
#if NET48
public uint ComponentTableOffset => _model.Descriptor.ComponentTableOffset;
#else
public uint? ComponentTableOffset => _model.Descriptor?.ComponentTableOffset;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.Reserved5"/>
#if NET48
public byte[] Reserved5 => _model.Descriptor.Reserved5;
#else
public byte[]? Reserved5 => _model.Descriptor.Reserved5;
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;
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;
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;
public uint[]? D_ComponentOffsets => _model.Descriptor?.ComponentOffsets;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.SetupTypesOffset"/>
#if NET48
public uint SetupTypesOffset => _model.Descriptor.SetupTypesOffset;
#else
public uint? SetupTypesOffset => _model.Descriptor?.SetupTypesOffset;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.SetupTableOffset"/>
#if NET48
public uint SetupTableOffset => _model.Descriptor.SetupTableOffset;
#else
public uint? SetupTableOffset => _model.Descriptor?.SetupTableOffset;
#endif
/// <inheritdoc cref="Models.InstallShieldCabinet.Descriptor.Reserved7"/>
#if NET48
public byte[] Reserved7 => _model.Descriptor.Reserved7;
#else
public byte[]? Reserved7 => _model.Descriptor.Reserved7;
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;
public byte[]? Reserved8 => _model.Descriptor?.Reserved8;
#endif
#endregion
@@ -296,7 +424,11 @@ namespace BinaryObjectScanner.Wrappers
{
get
{
#if NET48
uint majorVersion = Version;
#else
uint majorVersion = Version ?? 0;
#endif
if (majorVersion >> 24 == 1)
{
majorVersion = (majorVersion >> 12) & 0x0F;
@@ -611,6 +743,12 @@ namespace BinaryObjectScanner.Wrappers
{
var fileDescriptor = FileDescriptors[i];
builder.AppendLine($" File Descriptor {i}:");
if (fileDescriptor == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Name offset: {fileDescriptor.NameOffset} (0x{fileDescriptor.NameOffset:X})");
builder.AppendLine($" Name: {fileDescriptor.Name ?? "[NULL]"}");
builder.AppendLine($" Directory index: {fileDescriptor.DirectoryIndex} (0x{fileDescriptor.DirectoryIndex:X})");

View File

@@ -23,47 +23,99 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string Stub_Magic => _model.Stub.Header.Magic;
#else
public string? Stub_Magic => _model.Stub.Header.Magic;
public string? Stub_Magic => _model.Stub?.Header?.Magic;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.LastPageBytes"/>
#if NET48
public ushort Stub_LastPageBytes => _model.Stub.Header.LastPageBytes;
#else
public ushort? Stub_LastPageBytes => _model.Stub?.Header?.LastPageBytes;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Pages"/>
#if NET48
public ushort Stub_Pages => _model.Stub.Header.Pages;
#else
public ushort? Stub_Pages => _model.Stub?.Header?.Pages;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.RelocationItems"/>
#if NET48
public ushort Stub_RelocationItems => _model.Stub.Header.RelocationItems;
#else
public ushort? Stub_RelocationItems => _model.Stub?.Header?.RelocationItems;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.HeaderParagraphSize"/>
#if NET48
public ushort Stub_HeaderParagraphSize => _model.Stub.Header.HeaderParagraphSize;
#else
public ushort? Stub_HeaderParagraphSize => _model.Stub?.Header?.HeaderParagraphSize;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.MinimumExtraParagraphs"/>
#if NET48
public ushort Stub_MinimumExtraParagraphs => _model.Stub.Header.MinimumExtraParagraphs;
#else
public ushort? Stub_MinimumExtraParagraphs => _model.Stub?.Header?.MinimumExtraParagraphs;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.MaximumExtraParagraphs"/>
#if NET48
public ushort Stub_MaximumExtraParagraphs => _model.Stub.Header.MaximumExtraParagraphs;
#else
public ushort? Stub_MaximumExtraParagraphs => _model.Stub?.Header?.MaximumExtraParagraphs;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.InitialSSValue"/>
#if NET48
public ushort Stub_InitialSSValue => _model.Stub.Header.InitialSSValue;
#else
public ushort? Stub_InitialSSValue => _model.Stub?.Header?.InitialSSValue;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.InitialSPValue"/>
#if NET48
public ushort Stub_InitialSPValue => _model.Stub.Header.InitialSPValue;
#else
public ushort? Stub_InitialSPValue => _model.Stub?.Header?.InitialSPValue;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Checksum"/>
#if NET48
public ushort Stub_Checksum => _model.Stub.Header.Checksum;
#else
public ushort? Stub_Checksum => _model.Stub?.Header?.Checksum;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.InitialIPValue"/>
#if NET48
public ushort Stub_InitialIPValue => _model.Stub.Header.InitialIPValue;
#else
public ushort? Stub_InitialIPValue => _model.Stub?.Header?.InitialIPValue;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.InitialCSValue"/>
#if NET48
public ushort Stub_InitialCSValue => _model.Stub.Header.InitialCSValue;
#else
public ushort? Stub_InitialCSValue => _model.Stub?.Header?.InitialCSValue;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.RelocationTableAddr"/>
#if NET48
public ushort Stub_RelocationTableAddr => _model.Stub.Header.RelocationTableAddr;
#else
public ushort? Stub_RelocationTableAddr => _model.Stub?.Header?.RelocationTableAddr;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.OverlayNumber"/>
#if NET48
public ushort Stub_OverlayNumber => _model.Stub.Header.OverlayNumber;
#else
public ushort? Stub_OverlayNumber => _model.Stub?.Header?.OverlayNumber;
#endif
#endregion
@@ -73,24 +125,36 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public ushort[] Stub_Reserved1 => _model.Stub.Header.Reserved1;
#else
public ushort[]? Stub_Reserved1 => _model.Stub.Header.Reserved1;
public ushort[]? Stub_Reserved1 => _model.Stub?.Header?.Reserved1;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.OEMIdentifier"/>
#if NET48
public ushort Stub_OEMIdentifier => _model.Stub.Header.OEMIdentifier;
#else
public ushort? Stub_OEMIdentifier => _model.Stub?.Header?.OEMIdentifier;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.OEMInformation"/>
#if NET48
public ushort Stub_OEMInformation => _model.Stub.Header.OEMInformation;
#else
public ushort? Stub_OEMInformation => _model.Stub?.Header?.OEMInformation;
#endif
/// <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;
public ushort[]? Stub_Reserved2 => _model?.Stub?.Header?.Reserved2;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.NewExeHeaderAddr"/>
#if NET48
public uint Stub_NewExeHeaderAddr => _model.Stub.Header.NewExeHeaderAddr;
#else
public uint? Stub_NewExeHeaderAddr => _model.Stub?.Header?.NewExeHeaderAddr;
#endif
#endregion
@@ -102,143 +166,323 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string Signature => _model.InformationBlock.Signature;
#else
public string? Signature => _model.InformationBlock.Signature;
public string? Signature => _model.InformationBlock?.Signature;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ByteOrder"/>
#if NET48
public SabreTools.Models.LinearExecutable.ByteOrder ByteOrder => _model.InformationBlock.ByteOrder;
#else
public SabreTools.Models.LinearExecutable.ByteOrder? ByteOrder => _model.InformationBlock?.ByteOrder;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.WordOrder"/>
#if NET48
public SabreTools.Models.LinearExecutable.WordOrder WordOrder => _model.InformationBlock.WordOrder;
#else
public SabreTools.Models.LinearExecutable.WordOrder? WordOrder => _model.InformationBlock?.WordOrder;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ExecutableFormatLevel"/>
#if NET48
public uint ExecutableFormatLevel => _model.InformationBlock.ExecutableFormatLevel;
#else
public uint? ExecutableFormatLevel => _model.InformationBlock?.ExecutableFormatLevel;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.CPUType"/>
#if NET48
public SabreTools.Models.LinearExecutable.CPUType CPUType => _model.InformationBlock.CPUType;
#else
public SabreTools.Models.LinearExecutable.CPUType? CPUType => _model.InformationBlock?.CPUType;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ModuleOS"/>
#if NET48
public SabreTools.Models.LinearExecutable.OperatingSystem ModuleOS => _model.InformationBlock.ModuleOS;
#else
public SabreTools.Models.LinearExecutable.OperatingSystem? ModuleOS => _model.InformationBlock?.ModuleOS;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ModuleVersion"/>
#if NET48
public uint ModuleVersion => _model.InformationBlock.ModuleVersion;
#else
public uint? ModuleVersion => _model.InformationBlock?.ModuleVersion;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ModuleTypeFlags"/>
#if NET48
public SabreTools.Models.LinearExecutable.ModuleFlags ModuleTypeFlags => _model.InformationBlock.ModuleTypeFlags;
#else
public SabreTools.Models.LinearExecutable.ModuleFlags? ModuleTypeFlags => _model.InformationBlock?.ModuleTypeFlags;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ModuleNumberPages"/>
#if NET48
public uint ModuleNumberPages => _model.InformationBlock.ModuleNumberPages;
#else
public uint? ModuleNumberPages => _model.InformationBlock?.ModuleNumberPages;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.InitialObjectCS"/>
#if NET48
public uint InitialObjectCS => _model.InformationBlock.InitialObjectCS;
#else
public uint? InitialObjectCS => _model.InformationBlock?.InitialObjectCS;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.InitialEIP"/>
#if NET48
public uint InitialEIP => _model.InformationBlock.InitialEIP;
#else
public uint? InitialEIP => _model.InformationBlock?.InitialEIP;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.InitialObjectSS"/>
#if NET48
public uint InitialObjectSS => _model.InformationBlock.InitialObjectSS;
#else
public uint? InitialObjectSS => _model.InformationBlock?.InitialObjectSS;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.InitialESP"/>
#if NET48
public uint InitialESP => _model.InformationBlock.InitialESP;
#else
public uint? InitialESP => _model.InformationBlock?.InitialESP;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.MemoryPageSize"/>
#if NET48
public uint MemoryPageSize => _model.InformationBlock.MemoryPageSize;
#else
public uint? MemoryPageSize => _model.InformationBlock?.MemoryPageSize;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.BytesOnLastPage"/>
#if NET48
public uint BytesOnLastPage => _model.InformationBlock.BytesOnLastPage;
#else
public uint? BytesOnLastPage => _model.InformationBlock?.BytesOnLastPage;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.FixupSectionSize"/>
#if NET48
public uint FixupSectionSize => _model.InformationBlock.FixupSectionSize;
#else
public uint? FixupSectionSize => _model.InformationBlock?.FixupSectionSize;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.FixupSectionChecksum"/>
#if NET48
public uint FixupSectionChecksum => _model.InformationBlock.FixupSectionChecksum;
#else
public uint? FixupSectionChecksum => _model.InformationBlock?.FixupSectionChecksum;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.LoaderSectionSize"/>
#if NET48
public uint LoaderSectionSize => _model.InformationBlock.LoaderSectionSize;
#else
public uint? LoaderSectionSize => _model.InformationBlock?.LoaderSectionSize;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.LoaderSectionChecksum"/>
#if NET48
public uint LoaderSectionChecksum => _model.InformationBlock.LoaderSectionChecksum;
#else
public uint? LoaderSectionChecksum => _model.InformationBlock?.LoaderSectionChecksum;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ObjectTableOffset"/>
#if NET48
public uint ObjectTableOffset => _model.InformationBlock.ObjectTableOffset;
#else
public uint? ObjectTableOffset => _model.InformationBlock?.ObjectTableOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ObjectTableCount"/>
#if NET48
public uint ObjectTableCount => _model.InformationBlock.ObjectTableCount;
#else
public uint? ObjectTableCount => _model.InformationBlock?.ObjectTableCount;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ObjectPageMapOffset"/>
#if NET48
public uint ObjectPageMapOffset => _model.InformationBlock.ObjectPageMapOffset;
#else
public uint? ObjectPageMapOffset => _model.InformationBlock?.ObjectPageMapOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ObjectIterateDataMapOffset"/>
#if NET48
public uint ObjectIterateDataMapOffset => _model.InformationBlock.ObjectIterateDataMapOffset;
#else
public uint? ObjectIterateDataMapOffset => _model.InformationBlock?.ObjectIterateDataMapOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ResourceTableOffset"/>
#if NET48
public uint ResourceTableOffset => _model.InformationBlock.ResourceTableOffset;
#else
public uint? ResourceTableOffset => _model.InformationBlock?.ResourceTableOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ResourceTableCount"/>
#if NET48
public uint ResourceTableCount => _model.InformationBlock.ResourceTableCount;
#else
public uint? ResourceTableCount => _model.InformationBlock?.ResourceTableCount;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ResidentNamesTableOffset"/>
#if NET48
public uint ResidentNamesTableOffset => _model.InformationBlock.ResidentNamesTableOffset;
#else
public uint? ResidentNamesTableOffset => _model.InformationBlock?.ResidentNamesTableOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.EntryTableOffset"/>
#if NET48
public uint EntryTableOffset => _model.InformationBlock.EntryTableOffset;
#else
public uint? EntryTableOffset => _model.InformationBlock?.EntryTableOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ModuleDirectivesTableOffset"/>
#if NET48
public uint ModuleDirectivesTableOffset => _model.InformationBlock.ModuleDirectivesTableOffset;
#else
public uint? ModuleDirectivesTableOffset => _model.InformationBlock?.ModuleDirectivesTableOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ModuleDirectivesCount"/>
#if NET48
public uint ModuleDirectivesCount => _model.InformationBlock.ModuleDirectivesCount;
#else
public uint? ModuleDirectivesCount => _model.InformationBlock?.ModuleDirectivesCount;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.FixupPageTableOffset"/>
#if NET48
public uint FixupPageTableOffset => _model.InformationBlock.FixupPageTableOffset;
#else
public uint? FixupPageTableOffset => _model.InformationBlock?.FixupPageTableOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.FixupRecordTableOffset"/>
#if NET48
public uint FixupRecordTableOffset => _model.InformationBlock.FixupRecordTableOffset;
#else
public uint? FixupRecordTableOffset => _model.InformationBlock?.FixupRecordTableOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ImportedModulesNameTableOffset"/>
#if NET48
public uint ImportedModulesNameTableOffset => _model.InformationBlock.ImportedModulesNameTableOffset;
#else
public uint? ImportedModulesNameTableOffset => _model.InformationBlock?.ImportedModulesNameTableOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ImportedModulesCount"/>
#if NET48
public uint ImportedModulesCount => _model.InformationBlock.ImportedModulesCount;
#else
public uint? ImportedModulesCount => _model.InformationBlock?.ImportedModulesCount;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ImportProcedureNameTableOffset"/>
#if NET48
public uint ImportProcedureNameTableOffset => _model.InformationBlock.ImportProcedureNameTableOffset;
#else
public uint? ImportProcedureNameTableOffset => _model.InformationBlock?.ImportProcedureNameTableOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.PerPageChecksumTableOffset"/>
#if NET48
public uint PerPageChecksumTableOffset => _model.InformationBlock.PerPageChecksumTableOffset;
#else
public uint? PerPageChecksumTableOffset => _model.InformationBlock?.PerPageChecksumTableOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.DataPagesOffset"/>
#if NET48
public uint DataPagesOffset => _model.InformationBlock.DataPagesOffset;
#else
public uint? DataPagesOffset => _model.InformationBlock?.DataPagesOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.PreloadPageCount"/>
#if NET48
public uint PreloadPageCount => _model.InformationBlock.PreloadPageCount;
#else
public uint? PreloadPageCount => _model.InformationBlock?.PreloadPageCount;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.NonResidentNamesTableOffset"/>
#if NET48
public uint NonResidentNamesTableOffset => _model.InformationBlock.NonResidentNamesTableOffset;
#else
public uint? NonResidentNamesTableOffset => _model.InformationBlock?.NonResidentNamesTableOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.NonResidentNamesTableLength"/>
#if NET48
public uint NonResidentNamesTableLength => _model.InformationBlock.NonResidentNamesTableLength;
#else
public uint? NonResidentNamesTableLength => _model.InformationBlock?.NonResidentNamesTableLength;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.NonResidentNamesTableChecksum"/>
#if NET48
public uint NonResidentNamesTableChecksum => _model.InformationBlock.NonResidentNamesTableChecksum;
#else
public uint? NonResidentNamesTableChecksum => _model.InformationBlock?.NonResidentNamesTableChecksum;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.AutomaticDataObject"/>
#if NET48
public uint AutomaticDataObject => _model.InformationBlock.AutomaticDataObject;
#else
public uint? AutomaticDataObject => _model.InformationBlock?.AutomaticDataObject;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.DebugInformationOffset"/>
#if NET48
public uint DebugInformationOffset => _model.InformationBlock.DebugInformationOffset;
#else
public uint? DebugInformationOffset => _model.InformationBlock?.DebugInformationOffset;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.DebugInformationLength"/>
#if NET48
public uint DebugInformationLength => _model.InformationBlock.DebugInformationLength;
#else
public uint? DebugInformationLength => _model.InformationBlock?.DebugInformationLength;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.PreloadInstancePagesNumber"/>
#if NET48
public uint PreloadInstancePagesNumber => _model.InformationBlock.PreloadInstancePagesNumber;
#else
public uint? PreloadInstancePagesNumber => _model.InformationBlock?.PreloadInstancePagesNumber;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.DemandInstancePagesNumber"/>
#if NET48
public uint DemandInstancePagesNumber => _model.InformationBlock.DemandInstancePagesNumber;
#else
public uint? DemandInstancePagesNumber => _model.InformationBlock?.DemandInstancePagesNumber;
#endif
/// <inheritdoc cref="Models.LinearExecutable.InformationBlock.ExtraHeapAllocation"/>
#if NET48
public uint ExtraHeapAllocation => _model.InformationBlock.ExtraHeapAllocation;
#else
public uint? ExtraHeapAllocation => _model.InformationBlock?.ExtraHeapAllocation;
#endif
#endregion
@@ -389,11 +633,11 @@ namespace BinaryObjectScanner.Wrappers
{
// All logic is handled by the base class
}/// <summary>
/// Create an LE/LX executable from a byte array and offset
/// </summary>
/// <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>
/// Create an LE/LX executable from a byte array and offset
/// </summary>
/// <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
@@ -599,6 +843,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = ObjectTable[i];
builder.AppendLine($" Object Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Virtual segment size: {entry.VirtualSegmentSize} (0x{entry.VirtualSegmentSize:X})");
builder.AppendLine($" Relocation base address: {entry.RelocationBaseAddress} (0x{entry.RelocationBaseAddress:X})");
builder.AppendLine($" Object flags: {entry.ObjectFlags} (0x{entry.ObjectFlags:X})");
@@ -628,6 +878,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = ObjectPageMap[i];
builder.AppendLine($" Object Page Map Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Page data offset: {entry.PageDataOffset} (0x{entry.PageDataOffset:X})");
builder.AppendLine($" Data size: {entry.DataSize} (0x{entry.DataSize:X})");
builder.AppendLine($" Flags: {entry.Flags} (0x{entry.Flags:X})");
@@ -654,6 +910,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = ResourceTable[i];
builder.AppendLine($" Resource Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Type ID: {entry.TypeID} (0x{entry.TypeID:X})");
builder.AppendLine($" Name ID: {entry.NameID} (0x{entry.NameID:X})");
builder.AppendLine($" Resource size: {entry.ResourceSize} (0x{entry.ResourceSize:X})");
@@ -682,6 +944,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = ResidentNamesTable[i];
builder.AppendLine($" Resident Names Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Length: {entry.Length} (0x{entry.Length:X})");
builder.AppendLine($" Name: {entry.Name ?? "[NULL]"}");
builder.AppendLine($" Ordinal number: {entry.OrdinalNumber} (0x{entry.OrdinalNumber:X})");
@@ -708,6 +976,12 @@ namespace BinaryObjectScanner.Wrappers
{
var bundle = EntryTable[i];
builder.AppendLine($" Entry Table Bundle {i}");
if (bundle == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Entries: {bundle.Entries} (0x{bundle.Entries:X})");
builder.AppendLine($" Bundle type: {bundle.BundleType} (0x{bundle.BundleType:X})");
if (bundle.TableEntries != null && bundle.TableEntries.Length != 0)
@@ -719,6 +993,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = bundle.TableEntries[j];
builder.AppendLine($" Entry Table Entry {j}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
switch (bundle.BundleType & ~SabreTools.Models.LinearExecutable.BundleType.ParameterTypingInformationPresent)
{
case SabreTools.Models.LinearExecutable.BundleType.UnusedEntry:
@@ -781,6 +1061,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = ModuleFormatDirectivesTable[i];
builder.AppendLine($" Moduile Format Directives Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Directive number: {entry.DirectiveNumber} (0x{entry.DirectiveNumber:X})");
builder.AppendLine($" Directive data length: {entry.DirectiveDataLength} (0x{entry.DirectiveDataLength:X})");
builder.AppendLine($" Directive data offset: {entry.DirectiveDataOffset} (0x{entry.DirectiveDataOffset:X})");
@@ -807,6 +1093,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = VerifyRecordDirectiveTable[i];
builder.AppendLine($" Verify Record Directive Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Entry count: {entry.EntryCount} (0x{entry.EntryCount:X})");
builder.AppendLine($" Ordinal index: {entry.OrdinalIndex} (0x{entry.OrdinalIndex:X})");
builder.AppendLine($" Version: {entry.Version} (0x{entry.Version:X})");
@@ -837,6 +1129,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = FixupPageTable[i];
builder.AppendLine($" Fix-up Page Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Offset: {entry.Offset} (0x{entry.Offset:X})");
}
}
@@ -862,6 +1160,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = FixupRecordTable[i];
builder.AppendLine($" Fix-up Record Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Source type: {entry.SourceType} (0x{entry.SourceType:X})");
builder.AppendLine($" Target flags: {entry.TargetFlags} (0x{entry.TargetFlags:X})");
@@ -896,26 +1200,26 @@ namespace BinaryObjectScanner.Wrappers
{
// 16-bit Object Number/Module Ordinal Flag
if (entry.TargetFlags.HasFlag(SabreTools.Models.LinearExecutable.FixupRecordTargetFlags.SixteenBitObjectNumberModuleOrdinalFlag))
builder.AppendLine(value: $" Ordinal index import module name table: {entry.OrdinalIndexImportModuleNameTableWORD} (0x{entry.OrdinalIndexImportModuleNameTableWORD:X})");
builder.AppendLine($" Ordinal index import module name table: {entry.OrdinalIndexImportModuleNameTableWORD} (0x{entry.OrdinalIndexImportModuleNameTableWORD:X})");
else
builder.AppendLine(value: $" Ordinal index import module name table: {entry.OrdinalIndexImportModuleNameTableByte} (0x{entry.OrdinalIndexImportModuleNameTableByte:X})");
builder.AppendLine($" Ordinal index import module name table: {entry.OrdinalIndexImportModuleNameTableByte} (0x{entry.OrdinalIndexImportModuleNameTableByte:X})");
// 8-bit Ordinal Flag & 32-bit Target Offset Flag
if (entry.TargetFlags.HasFlag(SabreTools.Models.LinearExecutable.FixupRecordTargetFlags.EightBitOrdinalFlag))
builder.AppendLine(value: $" Imported ordinal number: {entry.ImportedOrdinalNumberByte} (0x{entry.ImportedOrdinalNumberByte:X})");
builder.AppendLine($" Imported ordinal number: {entry.ImportedOrdinalNumberByte} (0x{entry.ImportedOrdinalNumberByte:X})");
else if (entry.TargetFlags.HasFlag(SabreTools.Models.LinearExecutable.FixupRecordTargetFlags.ThirtyTwoBitTargetOffsetFlag))
builder.AppendLine(value: $" Imported ordinal number: {entry.ImportedOrdinalNumberDWORD} (0x{entry.ImportedOrdinalNumberDWORD:X})");
builder.AppendLine($" Imported ordinal number: {entry.ImportedOrdinalNumberDWORD} (0x{entry.ImportedOrdinalNumberDWORD:X})");
else
builder.AppendLine(value: $" Imported ordinal number: {entry.ImportedOrdinalNumberWORD} (0x{entry.ImportedOrdinalNumberWORD:X})");
builder.AppendLine($" Imported ordinal number: {entry.ImportedOrdinalNumberWORD} (0x{entry.ImportedOrdinalNumberWORD:X})");
// Additive Fixup Flag
if (entry.TargetFlags.HasFlag(SabreTools.Models.LinearExecutable.FixupRecordTargetFlags.AdditiveFixupFlag))
{
// 32-bit Additive Flag
if (entry.TargetFlags.HasFlag(SabreTools.Models.LinearExecutable.FixupRecordTargetFlags.ThirtyTwoBitAdditiveFixupFlag))
builder.AppendLine(value: $" Additive fixup value: {entry.AdditiveFixupValueDWORD} (0x{entry.AdditiveFixupValueDWORD:X})");
builder.AppendLine($" Additive fixup value: {entry.AdditiveFixupValueDWORD} (0x{entry.AdditiveFixupValueDWORD:X})");
else
builder.AppendLine(value: $" Additive fixup value: {entry.AdditiveFixupValueWORD} (0x{entry.AdditiveFixupValueWORD:X})");
builder.AppendLine($" Additive fixup value: {entry.AdditiveFixupValueWORD} (0x{entry.AdditiveFixupValueWORD:X})");
}
}
@@ -924,24 +1228,24 @@ namespace BinaryObjectScanner.Wrappers
{
// 16-bit Object Number/Module Ordinal Flag
if (entry.TargetFlags.HasFlag(SabreTools.Models.LinearExecutable.FixupRecordTargetFlags.SixteenBitObjectNumberModuleOrdinalFlag))
builder.AppendLine(value: $" Ordinal index import module name table: {entry.OrdinalIndexImportModuleNameTableWORD} (0x{entry.OrdinalIndexImportModuleNameTableWORD:X})");
builder.AppendLine($" Ordinal index import module name table: {entry.OrdinalIndexImportModuleNameTableWORD} (0x{entry.OrdinalIndexImportModuleNameTableWORD:X})");
else
builder.AppendLine(value: $" Ordinal index import module name table: {entry.OrdinalIndexImportModuleNameTableByte} (0x{entry.OrdinalIndexImportModuleNameTableByte:X})");
builder.AppendLine($" Ordinal index import module name table: {entry.OrdinalIndexImportModuleNameTableByte} (0x{entry.OrdinalIndexImportModuleNameTableByte:X})");
// 32-bit Target Offset Flag
if (entry.TargetFlags.HasFlag(SabreTools.Models.LinearExecutable.FixupRecordTargetFlags.ThirtyTwoBitTargetOffsetFlag))
builder.AppendLine(value: $" Offset import procedure name table: {entry.OffsetImportProcedureNameTableDWORD} (0x{entry.OffsetImportProcedureNameTableDWORD:X})");
builder.AppendLine($" Offset import procedure name table: {entry.OffsetImportProcedureNameTableDWORD} (0x{entry.OffsetImportProcedureNameTableDWORD:X})");
else
builder.AppendLine(value: $" Offset import procedure name table: {entry.OffsetImportProcedureNameTableWORD} (0x{entry.OffsetImportProcedureNameTableWORD:X})");
builder.AppendLine($" Offset import procedure name table: {entry.OffsetImportProcedureNameTableWORD} (0x{entry.OffsetImportProcedureNameTableWORD:X})");
// Additive Fixup Flag
if (entry.TargetFlags.HasFlag(SabreTools.Models.LinearExecutable.FixupRecordTargetFlags.AdditiveFixupFlag))
{
// 32-bit Additive Flag
if (entry.TargetFlags.HasFlag(SabreTools.Models.LinearExecutable.FixupRecordTargetFlags.ThirtyTwoBitAdditiveFixupFlag))
builder.AppendLine(value: $" Additive fixup value: {entry.AdditiveFixupValueDWORD} (0x{entry.AdditiveFixupValueDWORD:X})");
builder.AppendLine($" Additive fixup value: {entry.AdditiveFixupValueDWORD} (0x{entry.AdditiveFixupValueDWORD:X})");
else
builder.AppendLine(value: $" Additive fixup value: {entry.AdditiveFixupValueWORD} (0x{entry.AdditiveFixupValueWORD:X})");
builder.AppendLine($" Additive fixup value: {entry.AdditiveFixupValueWORD} (0x{entry.AdditiveFixupValueWORD:X})");
}
}
@@ -959,9 +1263,9 @@ namespace BinaryObjectScanner.Wrappers
{
// 32-bit Additive Flag
if (entry.TargetFlags.HasFlag(SabreTools.Models.LinearExecutable.FixupRecordTargetFlags.ThirtyTwoBitAdditiveFixupFlag))
builder.AppendLine(value: $" Additive fixup value: {entry.AdditiveFixupValueDWORD} (0x{entry.AdditiveFixupValueDWORD:X})");
builder.AppendLine($" Additive fixup value: {entry.AdditiveFixupValueDWORD} (0x{entry.AdditiveFixupValueDWORD:X})");
else
builder.AppendLine(value: $" Additive fixup value: {entry.AdditiveFixupValueWORD} (0x{entry.AdditiveFixupValueWORD:X})");
builder.AppendLine($" Additive fixup value: {entry.AdditiveFixupValueWORD} (0x{entry.AdditiveFixupValueWORD:X})");
}
}
@@ -1008,6 +1312,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = ImportModuleNameTable[i];
builder.AppendLine($" Import Module Name Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Length: {entry.Length} (0x{entry.Length:X})");
builder.AppendLine($" Name: {entry.Name ?? "[NULL]"}");
}
@@ -1033,6 +1343,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = ImportModuleProcedureNameTable[i];
builder.AppendLine($" Import Module Procedure Name Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Length: {entry.Length} (0x{entry.Length:X})");
builder.AppendLine($" Name: {entry.Name ?? "[NULL]"}");
}
@@ -1058,6 +1374,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = PerPageChecksumTable[i];
builder.AppendLine($" Per-Page Checksum Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Checksum: {entry.Checksum} (0x{entry.Checksum:X})");
}
}
@@ -1082,6 +1404,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = NonResidentNamesTable[i];
builder.AppendLine($" Non-Resident Names Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Length: {entry.Length} (0x{entry.Length:X})");
builder.AppendLine($" Name: {entry.Name ?? "[NULL]"}");
builder.AppendLine($" Ordinal number: {entry.OrdinalNumber} (0x{entry.OrdinalNumber:X})");
@@ -1145,11 +1473,19 @@ namespace BinaryObjectScanner.Wrappers
switch (_dataSource)
{
case DataSource.ByteArray:
#if NET48
length = _byteArrayData.Length - _byteArrayOffset;
#else
length = _byteArrayData!.Length - _byteArrayOffset;
#endif
break;
case DataSource.Stream:
#if NET48
length = (int)_streamData.Length;
#else
length = (int)_streamData!.Length;
#endif
break;
}
}

View File

@@ -20,47 +20,99 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string Magic => _model.Header.Magic;
#else
public string? Magic => _model.Header.Magic;
public string? Magic => _model.Header?.Magic;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.LastPageBytes"/>
#if NET48
public ushort LastPageBytes => _model.Header.LastPageBytes;
#else
public ushort? LastPageBytes => _model.Header?.LastPageBytes;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Pages"/>
#if NET48
public ushort Pages => _model.Header.Pages;
#else
public ushort? Pages => _model.Header?.Pages;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.RelocationItems"/>
#if NET48
public ushort RelocationItems => _model.Header.RelocationItems;
#else
public ushort? RelocationItems => _model.Header?.RelocationItems;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.HeaderParagraphSize"/>
#if NET48
public ushort HeaderParagraphSize => _model.Header.HeaderParagraphSize;
#else
public ushort? HeaderParagraphSize => _model.Header?.HeaderParagraphSize;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.MinimumExtraParagraphs"/>
#if NET48
public ushort MinimumExtraParagraphs => _model.Header.MinimumExtraParagraphs;
#else
public ushort? MinimumExtraParagraphs => _model.Header?.MinimumExtraParagraphs;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.MaximumExtraParagraphs"/>
#if NET48
public ushort MaximumExtraParagraphs => _model.Header.MaximumExtraParagraphs;
#else
public ushort? MaximumExtraParagraphs => _model.Header?.MaximumExtraParagraphs;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.InitialSSValue"/>
#if NET48
public ushort InitialSSValue => _model.Header.InitialSSValue;
#else
public ushort? InitialSSValue => _model.Header?.InitialSSValue;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.InitialSPValue"/>
#if NET48
public ushort InitialSPValue => _model.Header.InitialSPValue;
#else
public ushort? InitialSPValue => _model.Header?.InitialSPValue;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Checksum"/>
#if NET48
public ushort Checksum => _model.Header.Checksum;
#else
public ushort? Checksum => _model.Header?.Checksum;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.InitialIPValue"/>
#if NET48
public ushort InitialIPValue => _model.Header.InitialIPValue;
#else
public ushort? InitialIPValue => _model.Header?.InitialIPValue;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.InitialCSValue"/>
#if NET48
public ushort InitialCSValue => _model.Header.InitialCSValue;
#else
public ushort? InitialCSValue => _model.Header?.InitialCSValue;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.RelocationTableAddr"/>
#if NET48
public ushort RelocationTableAddr => _model.Header.RelocationTableAddr;
#else
public ushort? RelocationTableAddr => _model.Header?.RelocationTableAddr;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.OverlayNumber"/>
#if NET48
public ushort OverlayNumber => _model.Header.OverlayNumber;
#else
public ushort? OverlayNumber => _model.Header?.OverlayNumber;
#endif
#endregion
@@ -70,24 +122,36 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public ushort[] Reserved1 => _model.Header.Reserved1;
#else
public ushort[]? Reserved1 => _model.Header.Reserved1;
public ushort[]? Reserved1 => _model.Header?.Reserved1;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.OEMIdentifier"/>
#if NET48
public ushort OEMIdentifier => _model.Header.OEMIdentifier;
#else
public ushort? OEMIdentifier => _model.Header?.OEMIdentifier;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.OEMInformation"/>
#if NET48
public ushort OEMInformation => _model.Header.OEMInformation;
#else
public ushort? OEMInformation => _model.Header?.OEMInformation;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Reserved2"/>
#if NET48
public ushort[] Reserved2 => _model.Header.Reserved2;
#else
public ushort[]? Reserved2 => _model.Header.Reserved2;
public ushort[]? Reserved2 => _model.Header?.Reserved2;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.NewExeHeaderAddr"/>
#if NET48
public uint NewExeHeaderAddr => _model.Header.NewExeHeaderAddr;
#else
public uint? NewExeHeaderAddr => _model.Header?.NewExeHeaderAddr;
#endif
#endregion
@@ -231,7 +295,7 @@ namespace BinaryObjectScanner.Wrappers
{
builder.AppendLine(" Relocation Table Information:");
builder.AppendLine(" -------------------------");
if (RelocationItems == 0 || RelocationTable.Length == 0)
if (RelocationItems == 0 || RelocationTable == null || RelocationTable.Length == 0)
{
builder.AppendLine(" No relocation table items");
}
@@ -241,6 +305,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = RelocationTable[i];
builder.AppendLine($" Relocation Table Entry {i}");
if (entry == null)
{
builder.AppendLine($" [NULL]");
continue;
}
builder.AppendLine($" Offset: {entry.Offset} (0x{entry.Offset:X})");
builder.AppendLine($" Segment: {entry.Segment} (0x{entry.Segment:X})");
}

View File

@@ -22,87 +22,147 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
public string? Signature => _model.Header?.Signature;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.Reserved1"/>
#if NET48
public uint Reserved1 => _model.Header.Reserved1;
#else
public uint? Reserved1 => _model.Header?.Reserved1;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.CabinetSize"/>
#if NET48
public uint CabinetSize => _model.Header.CabinetSize;
#else
public uint? CabinetSize => _model.Header?.CabinetSize;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.Reserved2"/>
#if NET48
public uint Reserved2 => _model.Header.Reserved2;
#else
public uint? Reserved2 => _model.Header?.Reserved2;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.FilesOffset"/>
#if NET48
public uint FilesOffset => _model.Header.FilesOffset;
#else
public uint? FilesOffset => _model.Header?.FilesOffset;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.Reserved3"/>
#if NET48
public uint Reserved3 => _model.Header.Reserved3;
#else
public uint? Reserved3 => _model.Header?.Reserved3;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.VersionMinor"/>
#if NET48
public byte VersionMinor => _model.Header.VersionMinor;
#else
public byte? VersionMinor => _model.Header?.VersionMinor;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.VersionMajor"/>
#if NET48
public byte VersionMajor => _model.Header.VersionMajor;
#else
public byte? VersionMajor => _model.Header?.VersionMajor;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.FolderCount"/>
#if NET48
public ushort FolderCount => _model.Header.FolderCount;
#else
public ushort? FolderCount => _model.Header?.FolderCount;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.FileCount"/>
#if NET48
public ushort FileCount => _model.Header.FileCount;
#else
public ushort? FileCount => _model.Header?.FileCount;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.FileCount"/>
#if NET48
public SabreTools.Models.MicrosoftCabinet.HeaderFlags Flags => _model.Header.Flags;
#else
public SabreTools.Models.MicrosoftCabinet.HeaderFlags? Flags => _model.Header?.Flags;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.SetID"/>
#if NET48
public ushort SetID => _model.Header.SetID;
#else
public ushort? SetID => _model.Header?.SetID;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.CabinetIndex"/>
#if NET48
public ushort CabinetIndex => _model.Header.CabinetIndex;
#else
public ushort? CabinetIndex => _model.Header?.CabinetIndex;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.HeaderReservedSize"/>
#if NET48
public ushort HeaderReservedSize => _model.Header.HeaderReservedSize;
#else
public ushort? HeaderReservedSize => _model.Header?.HeaderReservedSize;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.FolderReservedSize"/>
#if NET48
public byte FolderReservedSize => _model.Header.FolderReservedSize;
#else
public byte? FolderReservedSize => _model.Header?.FolderReservedSize;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.DataReservedSize"/>
#if NET48
public byte DataReservedSize => _model.Header.DataReservedSize;
#else
public byte? DataReservedSize => _model.Header?.DataReservedSize;
#endif
/// <inheritdoc cref="Models.MicrosoftCabinet.CFHEADER.ReservedData"/>
#if NET48
public byte[] ReservedData => _model.Header.ReservedData;
#else
public byte[]? ReservedData => _model.Header.ReservedData;
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;
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;
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;
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;
public string? DiskNext => _model.Header?.DiskNext;
#endif
#endregion
@@ -262,7 +322,7 @@ namespace BinaryObjectScanner.Wrappers
#endif
{
// If we have an invalid folder index
if (folderIndex < 0 || folderIndex >= Folders.Length)
if (folderIndex < 0 || Folders == null || folderIndex >= Folders.Length)
return null;
// Get the folder header
@@ -288,6 +348,9 @@ namespace BinaryObjectScanner.Wrappers
List<byte> data = new List<byte>();
foreach (var dataBlock in folder.DataBlocks)
{
if (dataBlock == null)
continue;
byte[] decompressed = new byte[dataBlock.UncompressedSize];
switch (folder.CompressionType & SabreTools.Models.MicrosoftCabinet.CompressionType.MASK_TYPE)
{
@@ -350,7 +413,7 @@ namespace BinaryObjectScanner.Wrappers
public bool ExtractFile(int index, string outputDirectory)
{
// If we have an invalid file index
if (index < 0 || index >= Files.Length)
if (index < 0 || Files == null || index >= Files.Length)
return false;
// If we have an invalid output directory
@@ -369,7 +432,11 @@ namespace BinaryObjectScanner.Wrappers
string fileName = Path.Combine(outputDirectory, file.Name ?? $"file{index}");
// Get the file data, if possible
#if NET48
byte[] fileData = GetFileData(index);
#else
byte[]? fileData = GetFileData(index);
#endif
if (fileData == null)
return false;
@@ -390,7 +457,7 @@ namespace BinaryObjectScanner.Wrappers
public DateTime? GetDateTime(int fileIndex)
{
// If we have an invalid file index
if (fileIndex < 0 || fileIndex >= Files.Length)
if (fileIndex < 0 || Files == null || fileIndex >= Files.Length)
return null;
// Get the file header
@@ -434,7 +501,7 @@ namespace BinaryObjectScanner.Wrappers
#endif
{
// If we have an invalid file index
if (fileIndex < 0 || fileIndex >= Files.Length)
if (fileIndex < 0 || Files == null || fileIndex >= Files.Length)
return null;
// Get the file header
@@ -443,7 +510,11 @@ namespace BinaryObjectScanner.Wrappers
return null;
// Get the parent folder data
#if NET48
byte[] folderData = GetUncompressedData((int)file.FolderIndex);
#else
byte[]? folderData = GetUncompressedData((int)file.FolderIndex);
#endif
if (folderData == null || folderData.Length == 0)
return null;
@@ -499,7 +570,11 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Set ID: {SetID} (0x{SetID:X})");
builder.AppendLine($" Cabinet index: {CabinetIndex} (0x{CabinetIndex:X})");
#if NET48
if (Flags.HasFlag(SabreTools.Models.MicrosoftCabinet.HeaderFlags.RESERVE_PRESENT))
#else
if (Flags != null && Flags.Value.HasFlag(SabreTools.Models.MicrosoftCabinet.HeaderFlags.RESERVE_PRESENT))
#endif
{
builder.AppendLine($" Header reserved size: {HeaderReservedSize} (0x{HeaderReservedSize:X})");
builder.AppendLine($" Folder reserved size: {FolderReservedSize} (0x{FolderReservedSize:X})");
@@ -510,13 +585,21 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Reserved data = {BitConverter.ToString(ReservedData).Replace("-", " ")}");
}
#if NET48
if (Flags.HasFlag(SabreTools.Models.MicrosoftCabinet.HeaderFlags.PREV_CABINET))
#else
if (Flags != null && Flags.Value.HasFlag(SabreTools.Models.MicrosoftCabinet.HeaderFlags.PREV_CABINET))
#endif
{
builder.AppendLine($" Previous cabinet: {CabinetPrev}");
builder.AppendLine($" Previous disk: {DiskPrev}");
}
#if NET48
if (Flags.HasFlag(SabreTools.Models.MicrosoftCabinet.HeaderFlags.NEXT_CABINET))
#else
if (Flags != null && Flags.Value.HasFlag(SabreTools.Models.MicrosoftCabinet.HeaderFlags.NEXT_CABINET))
#endif
{
builder.AppendLine($" Next cabinet: {CabinetNext}");
builder.AppendLine($" Next disk: {DiskNext}");
@@ -543,14 +626,17 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = Folders[i];
builder.AppendLine($" Folder {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Cab start offset = {entry.CabStartOffset} (0x{entry.CabStartOffset:X})");
builder.AppendLine($" Data count = {entry.DataCount} (0x{entry.DataCount:X})");
builder.AppendLine($" Compression type = {entry.CompressionType} (0x{entry.CompressionType:X})");
builder.AppendLine($" Masked compression type = {entry.CompressionType & SabreTools.Models.MicrosoftCabinet.CompressionType.MASK_TYPE}");
if (entry.ReservedData == null)
builder.AppendLine($" Reserved data = [NULL]");
else
builder.AppendLine($" Reserved data = {BitConverter.ToString(entry.ReservedData).Replace("-", " ")}");
builder.AppendLine($" Reserved data = {(entry.ReservedData == null ? "[NULL]" : BitConverter.ToString(entry.ReservedData).Replace("-", " "))}");
builder.AppendLine();
builder.AppendLine(" Data Blocks");
@@ -565,13 +651,16 @@ namespace BinaryObjectScanner.Wrappers
{
SabreTools.Models.MicrosoftCabinet.CFDATA dataBlock = entry.DataBlocks[j];
builder.AppendLine($" Data Block {j}");
if (dataBlock == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Checksum = {dataBlock.Checksum} (0x{dataBlock.Checksum:X})");
builder.AppendLine($" Compressed size = {dataBlock.CompressedSize} (0x{dataBlock.CompressedSize:X})");
builder.AppendLine($" Uncompressed size = {dataBlock.UncompressedSize} (0x{dataBlock.UncompressedSize:X})");
if (dataBlock.ReservedData == null)
builder.AppendLine($" Reserved data = [NULL]");
else
builder.AppendLine($" Reserved data = {BitConverter.ToString(dataBlock.ReservedData).Replace("-", " ")}");
builder.AppendLine($" Reserved data = {(dataBlock.ReservedData == null ? "[NULL]" : BitConverter.ToString(dataBlock.ReservedData).Replace("-", " "))}");
//builder.AppendLine($" Compressed data = {BitConverter.ToString(dataBlock.CompressedData).Replace("-", " ")}");
}
}
@@ -598,6 +687,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = Files[i];
builder.AppendLine($" File {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" File size = {entry.FileSize} (0x{entry.FileSize:X})");
builder.AppendLine($" Folder start offset = {entry.FolderStartOffset} (0x{entry.FolderStartOffset:X})");
builder.AppendLine($" Folder index = {entry.FolderIndex} (0x{entry.FolderIndex:X})");

View File

@@ -23,41 +23,49 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public byte[] RSA2048Signature => _model.Header.RSA2048Signature;
#else
public byte[]? RSA2048Signature => _model.Header.RSA2048Signature;
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;
public string? MagicNumber => _model.Header?.MagicNumber;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.ImageSizeInMediaUnits"/>
#if NET48
public uint ImageSizeInMediaUnits => _model.Header.ImageSizeInMediaUnits;
#else
public uint? ImageSizeInMediaUnits => _model.Header?.ImageSizeInMediaUnits;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.MediaId"/>
#if NET48
public byte[] MediaId => _model.Header.MediaId;
#else
public byte[]? MediaId => _model.Header.MediaId;
public byte[]? MediaId => _model.Header?.MediaId;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.PartitionsFSType"/>
#if NET48
public SabreTools.Models.N3DS.FilesystemType PartitionsFSType => _model.Header.PartitionsFSType;
#else
public SabreTools.Models.N3DS.FilesystemType? PartitionsFSType => _model.Header?.PartitionsFSType;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.PartitionsCryptType"/>
#if NET48
public byte[] PartitionsCryptType => _model.Header.PartitionsCryptType;
#else
public byte[]? PartitionsCryptType => _model.Header.PartitionsCryptType;
public byte[]? PartitionsCryptType => _model.Header?.PartitionsCryptType;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.PartitionsTable"/>
#if NET48
public SabreTools.Models.N3DS.PartitionTableEntry[] PartitionsTable => _model.Header.PartitionsTable;
#else
public SabreTools.Models.N3DS.PartitionTableEntry?[]? PartitionsTable => _model.Header.PartitionsTable;
public SabreTools.Models.N3DS.PartitionTableEntry?[]? PartitionsTable => _model.Header?.PartitionsTable;
#endif
#endregion
@@ -68,48 +76,64 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public byte[] ExheaderHash => _model.Header.ExheaderHash;
#else
public byte[]? ExheaderHash => _model.Header.ExheaderHash;
public byte[]? ExheaderHash => _model.Header?.ExheaderHash;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.AdditionalHeaderSize"/>
#if NET48
public uint AdditionalHeaderSize => _model.Header.AdditionalHeaderSize;
#else
public uint? AdditionalHeaderSize => _model.Header?.AdditionalHeaderSize;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.SectorZeroOffset"/>
#if NET48
public uint SectorZeroOffset => _model.Header.SectorZeroOffset;
#else
public uint? SectorZeroOffset => _model.Header?.SectorZeroOffset;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.PartitionFlags"/>
#if NET48
public byte[] PartitionFlags => _model.Header.PartitionFlags;
#else
public byte[]? PartitionFlags => _model.Header.PartitionFlags;
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;
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;
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;
public byte[]? Reserved2 => _model.Header?.Reserved2;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.FirmUpdateByte1"/>
#if NET48
public byte FirmUpdateByte1 => _model.Header.FirmUpdateByte1;
#else
public byte? FirmUpdateByte1 => _model.Header?.FirmUpdateByte1;
#endif
/// <inheritdoc cref="Models.N3DS.NCSDHeader.FirmUpdateByte2"/>
#if NET48
public byte FirmUpdateByte2 => _model.Header.FirmUpdateByte2;
#else
public byte? FirmUpdateByte2 => _model.Header?.FirmUpdateByte2;
#endif
#endregion
@@ -119,14 +143,14 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public byte[] Unknown => _model.Header.Unknown;
#else
public byte[]? Unknown => _model.Header.Unknown;
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;
public byte[]? EncryptedMBR => _model.Header?.EncryptedMBR;
#endif
#endregion
@@ -136,56 +160,80 @@ namespace BinaryObjectScanner.Wrappers
#region Card Info Header
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.WritableAddressMediaUnits"/>
#if NET48
public uint CIH_WritableAddressMediaUnits => _model.CardInfoHeader.WritableAddressMediaUnits;
#else
public uint? CIH_WritableAddressMediaUnits => _model.CardInfoHeader?.WritableAddressMediaUnits;
#endif
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.CardInfoBitmask"/>
#if NET48
public uint CIH_CardInfoBitmask => _model.CardInfoHeader.CardInfoBitmask;
#else
public uint? CIH_CardInfoBitmask => _model.CardInfoHeader?.CardInfoBitmask;
#endif
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.Reserved1"/>
#if NET48
public byte[] CIH_Reserved1 => _model.CardInfoHeader.Reserved1;
#else
public byte[]? CIH_Reserved1 => _model.CardInfoHeader.Reserved1;
public byte[]? CIH_Reserved1 => _model.CardInfoHeader?.Reserved1;
#endif
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.FilledSize"/>
#if NET48
public uint CIH_FilledSize => _model.CardInfoHeader.FilledSize;
#else
public uint? CIH_FilledSize => _model.CardInfoHeader?.FilledSize;
#endif
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.Reserved2"/>
#if NET48
public byte[] CIH_Reserved2 => _model.CardInfoHeader.Reserved2;
#else
public byte[]? CIH_Reserved2 => _model.CardInfoHeader.Reserved2;
public byte[]? CIH_Reserved2 => _model.CardInfoHeader?.Reserved2;
#endif
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.TitleVersion"/>
#if NET48
public ushort CIH_TitleVersion => _model.CardInfoHeader.TitleVersion;
#else
public ushort? CIH_TitleVersion => _model.CardInfoHeader?.TitleVersion;
#endif
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.CardRevision"/>
#if NET48
public ushort CIH_CardRevision => _model.CardInfoHeader.CardRevision;
#else
public ushort? CIH_CardRevision => _model.CardInfoHeader?.CardRevision;
#endif
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.Reserved3"/>
#if NET48
public byte[] CIH_Reserved3 => _model.CardInfoHeader.Reserved3;
#else
public byte[]? CIH_Reserved3 => _model.CardInfoHeader.Reserved3;
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;
public byte[]? CIH_CVerTitleID => _model.CardInfoHeader?.CVerTitleID;
#endif
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.CVerVersionNumber"/>
#if NET48
public ushort CIH_CVerVersionNumber => _model.CardInfoHeader.CVerVersionNumber;
#else
public ushort? CIH_CVerVersionNumber => _model.CardInfoHeader?.CVerVersionNumber;
#endif
/// <inheritdoc cref="Models.N3DS.CardInfoHeader.Reserved4"/>
#if NET48
public byte[] CIH_Reserved4 => _model.CardInfoHeader.Reserved4;
#else
public byte[]? CIH_Reserved4 => _model.CardInfoHeader.Reserved4;
public byte[]? CIH_Reserved4 => _model.CardInfoHeader?.Reserved4;
#endif
#endregion
@@ -497,12 +545,25 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Partition table:");
builder.AppendLine(" -------------------------");
for (int i = 0; i < PartitionsTable.Length; i++)
if (PartitionsTable == null || PartitionsTable.Length == 0)
{
var partitionTableEntry = PartitionsTable[i];
builder.AppendLine($" Partition table entry {i}");
builder.AppendLine($" Offset: {partitionTableEntry.Offset} (0x{partitionTableEntry.Offset:X})");
builder.AppendLine($" Length: {partitionTableEntry.Length} (0x{partitionTableEntry.Length:X})");
builder.AppendLine(" No partition table entries");
}
else
{
for (int i = 0; i < PartitionsTable.Length; i++)
{
var partitionTableEntry = PartitionsTable[i];
builder.AppendLine($" Partition table entry {i}");
if (partitionTableEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Offset: {partitionTableEntry.Offset} (0x{partitionTableEntry.Offset:X})");
builder.AppendLine($" Length: {partitionTableEntry.Length} (0x{partitionTableEntry.Length:X})");
}
}
builder.AppendLine();
@@ -517,9 +578,16 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Partition ID table:");
builder.AppendLine(" -------------------------");
for (int i = 0; i < PartitionIdTable.Length; i++)
if (PartitionIdTable == null || PartitionIdTable.Length == 0)
{
builder.AppendLine($" Partition {i} ID: {PartitionIdTable[i]} (0x{PartitionIdTable[i]:X})");
builder.AppendLine(" No partition ID table entries");
}
else
{
for (int i = 0; i < PartitionIdTable.Length; i++)
{
builder.AppendLine($" Partition {i} ID: {PartitionIdTable[i]} (0x{PartitionIdTable[i]:X})");
}
}
builder.AppendLine();
@@ -587,34 +655,41 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine(" Backup Header:");
builder.AppendLine(" -------------------------");
builder.AppendLine($" Magic ID: {DCIH_ID_BackupHeader.MagicID} (0x{DCIH_ID_BackupHeader.MagicID:X})");
builder.AppendLine($" Content size in media units: {DCIH_ID_BackupHeader.ContentSizeInMediaUnits} (0x{DCIH_ID_BackupHeader.ContentSizeInMediaUnits:X})");
builder.AppendLine($" Partition ID: {DCIH_ID_BackupHeader.PartitionId} (0x{DCIH_ID_BackupHeader.PartitionId:X})");
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: {(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: {(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: {(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})");
builder.AppendLine($" Logo region offset, in media units: {DCIH_ID_BackupHeader.LogoRegionOffsetInMediaUnits} (0x{DCIH_ID_BackupHeader.LogoRegionOffsetInMediaUnits:X})");
builder.AppendLine($" Logo region size, in media units: {DCIH_ID_BackupHeader.LogoRegionSizeInMediaUnits} (0x{DCIH_ID_BackupHeader.LogoRegionSizeInMediaUnits:X})");
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: {(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: {(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('-', ' '))}");
if (DCIH_ID_BackupHeader == null)
{
builder.AppendLine(" No backup header");
}
else
{
builder.AppendLine($" Magic ID: {DCIH_ID_BackupHeader.MagicID} (0x{DCIH_ID_BackupHeader.MagicID:X})");
builder.AppendLine($" Content size in media units: {DCIH_ID_BackupHeader.ContentSizeInMediaUnits} (0x{DCIH_ID_BackupHeader.ContentSizeInMediaUnits:X})");
builder.AppendLine($" Partition ID: {DCIH_ID_BackupHeader.PartitionId} (0x{DCIH_ID_BackupHeader.PartitionId:X})");
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: {(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: {(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: {(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})");
builder.AppendLine($" Logo region offset, in media units: {DCIH_ID_BackupHeader.LogoRegionOffsetInMediaUnits} (0x{DCIH_ID_BackupHeader.LogoRegionOffsetInMediaUnits:X})");
builder.AppendLine($" Logo region size, in media units: {DCIH_ID_BackupHeader.LogoRegionSizeInMediaUnits} (0x{DCIH_ID_BackupHeader.LogoRegionSizeInMediaUnits:X})");
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: {(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: {(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: {(DCIH_CardDeviceReserved1 == null ? "[NULL]" : BitConverter.ToString(DCIH_CardDeviceReserved1).Replace('-', ' '))}");
@@ -657,6 +732,12 @@ namespace BinaryObjectScanner.Wrappers
{
var partitionHeader = Partitions[i];
builder.AppendLine($" NCCH Partition Header {i}");
if (partitionHeader == null)
{
builder.AppendLine($" [NULL]");
continue;
}
if (partitionHeader.MagicID == string.Empty)
{
builder.AppendLine($" Empty partition, no data can be parsed");
@@ -682,14 +763,21 @@ namespace BinaryObjectScanner.Wrappers
builder.AppendLine($" Extended header size in bytes: {partitionHeader.ExtendedHeaderSizeInBytes} (0x{partitionHeader.ExtendedHeaderSizeInBytes:X})");
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})");
builder.AppendLine($" Reserved 2: {partitionHeader.Flags.Reserved2} (0x{partitionHeader.Flags.Reserved2:X})");
builder.AppendLine($" Crypto method: {partitionHeader.Flags.CryptoMethod} (0x{partitionHeader.Flags.CryptoMethod:X})");
builder.AppendLine($" Content platform: {partitionHeader.Flags.ContentPlatform} (0x{partitionHeader.Flags.ContentPlatform:X})");
builder.AppendLine($" Content type: {partitionHeader.Flags.MediaPlatformIndex} (0x{partitionHeader.Flags.MediaPlatformIndex:X})");
builder.AppendLine($" Content unit size: {partitionHeader.Flags.ContentUnitSize} (0x{partitionHeader.Flags.ContentUnitSize:X})");
builder.AppendLine($" Bitmasks: {partitionHeader.Flags.BitMasks} (0x{partitionHeader.Flags.BitMasks:X})");
if (partitionHeader.Flags == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Reserved 0: {partitionHeader.Flags.Reserved0} (0x{partitionHeader.Flags.Reserved0:X})");
builder.AppendLine($" Reserved 1: {partitionHeader.Flags.Reserved1} (0x{partitionHeader.Flags.Reserved1:X})");
builder.AppendLine($" Reserved 2: {partitionHeader.Flags.Reserved2} (0x{partitionHeader.Flags.Reserved2:X})");
builder.AppendLine($" Crypto method: {partitionHeader.Flags.CryptoMethod} (0x{partitionHeader.Flags.CryptoMethod:X})");
builder.AppendLine($" Content platform: {partitionHeader.Flags.ContentPlatform} (0x{partitionHeader.Flags.ContentPlatform:X})");
builder.AppendLine($" Content type: {partitionHeader.Flags.MediaPlatformIndex} (0x{partitionHeader.Flags.MediaPlatformIndex:X})");
builder.AppendLine($" Content unit size: {partitionHeader.Flags.ContentUnitSize} (0x{partitionHeader.Flags.ContentUnitSize:X})");
builder.AppendLine($" Bitmasks: {partitionHeader.Flags.BitMasks} (0x{partitionHeader.Flags.BitMasks:X})");
}
builder.AppendLine($" Plain region offset, in media units: {partitionHeader.PlainRegionOffsetInMediaUnits} (0x{partitionHeader.PlainRegionOffsetInMediaUnits:X})");
builder.AppendLine($" Plain region size, in media units: {partitionHeader.PlainRegionSizeInMediaUnits} (0x{partitionHeader.PlainRegionSizeInMediaUnits:X})");
builder.AppendLine($" Logo region offset, in media units: {partitionHeader.LogoRegionOffsetInMediaUnits} (0x{partitionHeader.LogoRegionOffsetInMediaUnits:X})");
@@ -735,101 +823,204 @@ namespace BinaryObjectScanner.Wrappers
else
{
builder.AppendLine($" System control info:");
builder.AppendLine($" Application title: {extendedHeader.SCI.ApplicationTitle}");
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})");
if (extendedHeader.SCI == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Application title: {extendedHeader.SCI.ApplicationTitle}");
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})");
builder.AppendLine($" Text code set info:");
builder.AppendLine($" Address: {extendedHeader.SCI.TextCodeSetInfo.Address} (0x{extendedHeader.SCI.TextCodeSetInfo.Address:X})");
builder.AppendLine($" Physical region size (in page-multiples): {extendedHeader.SCI.TextCodeSetInfo.PhysicalRegionSizeInPages} (0x{extendedHeader.SCI.TextCodeSetInfo.PhysicalRegionSizeInPages:X})");
builder.AppendLine($" Size (in bytes): {extendedHeader.SCI.TextCodeSetInfo.SizeInBytes} (0x{extendedHeader.SCI.TextCodeSetInfo.SizeInBytes:X})");
builder.AppendLine($" Text code set info:");
if (extendedHeader.SCI.TextCodeSetInfo == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Address: {extendedHeader.SCI.TextCodeSetInfo.Address} (0x{extendedHeader.SCI.TextCodeSetInfo.Address:X})");
builder.AppendLine($" Physical region size (in page-multiples): {extendedHeader.SCI.TextCodeSetInfo.PhysicalRegionSizeInPages} (0x{extendedHeader.SCI.TextCodeSetInfo.PhysicalRegionSizeInPages:X})");
builder.AppendLine($" Size (in bytes): {extendedHeader.SCI.TextCodeSetInfo.SizeInBytes} (0x{extendedHeader.SCI.TextCodeSetInfo.SizeInBytes:X})");
}
builder.AppendLine($" Stack size: {extendedHeader.SCI.StackSize} (0x{extendedHeader.SCI.StackSize:X})");
builder.AppendLine($" Stack size: {extendedHeader.SCI.StackSize} (0x{extendedHeader.SCI.StackSize:X})");
builder.AppendLine($" Read-only code set info:");
builder.AppendLine($" Address: {extendedHeader.SCI.ReadOnlyCodeSetInfo.Address} (0x{extendedHeader.SCI.ReadOnlyCodeSetInfo.Address:X})");
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($" Read-only code set info:");
if (extendedHeader.SCI.ReadOnlyCodeSetInfo == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Address: {extendedHeader.SCI.ReadOnlyCodeSetInfo.Address} (0x{extendedHeader.SCI.ReadOnlyCodeSetInfo.Address:X})");
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: {(extendedHeader.SCI.Reserved2 == null ? "[NULL]" : BitConverter.ToString(extendedHeader.SCI.Reserved2).Replace('-', ' '))}");
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})");
builder.AppendLine($" Physical region size (in page-multiples): {extendedHeader.SCI.DataCodeSetInfo.PhysicalRegionSizeInPages} (0x{extendedHeader.SCI.DataCodeSetInfo.PhysicalRegionSizeInPages:X})");
builder.AppendLine($" Size (in bytes): {extendedHeader.SCI.DataCodeSetInfo.SizeInBytes} (0x{extendedHeader.SCI.DataCodeSetInfo.SizeInBytes:X})");
builder.AppendLine($" Data code set info:");
if (extendedHeader.SCI.DataCodeSetInfo == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Address: {extendedHeader.SCI.DataCodeSetInfo.Address} (0x{extendedHeader.SCI.DataCodeSetInfo.Address:X})");
builder.AppendLine($" Physical region size (in page-multiples): {extendedHeader.SCI.DataCodeSetInfo.PhysicalRegionSizeInPages} (0x{extendedHeader.SCI.DataCodeSetInfo.PhysicalRegionSizeInPages:X})");
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: {(extendedHeader.SCI.DependencyModuleList == null ? "[NULL]" : string.Join(", ", extendedHeader.SCI.DependencyModuleList))}");
builder.AppendLine($" BSS size: {extendedHeader.SCI.BSSSize} (0x{extendedHeader.SCI.BSSSize:X})");
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: {(extendedHeader.SCI.SystemInfo.Reserved == null ? "[NULL]" : BitConverter.ToString(extendedHeader.SCI.SystemInfo.Reserved).Replace('-', ' '))}");
builder.AppendLine($" System info:");
if (extendedHeader.SCI.SystemInfo == null)
{
builder.AppendLine(" [NULL]");
}
else
{
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: {(extendedHeader.SCI.SystemInfo.Reserved == null ? "[NULL]" : BitConverter.ToString(extendedHeader.SCI.SystemInfo.Reserved).Replace('-', ' '))}");
}
}
builder.AppendLine($" Access control info:");
builder.AppendLine($" ARM11 local system capabilities:");
builder.AppendLine($" Program ID: {extendedHeader.ACI.ARM11LocalSystemCapabilities.ProgramID} (0x{extendedHeader.ACI.ARM11LocalSystemCapabilities.ProgramID:X})");
builder.AppendLine($" Core version: {extendedHeader.ACI.ARM11LocalSystemCapabilities.CoreVersion} (0x{extendedHeader.ACI.ARM11LocalSystemCapabilities.CoreVersion:X})");
builder.AppendLine($" Flag 1: {extendedHeader.ACI.ARM11LocalSystemCapabilities.Flag1} (0x{extendedHeader.ACI.ARM11LocalSystemCapabilities.Flag1:X})");
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: {(extendedHeader.ACI.ARM11LocalSystemCapabilities.ResourceLimitDescriptors == null ? "[NULL]" : string.Join(", ", extendedHeader.ACI.ARM11LocalSystemCapabilities.ResourceLimitDescriptors))}");
if (extendedHeader.ACI == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" ARM11 local system capabilities:");
if (extendedHeader.ACI.ARM11LocalSystemCapabilities == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Program ID: {extendedHeader.ACI.ARM11LocalSystemCapabilities.ProgramID} (0x{extendedHeader.ACI.ARM11LocalSystemCapabilities.ProgramID:X})");
builder.AppendLine($" Core version: {extendedHeader.ACI.ARM11LocalSystemCapabilities.CoreVersion} (0x{extendedHeader.ACI.ARM11LocalSystemCapabilities.CoreVersion:X})");
builder.AppendLine($" Flag 1: {extendedHeader.ACI.ARM11LocalSystemCapabilities.Flag1} (0x{extendedHeader.ACI.ARM11LocalSystemCapabilities.Flag1:X})");
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: {(extendedHeader.ACI.ARM11LocalSystemCapabilities.ResourceLimitDescriptors == null ? "[NULL]" : string.Join(", ", extendedHeader.ACI.ARM11LocalSystemCapabilities.ResourceLimitDescriptors))}");
builder.AppendLine($" Storage info:");
if (extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Extdata ID: {extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.ExtdataID} (0x{extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.ExtdataID:X})");
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($" Storage info:");
builder.AppendLine($" Extdata ID: {extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.ExtdataID} (0x{extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.ExtdataID:X})");
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: {(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($" 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:");
if (extendedHeader.ACI.ARM11KernelCapabilities == null)
{
builder.AppendLine(" [NULL]");
}
else
{
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($" ARM11 kernel capabilities:");
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: {(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): {(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($" ARM9 access control:");
if (extendedHeader.ACI.ARM9AccessControl == null)
{
builder.AppendLine(" [NULL]");
}
else
{
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): {(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):");
builder.AppendLine($" ARM11 local system capabilities:");
builder.AppendLine($" Program ID: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ProgramID} (0x{extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ProgramID:X})");
builder.AppendLine($" Core version: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.CoreVersion} (0x{extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.CoreVersion:X})");
builder.AppendLine($" Flag 1: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Flag1} (0x{extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Flag1:X})");
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: {(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ResourceLimitDescriptors == null ? "[NULL]" : string.Join(", ", extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ResourceLimitDescriptors))}");
if (extendedHeader.ACIForLimitations == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" ARM11 local system capabilities:");
if (extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Program ID: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ProgramID} (0x{extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ProgramID:X})");
builder.AppendLine($" Core version: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.CoreVersion} (0x{extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.CoreVersion:X})");
builder.AppendLine($" Flag 1: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Flag1} (0x{extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Flag1:X})");
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: {(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: {(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($" Storage info:");
if (extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo == null)
{
builder.AppendLine(" [NULL]");
}
else
{
builder.AppendLine($" Extdata ID: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.ExtdataID} (0x{extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.ExtdataID:X})");
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: {(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($" 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: {(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($" ARM11 kernel capabilities:");
if (extendedHeader.ACIForLimitations.ARM11KernelCapabilities == null)
{
builder.AppendLine(" [NULL]");
}
else
{
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: {(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})");
builder.AppendLine($" ARM9 access control:");
if (extendedHeader.ACIForLimitations.ARM9AccessControl == null)
{
builder.AppendLine(" [NULL]");
}
else
{
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})");
}
}
}
}
}
@@ -861,23 +1052,49 @@ namespace BinaryObjectScanner.Wrappers
else
{
builder.AppendLine($" File headers:");
for (int j = 0; j < exeFSHeader.FileHeaders.Length; j++)
if (exeFSHeader.FileHeaders == null || exeFSHeader.FileHeaders.Length == 0)
{
var fileHeader = exeFSHeader.FileHeaders[j];
builder.AppendLine(value: $" File Header {j}");
builder.AppendLine(value: $" File name: {fileHeader.FileName}");
builder.AppendLine(value: $" File offset: {fileHeader.FileOffset} (0x{fileHeader.FileOffset:X})");
builder.AppendLine(value: $" File size: {fileHeader.FileSize} (0x{fileHeader.FileSize:X})");
builder.AppendLine(" No file headers");
}
else
{
for (int j = 0; j < exeFSHeader.FileHeaders.Length; j++)
{
var fileHeader = exeFSHeader.FileHeaders[j];
builder.AppendLine($" File Header {j}");
if (fileHeader == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" File name: {fileHeader.FileName}");
builder.AppendLine($" File offset: {fileHeader.FileOffset} (0x{fileHeader.FileOffset:X})");
builder.AppendLine($" File size: {fileHeader.FileSize} (0x{fileHeader.FileSize:X})");
}
}
builder.AppendLine(value: $" Reserved: {(exeFSHeader.Reserved == null ? "[NULL]" : BitConverter.ToString(exeFSHeader.Reserved).Replace('-', ' '))}");
builder.AppendLine($" Reserved: {(exeFSHeader.Reserved == null ? "[NULL]" : BitConverter.ToString(exeFSHeader.Reserved).Replace('-', ' '))}");
builder.AppendLine($" File hashes:");
for (int j = 0; j < exeFSHeader.FileHashes.Length; j++)
if (exeFSHeader.FileHashes == null || exeFSHeader.FileHashes.Length == 0)
{
var fileHash = exeFSHeader.FileHashes[j];
builder.AppendLine(value: $" File Hash {j}");
builder.AppendLine(value: $" SHA-256: {(fileHash == null ? "[NULL]" : BitConverter.ToString(fileHash).Replace('-', ' '))}");
builder.AppendLine(" No file hashes");
}
else
{
for (int j = 0; j < exeFSHeader.FileHashes.Length; j++)
{
var fileHash = exeFSHeader.FileHashes[j];
builder.AppendLine($" File Hash {j}");
if (fileHash == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" SHA-256: {(fileHash == null ? "[NULL]" : BitConverter.ToString(fileHash).Replace('-', ' '))}");
}
}
}
}
@@ -909,23 +1126,23 @@ namespace BinaryObjectScanner.Wrappers
}
else
{
builder.AppendLine(value: $" Magic string: {romFSHeader.MagicString}");
builder.AppendLine(value: $" Magic number: {romFSHeader.MagicNumber} (0x{romFSHeader.MagicNumber:X})");
builder.AppendLine(value: $" Master hash size: {romFSHeader.MasterHashSize} (0x{romFSHeader.MasterHashSize:X})");
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: {(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: {(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: {(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})");
builder.AppendLine($" Magic string: {romFSHeader.MagicString}");
builder.AppendLine($" Magic number: {romFSHeader.MagicNumber} (0x{romFSHeader.MagicNumber:X})");
builder.AppendLine($" Master hash size: {romFSHeader.MasterHashSize} (0x{romFSHeader.MasterHashSize:X})");
builder.AppendLine($" Level 1 logical offset: {romFSHeader.Level1LogicalOffset} (0x{romFSHeader.Level1LogicalOffset:X})");
builder.AppendLine($" Level 1 hashdata size: {romFSHeader.Level1HashdataSize} (0x{romFSHeader.Level1HashdataSize:X})");
builder.AppendLine($" Level 1 block size: {romFSHeader.Level1BlockSizeLog2} (0x{romFSHeader.Level1BlockSizeLog2:X})");
builder.AppendLine($" Reserved 1: {(romFSHeader.Reserved1 == null ? "[NULL]" : BitConverter.ToString(romFSHeader.Reserved1).Replace('-', ' '))}");
builder.AppendLine($" Level 2 logical offset: {romFSHeader.Level2LogicalOffset} (0x{romFSHeader.Level2LogicalOffset:X})");
builder.AppendLine($" Level 2 hashdata size: {romFSHeader.Level2HashdataSize} (0x{romFSHeader.Level2HashdataSize:X})");
builder.AppendLine($" Level 2 block size: {romFSHeader.Level2BlockSizeLog2} (0x{romFSHeader.Level2BlockSizeLog2:X})");
builder.AppendLine($" Reserved 2: {(romFSHeader.Reserved2 == null ? "[NULL]" : BitConverter.ToString(romFSHeader.Reserved2).Replace('-', ' '))}");
builder.AppendLine($" Level 3 logical offset: {romFSHeader.Level3LogicalOffset} (0x{romFSHeader.Level3LogicalOffset:X})");
builder.AppendLine($" Level 3 hashdata size: {romFSHeader.Level3HashdataSize} (0x{romFSHeader.Level3HashdataSize:X})");
builder.AppendLine($" Level 3 block size: {romFSHeader.Level3BlockSizeLog2} (0x{romFSHeader.Level3BlockSizeLog2:X})");
builder.AppendLine($" Reserved 3: {(romFSHeader.Reserved3 == null ? "[NULL]" : BitConverter.ToString(romFSHeader.Reserved3).Replace('-', ' '))}");
builder.AppendLine($" Reserved 4: {(romFSHeader.Reserved4 == null ? "[NULL]" : BitConverter.ToString(romFSHeader.Reserved4).Replace('-', ' '))}");
builder.AppendLine($" Optional info size: {romFSHeader.OptionalInfoSize} (0x{romFSHeader.OptionalInfoSize:X})");
}
}
}

View File

@@ -18,83 +18,183 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.NCF.Header.Dummy0"/>
#if NET48
public uint Dummy0 => _model.Header.Dummy0;
#else
public uint? Dummy0 => _model.Header?.Dummy0;
#endif
/// <inheritdoc cref="Models.NCF.Header.MajorVersion"/>
#if NET48
public uint MajorVersion => _model.Header.MajorVersion;
#else
public uint? MajorVersion => _model.Header?.MajorVersion;
#endif
/// <inheritdoc cref="Models.NCF.Header.MinorVersion"/>
#if NET48
public uint MinorVersion => _model.Header.MinorVersion;
#else
public uint? MinorVersion => _model.Header?.MinorVersion;
#endif
/// <inheritdoc cref="Models.NCF.Header.CacheID"/>
#if NET48
public uint CacheID => _model.Header.CacheID;
#else
public uint? CacheID => _model.Header?.CacheID;
#endif
/// <inheritdoc cref="Models.NCF.Header.LastVersionPlayed"/>
#if NET48
public uint LastVersionPlayed => _model.Header.LastVersionPlayed;
#else
public uint? LastVersionPlayed => _model.Header?.LastVersionPlayed;
#endif
/// <inheritdoc cref="Models.NCF.Header.Dummy1"/>
#if NET48
public uint Dummy1 => _model.Header.Dummy1;
#else
public uint? Dummy1 => _model.Header?.Dummy1;
#endif
/// <inheritdoc cref="Models.NCF.Header.Dummy2"/>
#if NET48
public uint Dummy2 => _model.Header.Dummy2;
#else
public uint? Dummy2 => _model.Header?.Dummy2;
#endif
/// <inheritdoc cref="Models.NCF.Header.FileSize"/>
#if NET48
public uint FileSize => _model.Header.FileSize;
#else
public uint? FileSize => _model.Header?.FileSize;
#endif
/// <inheritdoc cref="Models.NCF.Header.BlockSize"/>
#if NET48
public uint BlockSize => _model.Header.BlockSize;
#else
public uint? BlockSize => _model.Header?.BlockSize;
#endif
/// <inheritdoc cref="Models.NCF.Header.BlockCount"/>
#if NET48
public uint BlockCount => _model.Header.BlockCount;
#else
public uint? BlockCount => _model.Header?.BlockCount;
#endif
/// <inheritdoc cref="Models.NCF.Header.Dummy3"/>
#if NET48
public uint Dummy3 => _model.Header.Dummy3;
#else
public uint? Dummy3 => _model.Header?.Dummy3;
#endif
#endregion
#region Directory Header
/// <inheritdoc cref="Models.NCF.DirectoryHeader.Dummy0"/>
#if NET48
public uint DH_Dummy0 => _model.DirectoryHeader.Dummy0;
#else
public uint? DH_Dummy0 => _model.DirectoryHeader?.Dummy0;
#endif
/// <inheritdoc cref="Models.NCF.DirectoryHeader.CacheID"/>
#if NET48
public uint DH_CacheID => _model.DirectoryHeader.CacheID;
#else
public uint? DH_CacheID => _model.DirectoryHeader?.CacheID;
#endif
/// <inheritdoc cref="Models.NCF.DirectoryHeader.LastVersionPlayed"/>
#if NET48
public uint DH_LastVersionPlayed => _model.DirectoryHeader.LastVersionPlayed;
#else
public uint? DH_LastVersionPlayed => _model.DirectoryHeader?.LastVersionPlayed;
#endif
/// <inheritdoc cref="Models.NCF.DirectoryHeader.ItemCount"/>
#if NET48
public uint DH_ItemCount => _model.DirectoryHeader.ItemCount;
#else
public uint? DH_ItemCount => _model.DirectoryHeader?.ItemCount;
#endif
/// <inheritdoc cref="Models.NCF.DirectoryHeader.FileCount"/>
#if NET48
public uint DH_FileCount => _model.DirectoryHeader.FileCount;
#else
public uint? DH_FileCount => _model.DirectoryHeader?.FileCount;
#endif
/// <inheritdoc cref="Models.NCF.DirectoryHeader.ChecksumDataLength"/>
#if NET48
public uint DH_ChecksumDataLength => _model.DirectoryHeader.ChecksumDataLength;
#else
public uint? DH_ChecksumDataLength => _model.DirectoryHeader?.ChecksumDataLength;
#endif
/// <inheritdoc cref="Models.NCF.DirectoryHeader.DirectorySize"/>
#if NET48
public uint DH_DirectorySize => _model.DirectoryHeader.DirectorySize;
#else
public uint? DH_DirectorySize => _model.DirectoryHeader?.DirectorySize;
#endif
/// <inheritdoc cref="Models.NCF.DirectoryHeader.NameSize"/>
#if NET48
public uint DH_NameSize => _model.DirectoryHeader.NameSize;
#else
public uint? DH_NameSize => _model.DirectoryHeader?.NameSize;
#endif
/// <inheritdoc cref="Models.NCF.DirectoryHeader.Info1Count"/>
#if NET48
public uint DH_Info1Count => _model.DirectoryHeader.Info1Count;
#else
public uint? DH_Info1Count => _model.DirectoryHeader?.Info1Count;
#endif
/// <inheritdoc cref="Models.NCF.DirectoryHeader.CopyCount"/>
#if NET48
public uint DH_CopyCount => _model.DirectoryHeader.CopyCount;
#else
public uint? DH_CopyCount => _model.DirectoryHeader?.CopyCount;
#endif
/// <inheritdoc cref="Models.NCF.DirectoryHeader.LocalCount"/>
#if NET48
public uint DH_LocalCount => _model.DirectoryHeader.LocalCount;
#else
public uint? DH_LocalCount => _model.DirectoryHeader?.LocalCount;
#endif
/// <inheritdoc cref="Models.NCF.DirectoryHeader.Dummy1"/>
#if NET48
public uint DH_Dummy1 => _model.DirectoryHeader.Dummy1;
#else
public uint? DH_Dummy1 => _model.DirectoryHeader?.Dummy1;
#endif
/// <inheritdoc cref="Models.NCF.DirectoryHeader.Dummy2"/>
#if NET48
public uint DH_Dummy2 => _model.DirectoryHeader.Dummy2;
#else
public uint? DH_Dummy2 => _model.DirectoryHeader?.Dummy2;
#endif
/// <inheritdoc cref="Models.NCF.DirectoryHeader.Checksum"/>
#if NET48
public uint DH_Checksum => _model.DirectoryHeader.Checksum;
#else
public uint? DH_Checksum => _model.DirectoryHeader?.Checksum;
#endif
#endregion
@@ -167,10 +267,18 @@ namespace BinaryObjectScanner.Wrappers
#region Unknown Header
/// <inheritdoc cref="Models.NCF.UnknownHeader.Dummy0"/>
#if NET48
public uint UH_Dummy0 => _model.UnknownHeader.Dummy0;
#else
public uint? UH_Dummy0 => _model.UnknownHeader?.Dummy0;
#endif
/// <inheritdoc cref="Models.NCF.UnknownHeader.Dummy1"/>
#if NET48
public uint UH_Dummy1 => _model.UnknownHeader.Dummy1;
#else
public uint? UH_Dummy1 => _model.UnknownHeader?.Dummy1;
#endif
#endregion
@@ -188,26 +296,50 @@ namespace BinaryObjectScanner.Wrappers
#region Checksum Header
/// <inheritdoc cref="Models.NCF.ChecksumHeader.Dummy0"/>
#if NET48
public uint CH_Dummy0 => _model.ChecksumHeader.Dummy0;
#else
public uint? CH_Dummy0 => _model.ChecksumHeader?.Dummy0;
#endif
/// <inheritdoc cref="Models.NCF.ChecksumHeader.ChecksumSize"/>
#if NET48
public uint CH_ChecksumSize => _model.ChecksumHeader.ChecksumSize;
#else
public uint? CH_ChecksumSize => _model.ChecksumHeader?.ChecksumSize;
#endif
#endregion
#region Checksum Map Header
/// <inheritdoc cref="Models.NCF.ChecksumMapHeader.Dummy0"/>
#if NET48
public uint CMH_Dummy0 => _model.ChecksumMapHeader.Dummy0;
#else
public uint? CMH_Dummy0 => _model.ChecksumMapHeader?.Dummy0;
#endif
/// <inheritdoc cref="Models.NCF.ChecksumMapHeader.Dummy1"/>
#if NET48
public uint CMH_Dummy1 => _model.ChecksumMapHeader.Dummy1;
#else
public uint? CMH_Dummy1 => _model.ChecksumMapHeader?.Dummy1;
#endif
/// <inheritdoc cref="Models.NCF.ChecksumMapHeader.ItemCount"/>
#if NET48
public uint CMH_ItemCount => _model.ChecksumMapHeader.ItemCount;
#else
public uint? CMH_ItemCount => _model.ChecksumMapHeader?.ItemCount;
#endif
/// <inheritdoc cref="Models.NCF.ChecksumMapHeader.ChecksumCount"/>
#if NET48
public uint CMH_ChecksumCount => _model.ChecksumMapHeader.ChecksumCount;
#else
public uint? CMH_ChecksumCount => _model.ChecksumMapHeader?.ChecksumCount;
#endif
#endregion
@@ -414,6 +546,12 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryEntry = DirectoryEntries[i];
builder.AppendLine($" Directory Entry {i}");
if (directoryEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Name offset: {directoryEntry.NameOffset} (0x{directoryEntry.NameOffset:X})");
builder.AppendLine($" Name: {directoryEntry.Name}");
builder.AppendLine($" Item size: {directoryEntry.ItemSize} (0x{directoryEntry.ItemSize:X})");
@@ -445,6 +583,12 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryInfoEntry = DirectoryInfo1Entries[i];
builder.AppendLine($" Directory Info 1 Entry {i}");
if (directoryInfoEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Dummy 0: {directoryInfoEntry.Dummy0} (0x{directoryInfoEntry.Dummy0:X})");
}
}
@@ -469,6 +613,12 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryInfoEntry = DirectoryInfo2Entries[i];
builder.AppendLine($" Directory Info 2 Entry {i}");
if (directoryInfoEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Dummy 0: {directoryInfoEntry.Dummy0} (0x{directoryInfoEntry.Dummy0:X})");
}
}
@@ -482,7 +632,7 @@ namespace BinaryObjectScanner.Wrappers
private void PrintDirectoryCopyEntries(StringBuilder builder)
{
builder.AppendLine(" Directory Copy Entries Information:");
builder.AppendLine(value: " -------------------------");
builder.AppendLine(" -------------------------");
if (DirectoryCopyEntries == null || DirectoryCopyEntries.Length == 0)
{
builder.AppendLine(" No directory copy entries");
@@ -493,6 +643,12 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryCopyEntry = DirectoryCopyEntries[i];
builder.AppendLine($" Directory Copy Entry {i}");
if (directoryCopyEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Directory index: {directoryCopyEntry.DirectoryIndex} (0x{directoryCopyEntry.DirectoryIndex:X})");
}
}
@@ -506,7 +662,7 @@ namespace BinaryObjectScanner.Wrappers
private void PrintDirectoryLocalEntries(StringBuilder builder)
{
builder.AppendLine(" Directory Local Entries Information:");
builder.AppendLine(value: " -------------------------");
builder.AppendLine(" -------------------------");
if (DirectoryLocalEntries == null || DirectoryLocalEntries.Length == 0)
{
builder.AppendLine(" No directory local entries");
@@ -517,6 +673,12 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryLocalEntry = DirectoryLocalEntries[i];
builder.AppendLine($" Directory Local Entry {i}");
if (directoryLocalEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Directory index: {directoryLocalEntry.DirectoryIndex} (0x{directoryLocalEntry.DirectoryIndex:X})");
}
}
@@ -543,7 +705,7 @@ namespace BinaryObjectScanner.Wrappers
private void PrintUnknownEntries(StringBuilder builder)
{
builder.AppendLine(" Unknown Entries Information:");
builder.AppendLine(value: " -------------------------");
builder.AppendLine(" -------------------------");
if (UnknownEntries == null || UnknownEntries.Length == 0)
{
builder.AppendLine(" No unknown entries");
@@ -554,6 +716,12 @@ namespace BinaryObjectScanner.Wrappers
{
var unknownEntry = UnknownEntries[i];
builder.AppendLine($" Unknown Entry {i}");
if (unknownEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Dummy 0: {unknownEntry.Dummy0} (0x{unknownEntry.Dummy0:X})");
}
}
@@ -595,7 +763,7 @@ namespace BinaryObjectScanner.Wrappers
private void PrintChecksumMapEntries(StringBuilder builder)
{
builder.AppendLine(" Checksum Map Entries Information:");
builder.AppendLine(value: " -------------------------");
builder.AppendLine(" -------------------------");
if (ChecksumMapEntries == null || ChecksumMapEntries.Length == 0)
{
builder.AppendLine(" No checksum map entries");
@@ -606,6 +774,12 @@ namespace BinaryObjectScanner.Wrappers
{
var checksumMapEntry = ChecksumMapEntries[i];
builder.AppendLine($" Checksum Map Entry {i}");
if (checksumMapEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Checksum count: {checksumMapEntry.ChecksumCount} (0x{checksumMapEntry.ChecksumCount:X})");
builder.AppendLine($" First checksum index: {checksumMapEntry.FirstChecksumIndex} (0x{checksumMapEntry.FirstChecksumIndex:X})");
}
@@ -620,7 +794,7 @@ namespace BinaryObjectScanner.Wrappers
private void PrintChecksumEntries(StringBuilder builder)
{
builder.AppendLine(" Checksum Entries Information:");
builder.AppendLine(value: " -------------------------");
builder.AppendLine(" -------------------------");
if (ChecksumEntries == null || ChecksumEntries.Length == 0)
{
builder.AppendLine(" No checksum entries");
@@ -631,6 +805,12 @@ namespace BinaryObjectScanner.Wrappers
{
var checksumEntry = ChecksumEntries[i];
builder.AppendLine($" Checksum Entry {i}");
if (checksumEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Checksum: {checksumEntry.Checksum} (0x{checksumEntry.Checksum:X})");
}
}

View File

@@ -25,47 +25,99 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string Stub_Magic => _model.Stub.Header.Magic;
#else
public string? Stub_Magic => _model.Stub.Header.Magic;
public string? Stub_Magic => _model.Stub?.Header?.Magic;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.LastPageBytes"/>
#if NET48
public ushort Stub_LastPageBytes => _model.Stub.Header.LastPageBytes;
#else
public ushort? Stub_LastPageBytes => _model.Stub?.Header?.LastPageBytes;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Pages"/>
#if NET48
public ushort Stub_Pages => _model.Stub.Header.Pages;
#else
public ushort? Stub_Pages => _model.Stub?.Header?.Pages;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.RelocationItems"/>
#if NET48
public ushort Stub_RelocationItems => _model.Stub.Header.RelocationItems;
#else
public ushort? Stub_RelocationItems => _model.Stub?.Header?.RelocationItems;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.HeaderParagraphSize"/>
#if NET48
public ushort Stub_HeaderParagraphSize => _model.Stub.Header.HeaderParagraphSize;
#else
public ushort? Stub_HeaderParagraphSize => _model.Stub?.Header?.HeaderParagraphSize;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.MinimumExtraParagraphs"/>
#if NET48
public ushort Stub_MinimumExtraParagraphs => _model.Stub.Header.MinimumExtraParagraphs;
#else
public ushort? Stub_MinimumExtraParagraphs => _model.Stub?.Header?.MinimumExtraParagraphs;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.MaximumExtraParagraphs"/>
#if NET48
public ushort Stub_MaximumExtraParagraphs => _model.Stub.Header.MaximumExtraParagraphs;
#else
public ushort? Stub_MaximumExtraParagraphs => _model.Stub?.Header?.MaximumExtraParagraphs;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.InitialSSValue"/>
#if NET48
public ushort Stub_InitialSSValue => _model.Stub.Header.InitialSSValue;
#else
public ushort? Stub_InitialSSValue => _model.Stub?.Header?.InitialSSValue;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.InitialSPValue"/>
#if NET48
public ushort Stub_InitialSPValue => _model.Stub.Header.InitialSPValue;
#else
public ushort? Stub_InitialSPValue => _model.Stub?.Header?.InitialSPValue;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.Checksum"/>
#if NET48
public ushort Stub_Checksum => _model.Stub.Header.Checksum;
#else
public ushort? Stub_Checksum => _model.Stub?.Header?.Checksum;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.InitialIPValue"/>
#if NET48
public ushort Stub_InitialIPValue => _model.Stub.Header.InitialIPValue;
#else
public ushort? Stub_InitialIPValue => _model.Stub?.Header?.InitialIPValue;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.InitialCSValue"/>
#if NET48
public ushort Stub_InitialCSValue => _model.Stub.Header.InitialCSValue;
#else
public ushort? Stub_InitialCSValue => _model.Stub?.Header?.InitialCSValue;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.RelocationTableAddr"/>
#if NET48
public ushort Stub_RelocationTableAddr => _model.Stub.Header.RelocationTableAddr;
#else
public ushort? Stub_RelocationTableAddr => _model.Stub?.Header?.RelocationTableAddr;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.OverlayNumber"/>
#if NET48
public ushort Stub_OverlayNumber => _model.Stub.Header.OverlayNumber;
#else
public ushort? Stub_OverlayNumber => _model.Stub?.Header?.OverlayNumber;
#endif
#endregion
@@ -75,24 +127,36 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public ushort[] Stub_Reserved1 => _model.Stub.Header.Reserved1;
#else
public ushort[]? Stub_Reserved1 => _model.Stub.Header.Reserved1;
public ushort[]? Stub_Reserved1 => _model.Stub?.Header?.Reserved1;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.OEMIdentifier"/>
#if NET48
public ushort Stub_OEMIdentifier => _model.Stub.Header.OEMIdentifier;
#else
public ushort? Stub_OEMIdentifier => _model.Stub?.Header?.OEMIdentifier;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.OEMInformation"/>
#if NET48
public ushort Stub_OEMInformation => _model.Stub.Header.OEMInformation;
#else
public ushort? Stub_OEMInformation => _model.Stub?.Header?.OEMInformation;
#endif
/// <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;
public ushort[]? Stub_Reserved2 => _model.Stub?.Header?.Reserved2;
#endif
/// <inheritdoc cref="Models.MSDOS.ExecutableHeader.NewExeHeaderAddr"/>
#if NET48
public uint Stub_NewExeHeaderAddr => _model.Stub.Header.NewExeHeaderAddr;
#else
public uint? Stub_NewExeHeaderAddr => _model.Stub?.Header?.NewExeHeaderAddr;
#endif
#endregion
@@ -104,98 +168,218 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string Magic => _model.Header.Magic;
#else
public string? Magic => _model.Header.Magic;
public string? Magic => _model.Header?.Magic;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.LinkerVersion"/>
#if NET48
public byte LinkerVersion => _model.Header.LinkerVersion;
#else
public byte? LinkerVersion => _model.Header?.LinkerVersion;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.LinkerRevision"/>
#if NET48
public byte LinkerRevision => _model.Header.LinkerRevision;
#else
public byte? LinkerRevision => _model.Header?.LinkerRevision;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.EntryTableOffset"/>
#if NET48
public ushort EntryTableOffset => _model.Header.EntryTableOffset;
#else
public ushort? EntryTableOffset => _model.Header?.EntryTableOffset;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.EntryTableSize"/>
#if NET48
public ushort EntryTableSize => _model.Header.EntryTableSize;
#else
public ushort? EntryTableSize => _model.Header?.EntryTableSize;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.CrcChecksum"/>
#if NET48
public uint CrcChecksum => _model.Header.CrcChecksum;
#else
public uint? CrcChecksum => _model.Header?.CrcChecksum;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.FlagWord"/>
#if NET48
public SabreTools.Models.NewExecutable.HeaderFlag FlagWord => _model.Header.FlagWord;
#else
public SabreTools.Models.NewExecutable.HeaderFlag? FlagWord => _model.Header?.FlagWord;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.AutomaticDataSegmentNumber"/>
#if NET48
public ushort AutomaticDataSegmentNumber => _model.Header.AutomaticDataSegmentNumber;
#else
public ushort? AutomaticDataSegmentNumber => _model.Header?.AutomaticDataSegmentNumber;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.InitialHeapAlloc"/>
#if NET48
public ushort InitialHeapAlloc => _model.Header.InitialHeapAlloc;
#else
public ushort? InitialHeapAlloc => _model.Header?.InitialHeapAlloc;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.InitialStackAlloc"/>
#if NET48
public ushort InitialStackAlloc => _model.Header.InitialStackAlloc;
#else
public ushort? InitialStackAlloc => _model.Header?.InitialStackAlloc;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.InitialCSIPSetting"/>
#if NET48
public uint InitialCSIPSetting => _model.Header.InitialCSIPSetting;
#else
public uint? InitialCSIPSetting => _model.Header?.InitialCSIPSetting;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.InitialSSSPSetting"/>
#if NET48
public uint InitialSSSPSetting => _model.Header.InitialSSSPSetting;
#else
public uint? InitialSSSPSetting => _model.Header?.InitialSSSPSetting;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.FileSegmentCount"/>
#if NET48
public ushort FileSegmentCount => _model.Header.FileSegmentCount;
#else
public ushort? FileSegmentCount => _model.Header?.FileSegmentCount;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.ModuleReferenceTableSize"/>
#if NET48
public ushort ModuleReferenceTableSize => _model.Header.ModuleReferenceTableSize;
#else
public ushort? ModuleReferenceTableSize => _model.Header?.ModuleReferenceTableSize;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.NonResidentNameTableSize"/>
#if NET48
public ushort NonResidentNameTableSize => _model.Header.NonResidentNameTableSize;
#else
public ushort? NonResidentNameTableSize => _model.Header?.NonResidentNameTableSize;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.SegmentTableOffset"/>
#if NET48
public ushort SegmentTableOffset => _model.Header.SegmentTableOffset;
#else
public ushort? SegmentTableOffset => _model.Header?.SegmentTableOffset;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.ResourceTableOffset"/>
#if NET48
public ushort ResourceTableOffset => _model.Header.ResourceTableOffset;
#else
public ushort? ResourceTableOffset => _model.Header?.ResourceTableOffset;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.ResidentNameTableOffset"/>
#if NET48
public ushort ResidentNameTableOffset => _model.Header.ResidentNameTableOffset;
#else
public ushort? ResidentNameTableOffset => _model.Header?.ResidentNameTableOffset;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.ModuleReferenceTableOffset"/>
#if NET48
public ushort ModuleReferenceTableOffset => _model.Header.ModuleReferenceTableOffset;
#else
public ushort? ModuleReferenceTableOffset => _model.Header?.ModuleReferenceTableOffset;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.ImportedNamesTableOffset"/>
#if NET48
public ushort ImportedNamesTableOffset => _model.Header.ImportedNamesTableOffset;
#else
public ushort? ImportedNamesTableOffset => _model.Header?.ImportedNamesTableOffset;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.NonResidentNamesTableOffset"/>
#if NET48
public uint NonResidentNamesTableOffset => _model.Header.NonResidentNamesTableOffset;
#else
public uint? NonResidentNamesTableOffset => _model.Header?.NonResidentNamesTableOffset;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.MovableEntriesCount"/>
#if NET48
public ushort MovableEntriesCount => _model.Header.MovableEntriesCount;
#else
public ushort? MovableEntriesCount => _model.Header?.MovableEntriesCount;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.SegmentAlignmentShiftCount"/>
#if NET48
public ushort SegmentAlignmentShiftCount => _model.Header.SegmentAlignmentShiftCount;
#else
public ushort? SegmentAlignmentShiftCount => _model.Header?.SegmentAlignmentShiftCount;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.ResourceEntriesCount"/>
#if NET48
public ushort ResourceEntriesCount => _model.Header.ResourceEntriesCount;
#else
public ushort? ResourceEntriesCount => _model.Header?.ResourceEntriesCount;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.TargetOperatingSystem"/>
#if NET48
public SabreTools.Models.NewExecutable.OperatingSystem TargetOperatingSystem => _model.Header.TargetOperatingSystem;
#else
public SabreTools.Models.NewExecutable.OperatingSystem? TargetOperatingSystem => _model.Header?.TargetOperatingSystem;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.AdditionalFlags"/>
#if NET48
public SabreTools.Models.NewExecutable.OS2Flag AdditionalFlags => _model.Header.AdditionalFlags;
#else
public SabreTools.Models.NewExecutable.OS2Flag? AdditionalFlags => _model.Header?.AdditionalFlags;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.ReturnThunkOffset"/>
#if NET48
public ushort ReturnThunkOffset => _model.Header.ReturnThunkOffset;
#else
public ushort? ReturnThunkOffset => _model.Header?.ReturnThunkOffset;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.SegmentReferenceThunkOffset"/>
#if NET48
public ushort SegmentReferenceThunkOffset => _model.Header.SegmentReferenceThunkOffset;
#else
public ushort? SegmentReferenceThunkOffset => _model.Header?.SegmentReferenceThunkOffset;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.MinCodeSwapAreaSize"/>
#if NET48
public ushort MinCodeSwapAreaSize => _model.Header.MinCodeSwapAreaSize;
#else
public ushort? MinCodeSwapAreaSize => _model.Header?.MinCodeSwapAreaSize;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.WindowsSDKRevision"/>
#if NET48
public byte WindowsSDKRevision => _model.Header.WindowsSDKRevision;
#else
public byte? WindowsSDKRevision => _model.Header?.WindowsSDKRevision;
#endif
/// <inheritdoc cref="Models.NewExecutable.ExecutableHeader.WindowsSDKVersion"/>
#if NET48
public byte WindowsSDKVersion => _model.Header.WindowsSDKVersion;
#else
public byte? WindowsSDKVersion => _model.Header?.WindowsSDKVersion;
#endif
#endregion
@@ -461,7 +645,7 @@ namespace BinaryObjectScanner.Wrappers
{
builder.AppendLine(" Segment Table Information:");
builder.AppendLine(" -------------------------");
if (FileSegmentCount == 0 || SegmentTable.Length == 0)
if (FileSegmentCount == 0 || SegmentTable == null || SegmentTable.Length == 0)
{
builder.AppendLine(" No segment table items");
}
@@ -471,6 +655,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = SegmentTable[i];
builder.AppendLine($" Segment Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Offset: {entry.Offset} (0x{entry.Offset:X})");
builder.AppendLine($" Length: {entry.Length} (0x{entry.Length:X})");
builder.AppendLine($" Flag word: {entry.FlagWord} (0x{entry.FlagWord:X})");
@@ -488,8 +678,14 @@ namespace BinaryObjectScanner.Wrappers
{
builder.AppendLine(" Resource Table Information:");
builder.AppendLine(" -------------------------");
if (ResourceTable == null)
{
builder.AppendLine(" No resource table");
return;
}
builder.AppendLine($" Alignment shift count: {ResourceTable.AlignmentShiftCount} (0x{ResourceTable.AlignmentShiftCount:X})");
if (ResourceEntriesCount == 0 || ResourceTable.ResourceTypes.Length == 0)
if (ResourceEntriesCount == 0 || ResourceTable.ResourceTypes == null || ResourceTable.ResourceTypes.Length == 0)
{
builder.AppendLine(" No resource table items");
}
@@ -500,11 +696,17 @@ namespace BinaryObjectScanner.Wrappers
// TODO: If not integer type, print out name
var entry = ResourceTable.ResourceTypes[i];
builder.AppendLine($" Resource Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Type ID: {entry.TypeID} (0x{entry.TypeID:X}) (Is Integer Type: {entry.IsIntegerType()})");
builder.AppendLine($" Resource count: {entry.ResourceCount} (0x{entry.ResourceCount:X})");
builder.AppendLine($" Reserved: {entry.Reserved} (0x{entry.Reserved:X})");
builder.AppendLine($" Resources = ");
if (entry.ResourceCount == 0 || entry.Resources.Length == 0)
if (entry.ResourceCount == 0 || entry.Resources == null || entry.Resources.Length == 0)
{
builder.AppendLine(" No resource items");
}
@@ -515,6 +717,12 @@ namespace BinaryObjectScanner.Wrappers
// TODO: If not integer type, print out name
var resource = entry.Resources[j];
builder.AppendLine($" Resource Entry {i}");
if (resource == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Offset: {resource.Offset} (0x{resource.Offset:X})");
builder.AppendLine($" Length: {resource.Length} (0x{resource.Length:X})");
builder.AppendLine($" Flag word: {resource.FlagWord} (0x{resource.FlagWord:X})");
@@ -525,7 +733,7 @@ namespace BinaryObjectScanner.Wrappers
}
}
if (ResourceTable.TypeAndNameStrings.Count == 0)
if (ResourceTable.TypeAndNameStrings == null || ResourceTable.TypeAndNameStrings.Count == 0)
{
builder.AppendLine(" No resource table type/name strings");
}
@@ -534,6 +742,13 @@ namespace BinaryObjectScanner.Wrappers
foreach (var typeAndNameString in ResourceTable.TypeAndNameStrings)
{
builder.AppendLine($" Resource Type/Name Offset {typeAndNameString.Key}");
#if NET6_0_OR_GREATER
if (typeAndNameString.Value == null)
{
builder.AppendLine(" [NULL]");
continue;
}
#endif
builder.AppendLine($" Length: {typeAndNameString.Value.Length} (0x{typeAndNameString.Value.Length:X})");
builder.AppendLine($" Text: {(typeAndNameString.Value.Text != null ? Encoding.ASCII.GetString(typeAndNameString.Value.Text).TrimEnd('\0') : "[EMPTY]")}");
}
@@ -549,7 +764,7 @@ namespace BinaryObjectScanner.Wrappers
{
builder.AppendLine(" Resident-Name Table Information:");
builder.AppendLine(" -------------------------");
if (ResidentNameTableOffset == 0 || ResidentNameTable.Length == 0)
if (ResidentNameTableOffset == 0 || ResidentNameTable == null || ResidentNameTable.Length == 0)
{
builder.AppendLine(" No resident-name table items");
}
@@ -559,6 +774,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = ResidentNameTable[i];
builder.AppendLine($" Resident-Name Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Length: {entry.Length} (0x{entry.Length:X})");
builder.AppendLine($" Name string: {(entry.NameString != null ? Encoding.ASCII.GetString(entry.NameString).TrimEnd('\0') : "[EMPTY]")}");
builder.AppendLine($" Ordinal number: {entry.OrdinalNumber} (0x{entry.OrdinalNumber:X})");
@@ -575,7 +796,7 @@ namespace BinaryObjectScanner.Wrappers
{
builder.AppendLine(" Module-Reference Table Information:");
builder.AppendLine(" -------------------------");
if (ModuleReferenceTableSize == 0 || ModuleReferenceTable.Length == 0)
if (ModuleReferenceTableSize == 0 || ModuleReferenceTable == null || ModuleReferenceTable.Length == 0)
{
builder.AppendLine(" No module-reference table items");
}
@@ -586,6 +807,12 @@ namespace BinaryObjectScanner.Wrappers
// TODO: Read the imported names table and print value here
var entry = ModuleReferenceTable[i];
builder.AppendLine($" Module-Reference Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Offset: {entry.Offset} (adjusted to be {entry.Offset + Stub_NewExeHeaderAddr + ImportedNamesTableOffset})");
}
}
@@ -600,7 +827,7 @@ namespace BinaryObjectScanner.Wrappers
{
builder.AppendLine(" Imported-Name Table Information:");
builder.AppendLine(" -------------------------");
if (ImportedNamesTableOffset == 0 || ImportedNameTable.Count == 0)
if (ImportedNamesTableOffset == 0 || ImportedNameTable == null || ImportedNameTable.Count == 0)
{
builder.AppendLine(" No imported-name table items");
}
@@ -609,6 +836,13 @@ namespace BinaryObjectScanner.Wrappers
foreach (var entry in ImportedNameTable)
{
builder.AppendLine($" Imported-Name Table at Offset {entry.Key}");
#if NET6_0_OR_GREATER
if (entry.Value == null)
{
builder.AppendLine(" [NULL]");
continue;
}
#endif
builder.AppendLine($" Length: {entry.Value.Length} (0x{entry.Value.Length:X})");
builder.AppendLine($" Name string: {(entry.Value.NameString != null ? Encoding.ASCII.GetString(entry.Value.NameString) : "[EMPTY]")}");
}
@@ -624,7 +858,7 @@ namespace BinaryObjectScanner.Wrappers
{
builder.AppendLine(" Entry Table Information:");
builder.AppendLine(" -------------------------");
if (EntryTableSize == 0 || EntryTable.Length == 0)
if (EntryTableSize == 0 || EntryTable == null || EntryTable.Length == 0)
{
builder.AppendLine(" No entry table items");
}
@@ -634,6 +868,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = EntryTable[i];
builder.AppendLine($" Entry Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Entry count: {entry.EntryCount} (0x{entry.EntryCount:X})");
builder.AppendLine($" Segment indicator: {entry.SegmentIndicator} (0x{entry.SegmentIndicator:X}) ({entry.GetEntryType()})");
switch (entry.GetEntryType())
@@ -662,7 +902,7 @@ namespace BinaryObjectScanner.Wrappers
{
builder.AppendLine(" Nonresident-Name Table Information:");
builder.AppendLine(" -------------------------");
if (NonResidentNameTableSize == 0 || NonResidentNameTable.Length == 0)
if (NonResidentNameTableSize == 0 || NonResidentNameTable == null || NonResidentNameTable.Length == 0)
{
builder.AppendLine(" No nonresident-name table items");
}
@@ -672,6 +912,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = NonResidentNameTable[i];
builder.AppendLine($" Nonresident-Name Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Length: {entry.Length} (0x{entry.Length:X})");
builder.AppendLine($" Name string: {(entry.NameString != null ? Encoding.ASCII.GetString(entry.NameString) : "[EMPTY]")}");
builder.AppendLine($" Ordinal number: {entry.OrdinalNumber} (0x{entry.OrdinalNumber:X})");
@@ -714,11 +960,19 @@ namespace BinaryObjectScanner.Wrappers
switch (_dataSource)
{
case DataSource.ByteArray:
#if NET48
length = _byteArrayData.Length - _byteArrayOffset;
#else
length = _byteArrayData!.Length - _byteArrayOffset;
#endif
break;
case DataSource.Stream:
#if NET48
length = (int)_streamData.Length;
#else
length = (int)_streamData!.Length;
#endif
break;
}
}

View File

@@ -21,151 +21,287 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string GameTitle => _model.CommonHeader.GameTitle;
#else
public string? GameTitle => _model.CommonHeader.GameTitle;
public string? GameTitle => _model.CommonHeader?.GameTitle;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.GameCode"/>
#if NET48
public uint GameCode => _model.CommonHeader.GameCode;
#else
public uint? GameCode => _model.CommonHeader?.GameCode;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.MakerCode"/>
#if NET48
public string MakerCode => _model.CommonHeader.MakerCode;
#else
public string? MakerCode => _model.CommonHeader.MakerCode;
public string? MakerCode => _model.CommonHeader?.MakerCode;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.UnitCode"/>
#if NET48
public SabreTools.Models.Nitro.Unitcode UnitCode => _model.CommonHeader.UnitCode;
#else
public SabreTools.Models.Nitro.Unitcode? UnitCode => _model.CommonHeader?.UnitCode;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.EncryptionSeedSelect"/>
#if NET48
public byte EncryptionSeedSelect => _model.CommonHeader.EncryptionSeedSelect;
#else
public byte? EncryptionSeedSelect => _model.CommonHeader?.EncryptionSeedSelect;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.DeviceCapacity"/>
#if NET48
public byte DeviceCapacity => _model.CommonHeader.DeviceCapacity;
#else
public byte? DeviceCapacity => _model.CommonHeader?.DeviceCapacity;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.Reserved1"/>
#if NET48
public byte[] Reserved1 => _model.CommonHeader.Reserved1;
#else
public byte[]? Reserved1 => _model.CommonHeader.Reserved1;
public byte[]? Reserved1 => _model.CommonHeader?.Reserved1;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.GameRevision"/>
#if NET48
public ushort GameRevision => _model.CommonHeader.GameRevision;
#else
public ushort? GameRevision => _model.CommonHeader?.GameRevision;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.RomVersion"/>
#if NET48
public byte RomVersion => _model.CommonHeader.RomVersion;
#else
public byte? RomVersion => _model.CommonHeader?.RomVersion;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.InternalFlags"/>
#if NET48
public byte InternalFlags => _model.CommonHeader.InternalFlags;
#else
public byte? InternalFlags => _model.CommonHeader?.InternalFlags;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.ARM9RomOffset"/>
#if NET48
public uint ARM9RomOffset => _model.CommonHeader.ARM9RomOffset;
#else
public uint? ARM9RomOffset => _model.CommonHeader?.ARM9RomOffset;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.ARM9EntryAddress"/>
#if NET48
public uint ARM9EntryAddress => _model.CommonHeader.ARM9EntryAddress;
#else
public uint? ARM9EntryAddress => _model.CommonHeader?.ARM9EntryAddress;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.ARM9LoadAddress"/>
#if NET48
public uint ARM9LoadAddress => _model.CommonHeader.ARM9LoadAddress;
#else
public uint? ARM9LoadAddress => _model.CommonHeader?.ARM9LoadAddress;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.ARM9Size"/>
#if NET48
public uint ARM9Size => _model.CommonHeader.ARM9Size;
#else
public uint? ARM9Size => _model.CommonHeader?.ARM9Size;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.ARM7RomOffset"/>
#if NET48
public uint ARM7RomOffset => _model.CommonHeader.ARM7RomOffset;
#else
public uint? ARM7RomOffset => _model.CommonHeader?.ARM7RomOffset;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.ARM7EntryAddress"/>
#if NET48
public uint ARM7EntryAddress => _model.CommonHeader.ARM7EntryAddress;
#else
public uint? ARM7EntryAddress => _model.CommonHeader?.ARM7EntryAddress;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.ARM7LoadAddress"/>
#if NET48
public uint ARM7LoadAddress => _model.CommonHeader.ARM7LoadAddress;
#else
public uint? ARM7LoadAddress => _model.CommonHeader?.ARM7LoadAddress;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.ARM7Size"/>
#if NET48
public uint ARM7Size => _model.CommonHeader.ARM7Size;
#else
public uint? ARM7Size => _model.CommonHeader?.ARM7Size;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.FileNameTableOffset"/>
#if NET48
public uint FileNameTableOffset => _model.CommonHeader.FileNameTableOffset;
#else
public uint? FileNameTableOffset => _model.CommonHeader?.FileNameTableOffset;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.FileNameTableLength"/>
#if NET48
public uint FileNameTableLength => _model.CommonHeader.FileNameTableLength;
#else
public uint? FileNameTableLength => _model.CommonHeader?.FileNameTableLength;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.FileAllocationTableOffset"/>
#if NET48
public uint FileAllocationTableOffset => _model.CommonHeader.FileAllocationTableOffset;
#else
public uint? FileAllocationTableOffset => _model.CommonHeader?.FileAllocationTableOffset;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.FileAllocationTableLength"/>
#if NET48
public uint FileAllocationTableLength => _model.CommonHeader.FileAllocationTableLength;
#else
public uint? FileAllocationTableLength => _model.CommonHeader?.FileAllocationTableLength;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.ARM9OverlayOffset"/>
#if NET48
public uint ARM9OverlayOffset => _model.CommonHeader.ARM9OverlayOffset;
#else
public uint? ARM9OverlayOffset => _model.CommonHeader?.ARM9OverlayOffset;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.ARM9OverlayLength"/>
#if NET48
public uint ARM9OverlayLength => _model.CommonHeader.ARM9OverlayLength;
#else
public uint? ARM9OverlayLength => _model.CommonHeader?.ARM9OverlayLength;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.ARM7OverlayOffset"/>
#if NET48
public uint ARM7OverlayOffset => _model.CommonHeader.ARM7OverlayOffset;
#else
public uint? ARM7OverlayOffset => _model.CommonHeader?.ARM7OverlayOffset;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.ARM7OverlayLength"/>
#if NET48
public uint ARM7OverlayLength => _model.CommonHeader.ARM7OverlayLength;
#else
public uint? ARM7OverlayLength => _model.CommonHeader?.ARM7OverlayLength;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.NormalCardControlRegisterSettings"/>
#if NET48
public uint NormalCardControlRegisterSettings => _model.CommonHeader.NormalCardControlRegisterSettings;
#else
public uint? NormalCardControlRegisterSettings => _model.CommonHeader?.NormalCardControlRegisterSettings;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.SecureCardControlRegisterSettings"/>
#if NET48
public uint SecureCardControlRegisterSettings => _model.CommonHeader.SecureCardControlRegisterSettings;
#else
public uint? SecureCardControlRegisterSettings => _model.CommonHeader?.SecureCardControlRegisterSettings;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.IconBannerOffset"/>
#if NET48
public uint IconBannerOffset => _model.CommonHeader.IconBannerOffset;
#else
public uint? IconBannerOffset => _model.CommonHeader?.IconBannerOffset;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.SecureAreaCRC"/>
#if NET48
public ushort SecureAreaCRC => _model.CommonHeader.SecureAreaCRC;
#else
public ushort? SecureAreaCRC => _model.CommonHeader?.SecureAreaCRC;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.SecureTransferTimeout"/>
#if NET48
public ushort SecureTransferTimeout => _model.CommonHeader.SecureTransferTimeout;
#else
public ushort? SecureTransferTimeout => _model.CommonHeader?.SecureTransferTimeout;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.ARM9Autoload"/>
#if NET48
public uint ARM9Autoload => _model.CommonHeader.ARM9Autoload;
#else
public uint? ARM9Autoload => _model.CommonHeader?.ARM9Autoload;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.ARM7Autoload"/>
#if NET48
public uint ARM7Autoload => _model.CommonHeader.ARM7Autoload;
#else
public uint? ARM7Autoload => _model.CommonHeader?.ARM7Autoload;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.SecureDisable"/>
#if NET48
public byte[] SecureDisable => _model.CommonHeader.SecureDisable;
#else
public byte[]? SecureDisable => _model.CommonHeader.SecureDisable;
public byte[]? SecureDisable => _model.CommonHeader?.SecureDisable;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.NTRRegionRomSize"/>
#if NET48
public uint NTRRegionRomSize => _model.CommonHeader.NTRRegionRomSize;
#else
public uint? NTRRegionRomSize => _model.CommonHeader?.NTRRegionRomSize;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.HeaderSize"/>
#if NET48
public uint HeaderSize => _model.CommonHeader.HeaderSize;
#else
public uint? HeaderSize => _model.CommonHeader?.HeaderSize;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.Reserved2"/>
#if NET48
public byte[] Reserved2 => _model.CommonHeader.Reserved2;
#else
public byte[]? Reserved2 => _model.CommonHeader.Reserved2;
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;
public byte[]? NintendoLogo => _model.CommonHeader?.NintendoLogo;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.NintendoLogoCRC"/>
#if NET48
public ushort NintendoLogoCRC => _model.CommonHeader.NintendoLogoCRC;
#else
public ushort? NintendoLogoCRC => _model.CommonHeader?.NintendoLogoCRC;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.HeaderCRC"/>
#if NET48
public ushort HeaderCRC => _model.CommonHeader.HeaderCRC;
#else
public ushort? HeaderCRC => _model.CommonHeader?.HeaderCRC;
#endif
/// <inheritdoc cref="Models.Nitro.CommonHeader.DebuggerReserved"/>
#if NET48
public byte[] DebuggerReserved => _model.CommonHeader.DebuggerReserved;
#else
public byte[]? DebuggerReserved => _model.CommonHeader.DebuggerReserved;
public byte[]? DebuggerReserved => _model.CommonHeader?.DebuggerReserved;
#endif
#endregion
@@ -403,14 +539,14 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public SabreTools.Models.Nitro.FolderAllocationTableEntry[] FolderAllocationTable => _model.NameTable.FolderAllocationTable;
#else
public SabreTools.Models.Nitro.FolderAllocationTableEntry?[]? FolderAllocationTable => _model.NameTable.FolderAllocationTable;
public SabreTools.Models.Nitro.FolderAllocationTableEntry?[]? FolderAllocationTable => _model.NameTable?.FolderAllocationTable;
#endif
/// <inheritdoc cref="Models.Nitro.NameTable.NameList"/>
#if NET48
public SabreTools.Models.Nitro.NameListEntry[] NameList => _model.NameTable.NameList;
#else
public SabreTools.Models.Nitro.NameListEntry?[]? NameList => _model.NameTable.NameList;
public SabreTools.Models.Nitro.NameListEntry?[]? NameList => _model.NameTable?.NameList;
#endif
#endregion
@@ -689,6 +825,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = FolderAllocationTable[i];
builder.AppendLine($" Folder Allocation Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Start offset: {entry.StartOffset} (0x{entry.StartOffset:X})");
builder.AppendLine($" First file index: {entry.FirstFileIndex} (0x{entry.FirstFileIndex:X})");
if (entry.Unknown == 0xF0)
@@ -724,6 +866,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = NameList[i];
builder.AppendLine($" Name List Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Folder: {entry.Folder} (0x{entry.Folder:X})");
builder.AppendLine($" Name: {entry.Name ?? "[NULL]"}");
if (entry.Folder)
@@ -751,6 +899,12 @@ namespace BinaryObjectScanner.Wrappers
{
var entry = FileAllocationTable[i];
builder.AppendLine($" File Allocation Table Entry {i}");
if (entry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Start offset: {entry.StartOffset} (0x{entry.StartOffset:X})");
builder.AppendLine($" End offset: {entry.EndOffset} (0x{entry.EndOffset:X})");
}

View File

@@ -20,14 +20,22 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
public string? Signature => _model.Header?.Signature;
#endif
/// <inheritdoc cref="Models.PAK.Header.DirectoryOffset"/>
#if NET48
public uint DirectoryOffset => _model.Header.DirectoryOffset;
#else
public uint? DirectoryOffset => _model.Header?.DirectoryOffset;
#endif
/// <inheritdoc cref="Models.PAK.Header.DirectoryLength"/>
#if NET48
public uint DirectoryLength => _model.Header.DirectoryLength;
#else
public uint? DirectoryLength => _model.Header?.DirectoryLength;
#endif
#endregion
@@ -179,6 +187,12 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryItem = DirectoryItems[i];
builder.AppendLine($" Directory Item {i}");
if (directoryItem == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Item name: {directoryItem.ItemName}");
builder.AppendLine($" Item offset: {directoryItem.ItemOffset} (0x{directoryItem.ItemOffset:X})");
builder.AppendLine($" Item length: {directoryItem.ItemLength} (0x{directoryItem.ItemLength:X})");

View File

@@ -17,23 +17,39 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.PFF.Header.HeaderSize"/>
#if NET48
public uint HeaderSize => _model.Header.HeaderSize;
#else
public uint? HeaderSize => _model.Header?.HeaderSize;
#endif
/// <inheritdoc cref="Models.PFF.Header.Signature"/>
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
public string? Signature => _model.Header?.Signature;
#endif
/// <inheritdoc cref="Models.PFF.Header.NumberOfFiles"/>
#if NET48
public uint NumberOfFiles => _model.Header.NumberOfFiles;
#else
public uint? NumberOfFiles => _model.Header?.NumberOfFiles;
#endif
/// <inheritdoc cref="Models.PFF.Header.FileSegmentSize"/>
#if NET48
public uint FileSegmentSize => _model.Header.FileSegmentSize;
#else
public uint? FileSegmentSize => _model.Header?.FileSegmentSize;
#endif
/// <inheritdoc cref="Models.PFF.Header.FileListOffset"/>
#if NET48
public uint FileListOffset => _model.Header.FileListOffset;
#else
public uint? FileListOffset => _model.Header?.FileListOffset;
#endif
#endregion
@@ -51,16 +67,24 @@ namespace BinaryObjectScanner.Wrappers
#region Footer
/// <inheritdoc cref="Models.PFF.Footer.SystemIP"/>
#if NET48
public uint SystemIP => _model.Footer.SystemIP;
#else
public uint? SystemIP => _model.Footer?.SystemIP;
#endif
/// <inheritdoc cref="Models.PFF.Footer.Reserved"/>
#if NET48
public uint Reserved => _model.Footer.Reserved;
#else
public uint? Reserved => _model.Footer?.Reserved;
#endif
/// <inheritdoc cref="Models.PFF.Footer.KingTag"/>
#if NET48
public string KingTag => _model.Footer.KingTag;
#else
public string? KingTag => _model.Footer.KingTag;
public string? KingTag => _model.Footer?.KingTag;
#endif
#endregion
@@ -186,6 +210,8 @@ namespace BinaryObjectScanner.Wrappers
// Get the segment information
var file = Segments[index];
if (file == null)
return false;
// Get the read index and length
int offset = (int)file.FileLocation;
@@ -275,6 +301,12 @@ namespace BinaryObjectScanner.Wrappers
{
var segment = Segments[i];
builder.AppendLine($" Segment {i}");
if (segment == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Deleted: {segment.Deleted} (0x{segment.Deleted:X})");
builder.AppendLine($" File location: {segment.FileLocation} (0x{segment.FileLocation:X})");
builder.AppendLine($" File size: {segment.FileSize} (0x{segment.FileSize:X})");

View File

@@ -18,10 +18,18 @@ namespace BinaryObjectScanner.Wrappers
#region Audio Header
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Signature"/>
#if NET48
public uint Signature => _model.Header.Signature;
#else
public uint? Signature => _model.Header?.Signature;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Version"/>
#if NET48
public uint Version => _model.Header.Version;
#else
public uint? Version => _model.Header?.Version;
#endif
#region V1 Only
@@ -131,73 +139,101 @@ namespace BinaryObjectScanner.Wrappers
#endregion
/// <inheritdoc cref="Models.PlayJ.AudioHeader.TrackLength"/>
#if NET48
public ushort TrackLength => _model.Header.TrackLength;
#else
public ushort? TrackLength => _model.Header?.TrackLength;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Track"/>
#if NET48
public string Track => _model.Header.Track;
#else
public string? Track => _model.Header.Track;
public string? Track => _model.Header?.Track;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.ArtistLength"/>
#if NET48
public ushort ArtistLength => _model.Header.ArtistLength;
#else
public ushort? ArtistLength => _model.Header?.ArtistLength;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Artist"/>
#if NET48
public string Artist => _model.Header.Artist;
#else
public string? Artist => _model.Header.Artist;
public string? Artist => _model.Header?.Artist;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.AlbumLength"/>
#if NET48
public ushort AlbumLength => _model.Header.AlbumLength;
#else
public ushort? AlbumLength => _model.Header?.AlbumLength;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Album"/>
#if NET48
public string Album => _model.Header.Album;
#else
public string? Album => _model.Header.Album;
public string? Album => _model.Header?.Album;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.WriterLength"/>
#if NET48
public ushort WriterLength => _model.Header.WriterLength;
#else
public ushort? WriterLength => _model.Header?.WriterLength;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Writer"/>
#if NET48
public string Writer => _model.Header.Writer;
#else
public string? Writer => _model.Header.Writer;
public string? Writer => _model.Header?.Writer;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.PublisherLength"/>
#if NET48
public ushort PublisherLength => _model.Header.PublisherLength;
#else
public ushort? PublisherLength => _model.Header?.PublisherLength;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Publisher"/>
#if NET48
public string Publisher => _model.Header.Publisher;
#else
public string? Publisher => _model.Header.Publisher;
public string? Publisher => _model.Header?.Publisher;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.LabelLength"/>
#if NET48
public ushort LabelLength => _model.Header.LabelLength;
#else
public ushort? LabelLength => _model.Header?.LabelLength;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Label"/>
#if NET48
public string Label => _model.Header.Label;
#else
public string? Label => _model.Header.Label;
public string? Label => _model.Header?.Label;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.CommentsLength"/>
#if NET48
public ushort CommentsLength => _model.Header.CommentsLength;
#else
public ushort? CommentsLength => _model.Header?.CommentsLength;
#endif
/// <inheritdoc cref="Models.PlayJ.AudioHeader.Comments"/>
#if NET48
public string Comments => _model.Header.Comments;
#else
public string? Comments => _model.Header.Comments;
public string? Comments => _model.Header?.Comments;
#endif
#endregion
@@ -205,13 +241,17 @@ namespace BinaryObjectScanner.Wrappers
#region Unknown Block 1
/// <inheritdoc cref="Models.PlayJ.UnknownBlock1.Length"/>
#if NET48
public uint UB1_Length => _model.UnknownBlock1.Length;
#else
public uint? UB1_Length => _model.UnknownBlock1?.Length;
#endif
/// <inheritdoc cref="Models.PlayJ.UnknownBlock1.Data"/>
#if NET48
public byte[] UB1_Data => _model.UnknownBlock1.Data;
#else
public byte[]? UB1_Data => _model.UnknownBlock1.Data;
public byte[]? UB1_Data => _model.UnknownBlock1?.Data;
#endif
#endregion
@@ -231,7 +271,7 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public byte[] UB3_Data => _model.UnknownBlock3.Data;
#else
public byte[]? UB3_Data => _model.UnknownBlock3.Data;
public byte[]? UB3_Data => _model.UnknownBlock3?.Data;
#endif
#endregion
@@ -491,6 +531,12 @@ namespace BinaryObjectScanner.Wrappers
{
var dataFile = DataFiles[i];
builder.AppendLine($" Data File {i}:");
if (dataFile == null)
{
builder.AppendLine(" [NULL]");
continue;
}
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})");

File diff suppressed because it is too large Load Diff

View File

@@ -20,23 +20,43 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
public string? Signature => _model.Header?.Signature;
#endif
/// <inheritdoc cref="Models.Quantum.Header.MajorVersion"/>
#if NET48
public byte MajorVersion => _model.Header.MajorVersion;
#else
public byte? MajorVersion => _model.Header?.MajorVersion;
#endif
/// <inheritdoc cref="Models.Quantum.Header.MinorVersion"/>
#if NET48
public byte MinorVersion => _model.Header.MinorVersion;
#else
public byte? MinorVersion => _model.Header?.MinorVersion;
#endif
/// <inheritdoc cref="Models.Quantum.Header.FileCount"/>
#if NET48
public ushort FileCount => _model.Header.FileCount;
#else
public ushort? FileCount => _model.Header?.FileCount;
#endif
/// <inheritdoc cref="Models.Quantum.Header.TableSize"/>
#if NET48
public byte TableSize => _model.Header.TableSize;
#else
public byte? TableSize => _model.Header?.TableSize;
#endif
/// <inheritdoc cref="Models.Quantum.Header.CompressionFlags"/>
#if NET48
public byte CompressionFlags => _model.Header.CompressionFlags;
#else
public byte? CompressionFlags => _model.Header?.CompressionFlags;
#endif
#endregion
@@ -302,6 +322,12 @@ namespace BinaryObjectScanner.Wrappers
{
var fileDescriptor = FileList[i];
builder.AppendLine($" File Descriptor {i}");
if (fileDescriptor == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" File name size: {fileDescriptor.FileNameSize} (0x{fileDescriptor.FileNameSize:X})");
builder.AppendLine($" File name: {fileDescriptor.FileName ?? "[NULL]"}");
builder.AppendLine($" Comment field size: {fileDescriptor.CommentFieldSize} (0x{fileDescriptor.CommentFieldSize:X})");

View File

@@ -24,14 +24,22 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
public string? Signature => _model.Header?.Signature;
#endif
/// <inheritdoc cref="Models.SGA.Header4.MajorVersion"/>
#if NET48
public ushort MajorVersion => _model.Header.MajorVersion;
#else
public ushort? MajorVersion => _model.Header?.MajorVersion;
#endif
/// <inheritdoc cref="Models.SGA.Header4.MinorVersion"/>
#if NET48
public ushort MinorVersion => _model.Header.MinorVersion;
#else
public ushort? MinorVersion => _model.Header?.MinorVersion;
#endif
/// <inheritdoc cref="Models.SGA.Header4.FileMD5"/>
#if NET48
@@ -44,8 +52,8 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Header as SabreTools.Models.SGA.Header4).FileMD5;
case 5: return (_model.Header as SabreTools.Models.SGA.Header4).FileMD5;
case 4: return (_model.Header as SabreTools.Models.SGA.Header4)?.FileMD5;
case 5: return (_model.Header as SabreTools.Models.SGA.Header4)?.FileMD5;
default: return null;
};
}
@@ -62,10 +70,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Header as SabreTools.Models.SGA.Header4).Name;
case 5: return (_model.Header as SabreTools.Models.SGA.Header4).Name;
case 6: return (_model.Header as SabreTools.Models.SGA.Header6).Name;
case 7: return (_model.Header as SabreTools.Models.SGA.Header6).Name;
case 4: return (_model.Header as SabreTools.Models.SGA.Header4)?.Name;
case 5: return (_model.Header as SabreTools.Models.SGA.Header4)?.Name;
case 6: return (_model.Header as SabreTools.Models.SGA.Header6)?.Name;
case 7: return (_model.Header as SabreTools.Models.SGA.Header6)?.Name;
default: return null;
};
}
@@ -82,8 +90,8 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Header as SabreTools.Models.SGA.Header4).HeaderMD5;
case 5: return (_model.Header as SabreTools.Models.SGA.Header4).HeaderMD5;
case 4: return (_model.Header as SabreTools.Models.SGA.Header4)?.HeaderMD5;
case 5: return (_model.Header as SabreTools.Models.SGA.Header4)?.HeaderMD5;
default: return null;
};
}
@@ -96,10 +104,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Header as SabreTools.Models.SGA.Header4).HeaderLength;
case 5: return (_model.Header as SabreTools.Models.SGA.Header4).HeaderLength;
case 6: return (_model.Header as SabreTools.Models.SGA.Header6).HeaderLength;
case 7: return (_model.Header as SabreTools.Models.SGA.Header6).HeaderLength;
case 4: return (_model.Header as SabreTools.Models.SGA.Header4)?.HeaderLength;
case 5: return (_model.Header as SabreTools.Models.SGA.Header4)?.HeaderLength;
case 6: return (_model.Header as SabreTools.Models.SGA.Header6)?.HeaderLength;
case 7: return (_model.Header as SabreTools.Models.SGA.Header6)?.HeaderLength;
default: return null;
};
}
@@ -112,10 +120,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Header as SabreTools.Models.SGA.Header4).FileDataOffset;
case 5: return (_model.Header as SabreTools.Models.SGA.Header4).FileDataOffset;
case 6: return (_model.Header as SabreTools.Models.SGA.Header6).FileDataOffset;
case 7: return (_model.Header as SabreTools.Models.SGA.Header6).FileDataOffset;
case 4: return (_model.Header as SabreTools.Models.SGA.Header4)?.FileDataOffset;
case 5: return (_model.Header as SabreTools.Models.SGA.Header4)?.FileDataOffset;
case 6: return (_model.Header as SabreTools.Models.SGA.Header6)?.FileDataOffset;
case 7: return (_model.Header as SabreTools.Models.SGA.Header6)?.FileDataOffset;
default: return null;
};
}
@@ -128,10 +136,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Header as SabreTools.Models.SGA.Header4).Dummy0;
case 5: return (_model.Header as SabreTools.Models.SGA.Header4).Dummy0;
case 6: return (_model.Header as SabreTools.Models.SGA.Header6).Dummy0;
case 7: return (_model.Header as SabreTools.Models.SGA.Header6).Dummy0;
case 4: return (_model.Header as SabreTools.Models.SGA.Header4)?.Dummy0;
case 5: return (_model.Header as SabreTools.Models.SGA.Header4)?.Dummy0;
case 6: return (_model.Header as SabreTools.Models.SGA.Header6)?.Dummy0;
case 7: return (_model.Header as SabreTools.Models.SGA.Header6)?.Dummy0;
default: return null;
};
}
@@ -150,10 +158,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.SectionOffset;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.SectionOffset;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.SectionOffset;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.SectionOffset;
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4)?.DirectoryHeader?.SectionOffset;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5)?.DirectoryHeader?.SectionOffset;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6)?.DirectoryHeader?.SectionOffset;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7)?.DirectoryHeader?.SectionOffset;
default: return null;
};
}
@@ -166,10 +174,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.SectionCount;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.SectionCount;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.SectionCount;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.SectionCount;
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4)?.DirectoryHeader?.SectionCount;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5)?.DirectoryHeader?.SectionCount;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6)?.DirectoryHeader?.SectionCount;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7)?.DirectoryHeader?.SectionCount;
default: return null;
};
}
@@ -182,10 +190,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.FolderOffset;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.FolderOffset;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.FolderOffset;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.FolderOffset;
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4)?.DirectoryHeader?.FolderOffset;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5)?.DirectoryHeader?.FolderOffset;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6)?.DirectoryHeader?.FolderOffset;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7)?.DirectoryHeader?.FolderOffset;
default: return null;
};
}
@@ -198,10 +206,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.FolderCount;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.FolderCount;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.FolderCount;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.FolderCount;
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4)?.DirectoryHeader?.FolderCount;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5)?.DirectoryHeader?.FolderCount;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6)?.DirectoryHeader?.FolderCount;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7)?.DirectoryHeader?.FolderCount;
default: return null;
};
}
@@ -214,10 +222,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.FileOffset;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.FileOffset;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.FileOffset;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.FileOffset;
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4)?.DirectoryHeader?.FileOffset;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5)?.DirectoryHeader?.FileOffset;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6)?.DirectoryHeader?.FileOffset;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7)?.DirectoryHeader?.FileOffset;
default: return null;
};
}
@@ -230,10 +238,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.FileCount;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.FileCount;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.FileCount;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.FileCount;
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4)?.DirectoryHeader?.FileCount;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5)?.DirectoryHeader?.FileCount;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6)?.DirectoryHeader?.FileCount;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7)?.DirectoryHeader?.FileCount;
default: return null;
};
}
@@ -246,10 +254,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.StringTableOffset;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.StringTableOffset;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.StringTableOffset;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.StringTableOffset;
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4)?.DirectoryHeader?.StringTableOffset;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5)?.DirectoryHeader?.StringTableOffset;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6)?.DirectoryHeader?.StringTableOffset;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7)?.DirectoryHeader?.StringTableOffset;
default: return null;
};
}
@@ -262,10 +270,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).DirectoryHeader.StringTableCount;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).DirectoryHeader.StringTableCount;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).DirectoryHeader.StringTableCount;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.StringTableCount;
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4)?.DirectoryHeader?.StringTableCount;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5)?.DirectoryHeader?.StringTableCount;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6)?.DirectoryHeader?.StringTableCount;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7)?.DirectoryHeader?.StringTableCount;
default: return null;
};
}
@@ -278,7 +286,7 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.HashTableOffset;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7)?.DirectoryHeader?.HashTableOffset;
default: return null;
};
}
@@ -291,7 +299,7 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).DirectoryHeader.BlockSize;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7)?.DirectoryHeader?.BlockSize;
default: return null;
};
}
@@ -312,10 +320,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).Sections;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).Sections;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).Sections;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).Sections;
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4)?.Sections;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5)?.Sections;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6)?.Sections;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7)?.Sections;
default: return null;
};
}
@@ -336,10 +344,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).Folders;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).Folders;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).Folders;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).Folders;
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4)?.Folders;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5)?.Folders;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6)?.Folders;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7)?.Folders;
default: return null;
};
}
@@ -360,10 +368,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4).Files;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5).Files;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6).Files;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7).Files;
case 4: return (_model.Directory as SabreTools.Models.SGA.Directory4)?.Files;
case 5: return (_model.Directory as SabreTools.Models.SGA.Directory5)?.Files;
case 6: return (_model.Directory as SabreTools.Models.SGA.Directory6)?.Files;
case 7: return (_model.Directory as SabreTools.Models.SGA.Directory7)?.Files;
default: return null;
};
}
@@ -550,6 +558,12 @@ namespace BinaryObjectScanner.Wrappers
{
case 4:
var section4 = Sections[i] as SabreTools.Models.SGA.Section4;
if (section4 == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Alias: {section4.Alias ?? "[NULL]"}");
builder.AppendLine($" Name: {section4.Name ?? "[NULL]"}");
builder.AppendLine($" Folder start index: {section4.FolderStartIndex} (0x{section4.FolderStartIndex:X})");
@@ -563,6 +577,12 @@ namespace BinaryObjectScanner.Wrappers
case 6:
case 7:
var section5 = Sections[i] as SabreTools.Models.SGA.Section5;
if (section5 == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Alias: {section5.Alias ?? "[NULL]"}");
builder.AppendLine($" Name: {section5.Name ?? "[NULL]"}");
builder.AppendLine($" Folder start index: {section5.FolderStartIndex} (0x{section5.FolderStartIndex:X})");
@@ -601,6 +621,12 @@ namespace BinaryObjectScanner.Wrappers
{
case 4:
var folder4 = Folders[i] as SabreTools.Models.SGA.Folder4;
if (folder4 == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Name offset: {folder4.NameOffset} (0x{folder4.NameOffset:X})");
builder.AppendLine($" Name: {folder4.Name ?? "[NULL]"}");
builder.AppendLine($" Folder start index: {folder4.FolderStartIndex} (0x{folder4.FolderStartIndex:X})");
@@ -613,6 +639,12 @@ namespace BinaryObjectScanner.Wrappers
case 6:
case 7:
var folder5 = Folders[i] as SabreTools.Models.SGA.Folder5;
if (folder5 == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Name offset: {folder5.NameOffset} (0x{folder5.NameOffset:X})");
builder.AppendLine($" Name: {folder5.Name ?? "[NULL]"}");
builder.AppendLine($" Folder start index: {folder5.FolderStartIndex} (0x{folder5.FolderStartIndex:X})");
@@ -651,6 +683,12 @@ namespace BinaryObjectScanner.Wrappers
case 4:
case 5:
var file4 = Files[i] as SabreTools.Models.SGA.File4;
if (file4 == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Name offset: {file4.NameOffset} (0x{file4.NameOffset:X})");
builder.AppendLine($" Name: {file4.Name ?? "[NULL]"}");
builder.AppendLine($" Offset: {file4.Offset} (0x{file4.Offset:X})");
@@ -663,6 +701,12 @@ namespace BinaryObjectScanner.Wrappers
case 6:
var file6 = Files[i] as SabreTools.Models.SGA.File6;
if (file6 == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Name offset: {file6.NameOffset} (0x{file6.NameOffset:X})");
builder.AppendLine($" Name: {file6.Name ?? "[NULL]"}");
builder.AppendLine($" Offset: {file6.Offset} (0x{file6.Offset:X})");
@@ -675,6 +719,12 @@ namespace BinaryObjectScanner.Wrappers
break;
case 7:
var file7 = Files[i] as SabreTools.Models.SGA.File7;
if (file7 == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Name offset: {file7.NameOffset} (0x{file7.NameOffset:X})");
builder.AppendLine($" Name: {file7.Name ?? "[NULL]"}");
builder.AppendLine($" Offset: {file7.Offset} (0x{file7.Offset:X})");
@@ -757,9 +807,9 @@ namespace BinaryObjectScanner.Wrappers
switch (MajorVersion)
{
case 4:
case 5: filename = (file as SabreTools.Models.SGA.File4).Name; break;
case 6: filename = (file as SabreTools.Models.SGA.File6).Name; break;
case 7: filename = (file as SabreTools.Models.SGA.File7).Name; break;
case 5: filename = (file as SabreTools.Models.SGA.File4)?.Name; break;
case 6: filename = (file as SabreTools.Models.SGA.File6)?.Name; break;
case 7: filename = (file as SabreTools.Models.SGA.File7)?.Name; break;
default: return false;
}
@@ -790,10 +840,10 @@ namespace BinaryObjectScanner.Wrappers
{
switch (MajorVersion)
{
case 4: parentNames.Add((folder as SabreTools.Models.SGA.Folder4).Name); break;
case 4: parentNames.Add((folder as SabreTools.Models.SGA.Folder4)?.Name); break;
case 5:
case 6:
case 7: parentNames.Add((folder as SabreTools.Models.SGA.Folder5).Name); break;
case 7: parentNames.Add((folder as SabreTools.Models.SGA.Folder5)?.Name); break;
default: return false;
}
}
@@ -809,9 +859,9 @@ namespace BinaryObjectScanner.Wrappers
switch (MajorVersion)
{
case 4:
case 5: fileOffset = (file as SabreTools.Models.SGA.File4).Offset; break;
case 6: fileOffset = (file as SabreTools.Models.SGA.File6).Offset; break;
case 7: fileOffset = (file as SabreTools.Models.SGA.File7).Offset; break;
case 5: fileOffset = (file as SabreTools.Models.SGA.File4)?.Offset ?? 0; break;
case 6: fileOffset = (file as SabreTools.Models.SGA.File6)?.Offset ?? 0; break;
case 7: fileOffset = (file as SabreTools.Models.SGA.File7)?.Offset ?? 0; break;
default: return false;
}
@@ -824,16 +874,16 @@ namespace BinaryObjectScanner.Wrappers
{
case 4:
case 5:
fileSize = (file as SabreTools.Models.SGA.File4).SizeOnDisk;
outputFileSize = (file as SabreTools.Models.SGA.File4).Size;
fileSize = (file as SabreTools.Models.SGA.File4)?.SizeOnDisk ?? 0;
outputFileSize = (file as SabreTools.Models.SGA.File4)?.Size ?? 0;
break;
case 6:
fileSize = (file as SabreTools.Models.SGA.File6).SizeOnDisk;
outputFileSize = (file as SabreTools.Models.SGA.File6).Size;
fileSize = (file as SabreTools.Models.SGA.File6)?.SizeOnDisk ?? 0;
outputFileSize = (file as SabreTools.Models.SGA.File6)?.Size ?? 0;
break;
case 7:
fileSize = (file as SabreTools.Models.SGA.File7).SizeOnDisk;
outputFileSize = (file as SabreTools.Models.SGA.File7).Size;
fileSize = (file as SabreTools.Models.SGA.File7)?.SizeOnDisk ?? 0;
outputFileSize = (file as SabreTools.Models.SGA.File7)?.Size ?? 0;
break;
default: return false;
}

View File

@@ -19,21 +19,29 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
public string? Signature => _model.Header?.Signature;
#endif
/// <inheritdoc cref="Models.VBSP.Header.Version"/>
#if NET48
public int Version => _model.Header.Version;
#else
public int? Version => _model.Header?.Version;
#endif
/// <inheritdoc cref="Models.VBSP.File.Lumps"/>
#if NET48
public SabreTools.Models.VBSP.Lump[] Lumps => _model.Header.Lumps;
#else
public SabreTools.Models.VBSP.Lump?[]? Lumps => _model.Header.Lumps;
public SabreTools.Models.VBSP.Lump?[]? Lumps => _model.Header?.Lumps;
#endif
/// <inheritdoc cref="Models.VBSP.Header.MapRevision"/>
#if NET48
public int MapRevision => _model.Header.MapRevision;
#else
public int? MapRevision => _model.Header?.MapRevision;
#endif
#endregion
@@ -185,6 +193,12 @@ namespace BinaryObjectScanner.Wrappers
}
builder.AppendLine($" Lump {i}{specialLumpName}");
if (lump == null)
{
builder.AppendLine(" [NULL]");
continue;
}
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})");

View File

@@ -21,13 +21,25 @@ namespace BinaryObjectScanner.Wrappers
#region Header
/// <inheritdoc cref="Models.VPK.Header.Signature"/>
#if NET48
public uint Signature => _model.Header.Signature;
#else
public uint? Signature => _model.Header?.Signature;
#endif
/// <inheritdoc cref="Models.VPK.Header.Version"/>
#if NET48
public uint Version => _model.Header.Version;
#else
public uint? Version => _model.Header?.Version;
#endif
/// <inheritdoc cref="Models.VPK.Header.DirectoryLength"/>
#if NET48
public uint DirectoryLength => _model.Header.DirectoryLength;
#else
public uint? DirectoryLength => _model.Header?.DirectoryLength;
#endif
#endregion
@@ -112,8 +124,8 @@ namespace BinaryObjectScanner.Wrappers
int archiveCount = DirectoryItems == null
? 0
: DirectoryItems
.Select(di => di.DirectoryEntry)
.Select(de => de.ArchiveIndex)
.Select(di => di?.DirectoryEntry)
.Select(de => de?.ArchiveIndex ?? 0)
.Where(ai => ai != HL_VPK_NO_ARCHIVE)
.Max();
@@ -297,6 +309,12 @@ namespace BinaryObjectScanner.Wrappers
{
var archiveHash = ArchiveHashes[i];
builder.AppendLine($" Archive Hash {i}");
if (archiveHash == null)
{
builder.AppendLine(" [NULL]");
continue;
}
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})");

View File

@@ -20,14 +20,22 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
public string? Signature => _model.Header?.Signature;
#endif
/// <inheritdoc cref="Models.WAD.Header.LumpCount"/>
#if NET48
public uint LumpCount => _model.Header.LumpCount;
#else
public uint? LumpCount => _model.Header?.LumpCount;
#endif
/// <inheritdoc cref="Models.WAD.Header.LumpOffset"/>
#if NET48
public uint LumpOffset => _model.Header.LumpOffset;
#else
public uint? LumpOffset => _model.Header?.LumpOffset;
#endif
#endregion
@@ -191,6 +199,12 @@ namespace BinaryObjectScanner.Wrappers
{
var lump = Lumps[i];
builder.AppendLine($" Lump {i}");
if (lump == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Offset: {lump.Offset} (0x{lump.Offset:X})");
builder.AppendLine($" Disk length: {lump.DiskLength} (0x{lump.DiskLength:X})");
builder.AppendLine($" Length: {lump.Length} (0x{lump.Length:X})");

View File

@@ -172,10 +172,18 @@ namespace BinaryObjectScanner.Wrappers
switch (_dataSource)
{
case DataSource.ByteArray:
#if NET48
return _byteArrayOffset + position + length <= _byteArrayData.Length;
#else
return _byteArrayOffset + position + length <= _byteArrayData!.Length;
#endif
case DataSource.Stream:
#if NET48
return position + length <= _streamData.Length;
#else
return position + length <= _streamData!.Length;
#endif
// Everything else is invalid
case DataSource.UNKNOWN:
@@ -222,7 +230,11 @@ namespace BinaryObjectScanner.Wrappers
break;
case DataSource.Stream:
#if NET48
long currentLocation = _streamData.Position;
#else
long currentLocation = _streamData!.Position;
#endif
_streamData.Seek(position, SeekOrigin.Begin);
sectionData = _streamData.ReadBytes(length);
_streamData.Seek(currentLocation, SeekOrigin.Begin);
@@ -356,10 +368,18 @@ namespace BinaryObjectScanner.Wrappers
switch (_dataSource)
{
case DataSource.ByteArray:
#if NET48
return _byteArrayData.Length - _byteArrayOffset;
#else
return _byteArrayData!.Length - _byteArrayOffset;
#endif
case DataSource.Stream:
#if NET48
return (int)_streamData.Length;
#else
return (int)_streamData!.Length;
#endif
case DataSource.UNKNOWN:
default:
@@ -377,12 +397,10 @@ namespace BinaryObjectScanner.Wrappers
public abstract StringBuilder PrettyPrint();
#if NET6_0_OR_GREATER
/// <summary>
/// Export the item information as JSON
/// </summary>
public abstract string ExportJSON();
#endif
#endregion

View File

@@ -70,21 +70,44 @@ namespace BinaryObjectScanner.Wrappers
public static IWrapper? CreateExecutableWrapper(Stream? stream)
#endif
{
// If we have no stream
if (stream == null)
return null;
// Try to get an MS-DOS wrapper first
#if NET48
IWrapper wrapper = MSDOS.Create(stream);
if (wrapper == null)
#else
IWrapper? wrapper = MSDOS.Create(stream);
#endif
if (wrapper == null || !(wrapper is MSDOS msdos))
return null;
// Check for a valid new executable address
if ((wrapper as MSDOS).NewExeHeaderAddr >= stream.Length)
#if NET48
if (msdos.NewExeHeaderAddr >= stream.Length)
#else
if (msdos.NewExeHeaderAddr == null || msdos.NewExeHeaderAddr >= stream.Length)
#endif
return wrapper;
// Try to read the executable info
stream.Seek((wrapper as MSDOS).NewExeHeaderAddr, SeekOrigin.Begin);
#if NET48
stream.Seek(msdos.NewExeHeaderAddr, SeekOrigin.Begin);
byte[] magic = stream.ReadBytes(4);
#else
stream.Seek(msdos.NewExeHeaderAddr.Value, SeekOrigin.Begin);
byte[]? magic = stream.ReadBytes(4);
#endif
// If we didn't get valid data at the offset
if (magic == null)
{
return wrapper;
}
// New Executable
if (magic.StartsWith(SabreTools.Models.NewExecutable.Constants.SignatureBytes))
else if (magic.StartsWith(SabreTools.Models.NewExecutable.Constants.SignatureBytes))
{
stream.Seek(0, SeekOrigin.Begin);
return NewExecutable.Create(stream);

View File

@@ -21,32 +21,64 @@ namespace BinaryObjectScanner.Wrappers
#if NET48
public string Signature => _model.Header.Signature;
#else
public string? Signature => _model.Header.Signature;
public string? Signature => _model.Header?.Signature;
#endif
/// <inheritdoc cref="Models.XZP.Header.Version"/>
#if NET48
public uint Version => _model.Header.Version;
#else
public uint? Version => _model.Header?.Version;
#endif
/// <inheritdoc cref="Models.XZP.Header.PreloadDirectoryEntryCount"/>
#if NET48
public uint PreloadDirectoryEntryCount => _model.Header.PreloadDirectoryEntryCount;
#else
public uint? PreloadDirectoryEntryCount => _model.Header?.PreloadDirectoryEntryCount;
#endif
/// <inheritdoc cref="Models.XZP.Header.DirectoryEntryCount"/>
#if NET48
public uint DirectoryEntryCount => _model.Header.DirectoryEntryCount;
#else
public uint? DirectoryEntryCount => _model.Header?.DirectoryEntryCount;
#endif
/// <inheritdoc cref="Models.XZP.Header.PreloadBytes"/>
#if NET48
public uint PreloadBytes => _model.Header.PreloadBytes;
#else
public uint? PreloadBytes => _model.Header?.PreloadBytes;
#endif
/// <inheritdoc cref="Models.XZP.Header.HeaderLength"/>
#if NET48
public uint HeaderLength => _model.Header.HeaderLength;
#else
public uint? HeaderLength => _model.Header?.HeaderLength;
#endif
/// <inheritdoc cref="Models.XZP.Header.DirectoryItemCount"/>
#if NET48
public uint DirectoryItemCount => _model.Header.DirectoryItemCount;
#else
public uint? DirectoryItemCount => _model.Header?.DirectoryItemCount;
#endif
/// <inheritdoc cref="Models.XZP.Header.DirectoryItemOffset"/>
#if NET48
public uint DirectoryItemOffset => _model.Header.DirectoryItemOffset;
#else
public uint? DirectoryItemOffset => _model.Header?.DirectoryItemOffset;
#endif
/// <inheritdoc cref="Models.XZP.Header.DirectoryItemLength"/>
#if NET48
public uint DirectoryItemLength => _model.Header.DirectoryItemLength;
#else
public uint? DirectoryItemLength => _model.Header?.DirectoryItemLength;
#endif
#endregion
@@ -97,13 +129,17 @@ namespace BinaryObjectScanner.Wrappers
#region Footer
/// <inheritdoc cref="Models.XZP.Footer.FileLength"/>
#if NET48
public uint F_FileLength => _model.Footer.FileLength;
#else
public uint? F_FileLength => _model.Footer?.FileLength;
#endif
/// <inheritdoc cref="Models.XZP.Footer.Signature"/>
#if NET48
public string F_Signature => _model.Footer.Signature;
#else
public string? F_Signature => _model.Footer.Signature;
public string? F_Signature => _model.Footer?.Signature;
#endif
#endregion
@@ -255,6 +291,12 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryEntry = DirectoryEntries[i];
builder.AppendLine($" Directory Entry {i}");
if (directoryEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" File name CRC: {directoryEntry.FileNameCRC} (0x{directoryEntry.FileNameCRC:X})");
builder.AppendLine($" Entry length: {directoryEntry.EntryLength} (0x{directoryEntry.EntryLength:X})");
builder.AppendLine($" Entry offset: {directoryEntry.EntryOffset} (0x{directoryEntry.EntryOffset:X})");
@@ -281,6 +323,12 @@ namespace BinaryObjectScanner.Wrappers
{
var preloadDirectoryEntry = PreloadDirectoryEntries[i];
builder.AppendLine($" Directory Entry {i}");
if (preloadDirectoryEntry == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" File name CRC: {preloadDirectoryEntry.FileNameCRC} (0x{preloadDirectoryEntry.FileNameCRC:X})");
builder.AppendLine($" Entry length: {preloadDirectoryEntry.EntryLength} (0x{preloadDirectoryEntry.EntryLength:X})");
builder.AppendLine($" Entry offset: {preloadDirectoryEntry.EntryOffset} (0x{preloadDirectoryEntry.EntryOffset:X})");
@@ -307,6 +355,12 @@ namespace BinaryObjectScanner.Wrappers
{
var preloadDirectoryMapping = PreloadDirectoryMappings[i];
builder.AppendLine($" Directory Mapping {i}");
if (preloadDirectoryMapping == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" Preload directory entry index: {preloadDirectoryMapping.PreloadDirectoryEntryIndex} (0x{preloadDirectoryMapping.PreloadDirectoryEntryIndex:X})");
}
}
@@ -331,6 +385,12 @@ namespace BinaryObjectScanner.Wrappers
{
var directoryItem = DirectoryItems[i];
builder.AppendLine($" Directory Item {i}");
if (directoryItem == null)
{
builder.AppendLine(" [NULL]");
continue;
}
builder.AppendLine($" File name CRC: {directoryItem.FileNameCRC} (0x{directoryItem.FileNameCRC:X})");
builder.AppendLine($" Name offset: {directoryItem.NameOffset} (0x{directoryItem.NameOffset:X})");
builder.AppendLine($" Name: {directoryItem.Name ?? "[NULL]"}");
@@ -411,7 +471,7 @@ namespace BinaryObjectScanner.Wrappers
return false;
// Get the associated directory item
var directoryItem = DirectoryItems.Where(di => di.FileNameCRC == directoryEntry.FileNameCRC).FirstOrDefault();
var directoryItem = DirectoryItems.Where(di => di?.FileNameCRC == directoryEntry.FileNameCRC).FirstOrDefault();
if (directoryItem == null)
return false;