From bf6f3bad4617f06924791c739bc42722bfbe5e20 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sat, 7 Jan 2023 22:33:55 -0800 Subject: [PATCH] Print extended headers --- BurnOutSharp.Builders/N3DS.cs | 4 +- BurnOutSharp.Models/N3DS/Cart.cs | 2 +- BurnOutSharp.Wrappers/N3DS.cs | 133 +++++++++++++++++++++++++++++++ 3 files changed, 136 insertions(+), 3 deletions(-) diff --git a/BurnOutSharp.Builders/N3DS.cs b/BurnOutSharp.Builders/N3DS.cs index ce0188db..1066490a 100644 --- a/BurnOutSharp.Builders/N3DS.cs +++ b/BurnOutSharp.Builders/N3DS.cs @@ -109,7 +109,7 @@ namespace BurnOutSharp.Builders #region Extended Headers // Create the extended header table - cart.NCCHExtendedHeaders = new NCCHExtendedHeader[8]; + cart.ExtendedHeaders = new NCCHExtendedHeader[8]; // Iterate and build the extended headers for (int i = 0; i < 8; i++) @@ -128,7 +128,7 @@ namespace BurnOutSharp.Builders data.Seek(offset, SeekOrigin.Begin); // Parse the extended header - cart.NCCHExtendedHeaders[i] = ParseNCCHExtendedHeader(data); + cart.ExtendedHeaders[i] = ParseNCCHExtendedHeader(data); } #endregion diff --git a/BurnOutSharp.Models/N3DS/Cart.cs b/BurnOutSharp.Models/N3DS/Cart.cs index 57c9752f..d1b2ffde 100644 --- a/BurnOutSharp.Models/N3DS/Cart.cs +++ b/BurnOutSharp.Models/N3DS/Cart.cs @@ -28,6 +28,6 @@ namespace BurnOutSharp.Models.N3DS /// /// NCCH extended headers /// - public NCCHExtendedHeader[] NCCHExtendedHeaders { get; set; } + public NCCHExtendedHeader[] ExtendedHeaders { get; set; } } } \ No newline at end of file diff --git a/BurnOutSharp.Wrappers/N3DS.cs b/BurnOutSharp.Wrappers/N3DS.cs index 64977ab9..2f7c18d9 100644 --- a/BurnOutSharp.Wrappers/N3DS.cs +++ b/BurnOutSharp.Wrappers/N3DS.cs @@ -190,6 +190,13 @@ namespace BurnOutSharp.Wrappers #endregion + #region Extended Headers + + /// + public Models.N3DS.NCCHExtendedHeader[] ExtendedHeaders => _cart.ExtendedHeaders; + + #endregion + #endregion #region Instance Variables @@ -268,6 +275,7 @@ namespace BurnOutSharp.Wrappers PrintCardInfoHeader(); PrintDevelopmentCardInfoHeader(); PrintPartitions(); + PrintExtendedHeaders(); } /// @@ -499,6 +507,131 @@ namespace BurnOutSharp.Wrappers Console.WriteLine(); } + /// + /// Print NCCH extended header information + /// + private void PrintExtendedHeaders() + { + Console.WriteLine(" NCCH Extended Header Information:"); + Console.WriteLine(" -------------------------"); + if (ExtendedHeaders == null || ExtendedHeaders.Length == 0) + { + Console.WriteLine(" No NCCH extended headers"); + } + else + { + for (int i = 0; i < ExtendedHeaders.Length; i++) + { + var extendedHeader = ExtendedHeaders[i]; + Console.WriteLine($" NCCH Extended Header {i}"); + if (extendedHeader == null) + { + Console.WriteLine($" Unrecognized partition data, no data can be parsed"); + } + else + { + Console.WriteLine($" System control info:"); + Console.WriteLine($" Application title: {extendedHeader.SCI.ApplicationTitle}"); + Console.WriteLine($" Reserved 1: {BitConverter.ToString(extendedHeader.SCI.Reserved1).Replace('-', ' ')}"); + Console.WriteLine($" Flag: {extendedHeader.SCI.Flag}"); + Console.WriteLine($" Remaster version: {extendedHeader.SCI.RemasterVersion}"); + + Console.WriteLine($" Text code set info:"); + Console.WriteLine($" Address: {extendedHeader.SCI.TextCodeSetInfo.Address}"); + Console.WriteLine($" Physical region size (in page-multiples): {extendedHeader.SCI.TextCodeSetInfo.PhysicalRegionSizeInPages}"); + Console.WriteLine($" Size (in bytes): {extendedHeader.SCI.TextCodeSetInfo.SizeInBytes}"); + + Console.WriteLine($" Stack size: {extendedHeader.SCI.StackSize}"); + + Console.WriteLine($" Read-only code set info:"); + Console.WriteLine($" Address: {extendedHeader.SCI.ReadOnlyCodeSetInfo.Address}"); + Console.WriteLine($" Physical region size (in page-multiples): {extendedHeader.SCI.ReadOnlyCodeSetInfo.PhysicalRegionSizeInPages}"); + Console.WriteLine($" Size (in bytes): {extendedHeader.SCI.ReadOnlyCodeSetInfo.SizeInBytes}"); + + Console.WriteLine($" Reserved 2: {BitConverter.ToString(extendedHeader.SCI.Reserved2).Replace('-', newChar: ' ')}"); + + Console.WriteLine($" Data code set info:"); + Console.WriteLine($" Address: {extendedHeader.SCI.DataCodeSetInfo.Address}"); + Console.WriteLine($" Physical region size (in page-multiples): {extendedHeader.SCI.DataCodeSetInfo.PhysicalRegionSizeInPages}"); + Console.WriteLine($" Size (in bytes): {extendedHeader.SCI.DataCodeSetInfo.SizeInBytes}"); + + Console.WriteLine($" BSS size: {extendedHeader.SCI.BSSSize}"); + Console.WriteLine($" Dependency module list: {string.Join(", ", extendedHeader.SCI.DependencyModuleList)}"); + + Console.WriteLine($" System info:"); + Console.WriteLine($" SaveData size: {extendedHeader.SCI.SystemInfo.SaveDataSize}"); + Console.WriteLine($" Jump ID: {extendedHeader.SCI.SystemInfo.JumpID}"); + Console.WriteLine($" Reserved: {BitConverter.ToString(extendedHeader.SCI.SystemInfo.Reserved).Replace('-', newChar: ' ')}"); + + Console.WriteLine($" Access control info:"); + Console.WriteLine($" ARM11 local system capabilities:"); + Console.WriteLine($" Program ID: {extendedHeader.ACI.ARM11LocalSystemCapabilities.ProgramID}"); + Console.WriteLine($" Core version: {extendedHeader.ACI.ARM11LocalSystemCapabilities.CoreVersion}"); + Console.WriteLine($" Flag 1: {extendedHeader.ACI.ARM11LocalSystemCapabilities.Flag1}"); + Console.WriteLine($" Flag 2: {extendedHeader.ACI.ARM11LocalSystemCapabilities.Flag2}"); + Console.WriteLine($" Flag 0: {extendedHeader.ACI.ARM11LocalSystemCapabilities.Flag0}"); + Console.WriteLine($" Priority: {extendedHeader.ACI.ARM11LocalSystemCapabilities.Priority}"); + Console.WriteLine($" Resource limit descriptors: {string.Join(", ", extendedHeader.ACI.ARM11LocalSystemCapabilities.ResourceLimitDescriptors)}"); + + Console.WriteLine($" Storage info:"); + Console.WriteLine($" Extdata ID: {extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.ExtdataID}"); + Console.WriteLine($" System savedata IDs: {BitConverter.ToString(extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.SystemSavedataIDs).Replace('-', newChar: ' ')}"); + Console.WriteLine($" Storage accessible unique IDs: {BitConverter.ToString(extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.StorageAccessibleUniqueIDs).Replace('-', newChar: ' ')}"); + Console.WriteLine($" File system access info: {BitConverter.ToString(extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.FileSystemAccessInfo).Replace('-', newChar: ' ')}"); + Console.WriteLine($" Other attributes: {extendedHeader.ACI.ARM11LocalSystemCapabilities.StorageInfo.OtherAttributes}"); + + Console.WriteLine($" Service access control: {string.Join(", ", extendedHeader.ACI.ARM11LocalSystemCapabilities.ServiceAccessControl)}"); + Console.WriteLine($" Extended service access control: {string.Join(", ", extendedHeader.ACI.ARM11LocalSystemCapabilities.ExtendedServiceAccessControl)}"); + Console.WriteLine($" Reserved: {BitConverter.ToString(extendedHeader.ACI.ARM11LocalSystemCapabilities.Reserved).Replace('-', newChar: ' ')}"); + Console.WriteLine($" Resource limit cateogry: {extendedHeader.ACI.ARM11LocalSystemCapabilities.ResourceLimitCategory}"); + + Console.WriteLine($" ARM11 kernel capabilities:"); + Console.WriteLine($" Descriptors: {string.Join(", ", extendedHeader.ACI.ARM11KernelCapabilities.Descriptors)}"); + Console.WriteLine($" Reserved: {BitConverter.ToString(extendedHeader.ACI.ARM11KernelCapabilities.Reserved).Replace('-', newChar: ' ')}"); + + Console.WriteLine($" ARM9 access control:"); + Console.WriteLine($" Descriptors: {BitConverter.ToString(extendedHeader.ACI.ARM9AccessControl.Descriptors).Replace('-', newChar: ' ')}"); + Console.WriteLine($" Descriptor version: {extendedHeader.ACI.ARM9AccessControl.DescriptorVersion}"); + + Console.WriteLine($" AccessDec signature (RSA-2048-SHA256): {BitConverter.ToString(extendedHeader.AccessDescSignature).Replace('-', ' ')}"); + Console.WriteLine($" NCCH HDR RSA-2048 public key: {BitConverter.ToString(extendedHeader.NCCHHDRPublicKey).Replace('-', ' ')}"); + + + Console.WriteLine($" Access control info (for limitations of first ACI):"); + Console.WriteLine($" ARM11 local system capabilities:"); + Console.WriteLine($" Program ID: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ProgramID}"); + Console.WriteLine($" Core version: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.CoreVersion}"); + Console.WriteLine($" Flag 1: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Flag1}"); + Console.WriteLine($" Flag 2: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Flag2}"); + Console.WriteLine($" Flag 0: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Flag0}"); + Console.WriteLine($" Priority: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Priority}"); + Console.WriteLine($" Resource limit descriptors: {string.Join(", ", extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ResourceLimitDescriptors)}"); + + Console.WriteLine($" Storage info:"); + Console.WriteLine($" Extdata ID: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.ExtdataID}"); + Console.WriteLine($" System savedata IDs: {BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.SystemSavedataIDs).Replace('-', newChar: ' ')}"); + Console.WriteLine($" Storage accessible unique IDs: {BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.StorageAccessibleUniqueIDs).Replace('-', newChar: ' ')}"); + Console.WriteLine($" File system access info: {BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.FileSystemAccessInfo).Replace('-', newChar: ' ')}"); + Console.WriteLine($" Other attributes: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.StorageInfo.OtherAttributes}"); + + Console.WriteLine($" Service access control: {string.Join(", ", extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ServiceAccessControl)}"); + Console.WriteLine($" Extended service access control: {string.Join(", ", extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ExtendedServiceAccessControl)}"); + Console.WriteLine($" Reserved: {BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.Reserved).Replace('-', newChar: ' ')}"); + Console.WriteLine($" Resource limit cateogry: {extendedHeader.ACIForLimitations.ARM11LocalSystemCapabilities.ResourceLimitCategory}"); + + Console.WriteLine($" ARM11 kernel capabilities:"); + Console.WriteLine($" Descriptors: {string.Join(", ", extendedHeader.ACIForLimitations.ARM11KernelCapabilities.Descriptors)}"); + Console.WriteLine($" Reserved: {BitConverter.ToString(extendedHeader.ACIForLimitations.ARM11KernelCapabilities.Reserved).Replace('-', newChar: ' ')}"); + + Console.WriteLine($" ARM9 access control:"); + Console.WriteLine($" Descriptors: {BitConverter.ToString(extendedHeader.ACIForLimitations.ARM9AccessControl.Descriptors).Replace('-', newChar: ' ')}"); + Console.WriteLine($" Descriptor version: {extendedHeader.ACIForLimitations.ARM9AccessControl.DescriptorVersion}"); + } + } + } + Console.WriteLine(); + } + #endregion } } \ No newline at end of file