diff --git a/SabreTools.Serialization/Deserializers/N3DS.cs b/SabreTools.Serialization/Deserializers/N3DS.cs
index 4f521bb0..b73eee2f 100644
--- a/SabreTools.Serialization/Deserializers/N3DS.cs
+++ b/SabreTools.Serialization/Deserializers/N3DS.cs
@@ -329,7 +329,51 @@ namespace SabreTools.Serialization.Deserializers
/// Filled NCCH extended header on success, null on error
public static NCCHExtendedHeader? ParseNCCHExtendedHeader(Stream data)
{
- return data.ReadType();
+ // TODO: Replace with `data.ReadType();` when enum serialization fixed
+ var header = new NCCHExtendedHeader();
+
+ header.SCI = data.ReadType();
+ header.ACI = ParseAccessControlInfo(data);
+ header.AccessDescSignature = data.ReadBytes(0x100);
+ header.NCCHHDRPublicKey = data.ReadBytes(0x100);
+ header.ACIForLimitations = ParseAccessControlInfo(data);
+
+ return header;
+ }
+
+ ///
+ /// Parse a Stream into an access control info
+ ///
+ /// Stream to parse
+ /// Filled access control info on success, null on error
+ public static AccessControlInfo? ParseAccessControlInfo(Stream data)
+ {
+ var aci = new AccessControlInfo();
+
+ aci.ARM11LocalSystemCapabilities = data.ReadType();
+ aci.ARM11KernelCapabilities = data.ReadType();
+ aci.ARM9AccessControl = ParseARM9AccessControl(data);
+
+ return aci;
+ }
+
+ ///
+ /// Parse a Stream into an ARM9 access control
+ ///
+ /// Stream to parse
+ /// Filled ARM9 access control on success, null on error
+ public static ARM9AccessControl? ParseARM9AccessControl(Stream data)
+ {
+ var a9ac = new ARM9AccessControl();
+
+ a9ac.Descriptors = new ARM9AccessControlDescriptors[15];
+ for (int i = 0; i < a9ac.Descriptors.Length; i++)
+ {
+ a9ac.Descriptors[i] = (ARM9AccessControlDescriptors)data.ReadByteValue();
+ }
+ a9ac.DescriptorVersion = data.ReadByteValue();
+
+ return a9ac;
}
///
diff --git a/SabreTools.Serialization/Printers/N3DS.cs b/SabreTools.Serialization/Printers/N3DS.cs
index 7ff8bcff..57d54c7f 100644
--- a/SabreTools.Serialization/Printers/N3DS.cs
+++ b/SabreTools.Serialization/Printers/N3DS.cs
@@ -1,3 +1,4 @@
+using System;
using System.Text;
using SabreTools.Models.N3DS;
using SabreTools.Serialization.Interfaces;
@@ -491,7 +492,13 @@ namespace SabreTools.Serialization.Printers
}
else
{
- builder.AppendLine($" Descriptors: {entry.ACI.ARM9AccessControl.Descriptors} (0x{entry.ACI.ARM9AccessControl.Descriptors:X})");
+ string descriptorsStr = "[NULL]";
+ if (entry.ACI.ARM9AccessControl.Descriptors != null)
+ {
+ var descriptors = Array.ConvertAll(entry.ACI.ARM9AccessControl.Descriptors, d => d.ToString());
+ descriptorsStr = string.Join(", ", descriptors);
+ }
+ builder.AppendLine(descriptorsStr, " Descriptors");
builder.AppendLine(entry.ACI.ARM9AccessControl.DescriptorVersion, " Descriptor version");
}
@@ -559,7 +566,13 @@ namespace SabreTools.Serialization.Printers
}
else
{
- builder.AppendLine($" Descriptors: {entry.ACIForLimitations.ARM9AccessControl.Descriptors} (0x{entry.ACIForLimitations.ARM9AccessControl.Descriptors:X})");
+ string descriptorsStr = "[NULL]";
+ if (entry.ACIForLimitations.ARM9AccessControl.Descriptors != null)
+ {
+ var descriptors = Array.ConvertAll(entry.ACIForLimitations.ARM9AccessControl.Descriptors, d => d.ToString());
+ descriptorsStr = string.Join(", ", descriptors);
+ }
+ builder.AppendLine(descriptorsStr, " Descriptors");
builder.AppendLine(entry.ACIForLimitations.ARM9AccessControl.DescriptorVersion, " Descriptor version");
}
}