diff --git a/LibHac/Nacp.cs b/LibHac/Nacp.cs index f452d087..42bcd5dd 100644 --- a/LibHac/Nacp.cs +++ b/LibHac/Nacp.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.IO; -namespace LibHac +namespace libhac { public class Nacp { @@ -115,10 +115,7 @@ namespace LibHac SeedForPseudoDeviceId = reader.ReadUInt64(); BcatPassphrase = reader.ReadUtf8Z(65); - reader.BaseStream.Position = start + 0x3141; - Reserved01 = reader.ReadByte(); - Reserved02 = reader.ReadBytes(6); - + reader.BaseStream.Position = start + 0x3148; UserAccountSaveDataSizeMax = reader.ReadInt64(); UserAccountSaveDataJournalSizeMax = reader.ReadInt64(); DeviceSaveDataSizeMax = reader.ReadInt64(); diff --git a/libhac/Nacp.cs b/libhac/Nacp.cs new file mode 100644 index 00000000..42bcd5dd --- /dev/null +++ b/libhac/Nacp.cs @@ -0,0 +1,162 @@ +using System.Collections.Generic; +using System.IO; + +namespace libhac +{ + public class Nacp + { + public NacpLang[] Languages { get; } = new NacpLang[0x10]; + public string Isbn { get; } + public byte StartupUserAccount { get; } + public byte TouchScreenUsageMode { get; } + public byte AocRegistrationType { get; } + public int AttributeFlag { get; } + public uint SupportedLanguageFlag { get; } + public uint ParentalControlFlag { get; } + public byte Screenshot { get; } + public byte VideoCapture { get; } + public byte DataLossConfirmation { get; } + public byte PlayLogPolicy { get; } + public ulong PresenceGroupId { get; } + public sbyte[] RatingAge { get; } = new sbyte[32]; + public string DisplayVersion { get; } + public ulong AddOnContentBaseId { get; } + public ulong SaveDataOwnerId { get; } + public long UserAccountSaveDataSize { get; } + public long UserAccountSaveDataJournalSize { get; } + public long DeviceSaveDataSize { get; } + public long DeviceSaveDataJournalSize { get; } + public long BcatDeliveryCacheStorageSize { get; } + public string ApplicationErrorCodeCategory { get; } + public ulong[] LocalCommunicationId { get; } = new ulong[8]; + public byte LogoType { get; } + public byte LogoHandling { get; } + public byte RuntimeAddOnContentInstall { get; } + public byte[] Reserved00 { get; } + public byte CrashReport { get; } + public byte Hdcp { get; } + public ulong SeedForPseudoDeviceId { get; } + public string BcatPassphrase { get; } + public byte Reserved01 { get; } + public byte[] Reserved02 { get; } + public long UserAccountSaveDataSizeMax { get; } + public long UserAccountSaveDataJournalSizeMax { get; } + public long DeviceSaveDataSizeMax { get; } + public long DeviceSaveDataJournalSizeMax { get; } + public long TemporaryStorageSize { get; } + public long CacheStorageSize { get; } + public long CacheStorageJournalSize { get; } + public long CacheStorageDataAndJournalSizeMax { get; } + public short CacheStorageIndex { get; } + public byte[] Reserved03 { get; } + public List PlayLogQueryableApplicationId { get; } = new List(); + public byte PlayLogQueryCapability { get; } + public byte RepairFlag { get; } + public byte ProgramIndex { get; } + + + public long TotalSaveDataSize { get; } + public long UserTotalSaveDataSize { get; } + public long DeviceTotalSaveDataSize { get; } + + public Nacp() { } + + public Nacp(BinaryReader reader) + { + var start = reader.BaseStream.Position; + + for (int i = 0; i < 16; i++) + { + Languages[i] = new NacpLang(reader); + } + + Isbn = reader.ReadUtf8Z(37); + reader.BaseStream.Position = start + 0x3025; + StartupUserAccount = reader.ReadByte(); + TouchScreenUsageMode = reader.ReadByte(); + AocRegistrationType = reader.ReadByte(); + AttributeFlag = reader.ReadInt32(); + SupportedLanguageFlag = reader.ReadUInt32(); + ParentalControlFlag = reader.ReadUInt32(); + Screenshot = reader.ReadByte(); + VideoCapture = reader.ReadByte(); + DataLossConfirmation = reader.ReadByte(); + PlayLogPolicy = reader.ReadByte(); + PresenceGroupId = reader.ReadUInt64(); + + for (int i = 0; i < RatingAge.Length; i++) + { + RatingAge[i] = reader.ReadSByte(); + } + + DisplayVersion = reader.ReadUtf8Z(16); + reader.BaseStream.Position = start + 0x3070; + AddOnContentBaseId = reader.ReadUInt64(); + SaveDataOwnerId = reader.ReadUInt64(); + UserAccountSaveDataSize = reader.ReadInt64(); + UserAccountSaveDataJournalSize = reader.ReadInt64(); + DeviceSaveDataSize = reader.ReadInt64(); + DeviceSaveDataJournalSize = reader.ReadInt64(); + BcatDeliveryCacheStorageSize = reader.ReadInt64(); + ApplicationErrorCodeCategory = reader.ReadUtf8Z(8); + reader.BaseStream.Position = start + 0x30B0; + + for (int i = 0; i < LocalCommunicationId.Length; i++) + { + LocalCommunicationId[i] = reader.ReadUInt64(); + } + + LogoType = reader.ReadByte(); + LogoHandling = reader.ReadByte(); + RuntimeAddOnContentInstall = reader.ReadByte(); + Reserved00 = reader.ReadBytes(3); + CrashReport = reader.ReadByte(); + Hdcp = reader.ReadByte(); + SeedForPseudoDeviceId = reader.ReadUInt64(); + BcatPassphrase = reader.ReadUtf8Z(65); + + reader.BaseStream.Position = start + 0x3148; + UserAccountSaveDataSizeMax = reader.ReadInt64(); + UserAccountSaveDataJournalSizeMax = reader.ReadInt64(); + DeviceSaveDataSizeMax = reader.ReadInt64(); + DeviceSaveDataJournalSizeMax = reader.ReadInt64(); + TemporaryStorageSize = reader.ReadInt64(); + CacheStorageSize = reader.ReadInt64(); + CacheStorageJournalSize = reader.ReadInt64(); + CacheStorageDataAndJournalSizeMax = reader.ReadInt64(); + CacheStorageIndex = reader.ReadInt16(); + Reserved03 = reader.ReadBytes(6); + + for (int i = 0; i < 16; i++) + { + var value = reader.ReadUInt64(); + if (value != 0) PlayLogQueryableApplicationId.Add(value); + } + + PlayLogQueryCapability = reader.ReadByte(); + RepairFlag = reader.ReadByte(); + ProgramIndex = reader.ReadByte(); + + UserTotalSaveDataSize = UserAccountSaveDataSize + UserAccountSaveDataJournalSize; + DeviceTotalSaveDataSize = DeviceSaveDataSize + DeviceSaveDataJournalSize; + TotalSaveDataSize = UserTotalSaveDataSize + DeviceTotalSaveDataSize; + } + } + + public class NacpLang + { + public string Title { get; } + public string Developer { get; } + + public NacpLang() { } + + public NacpLang(BinaryReader reader) + { + var start = reader.BaseStream.Position; + Title = reader.ReadUtf8Z(); + reader.BaseStream.Position = start + 0x200; + Developer = reader.ReadUtf8Z(); + reader.BaseStream.Position = start + 0x300; + } + } +}