Implement NPDM files parser (#169)
* Implement NPDM files parser (Currently not used in Ryujinx) * Add credits * Add Swap32 * Update Npdm.cs * Update ACI0.cs * Update ACID.cs * Update Npdm.cs * Update EndianSwap.cs * Update ACI0.cs * Update ACID.cs * Update KernelAccessControl.cs * Update NpdmInfo.cs * Update ServiceAccessControl.cs * Update NpdmInfo.cs
This commit is contained in:
parent
3c4dafff3f
commit
4e430760b4
10 changed files with 753 additions and 0 deletions
68
Ryujinx.HLE/Loaders/Npdm/ACID.cs
Normal file
68
Ryujinx.HLE/Loaders/Npdm/ACID.cs
Normal file
|
@ -0,0 +1,68 @@
|
|||
using Ryujinx.HLE.OsHle.Utilities;
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace Ryujinx.HLE.Loaders.Npdm
|
||||
{
|
||||
class ACID
|
||||
{
|
||||
public byte[] RSA2048Signature;
|
||||
public byte[] RSA2048Modulus;
|
||||
public int Unknown1;
|
||||
public int Flags;
|
||||
|
||||
public string TitleIdRangeMin;
|
||||
public string TitleIdRangeMax;
|
||||
|
||||
private int FSAccessControlOffset;
|
||||
private int FSAccessControlSize;
|
||||
private int ServiceAccessControlOffset;
|
||||
private int ServiceAccessControlSize;
|
||||
private int KernelAccessControlOffset;
|
||||
private int KernelAccessControlSize;
|
||||
|
||||
public FSAccessControl FSAccessControl;
|
||||
public ServiceAccessControl ServiceAccessControl;
|
||||
public KernelAccessControl KernelAccessControl;
|
||||
|
||||
public const long ACIDMagic = 'A' << 0 | 'C' << 8 | 'I' << 16 | 'D' << 24;
|
||||
|
||||
public ACID(Stream ACIDStream, int Offset)
|
||||
{
|
||||
ACIDStream.Seek(Offset, SeekOrigin.Begin);
|
||||
|
||||
BinaryReader Reader = new BinaryReader(ACIDStream);
|
||||
|
||||
RSA2048Signature = Reader.ReadBytes(0x100);
|
||||
RSA2048Modulus = Reader.ReadBytes(0x100);
|
||||
|
||||
if (Reader.ReadInt32() != ACIDMagic)
|
||||
{
|
||||
throw new InvalidNpdmException("ACID Stream doesn't contain ACID section!");
|
||||
}
|
||||
|
||||
Unknown1 = Reader.ReadInt32(); // Size field used with the above signature(?).
|
||||
Reader.ReadInt32(); // Padding / Unused
|
||||
Flags = Reader.ReadInt32(); // Bit0 must be 1 on retail, on devunit 0 is also allowed. Bit1 is unknown.
|
||||
|
||||
byte[] TempTitleIdRangeMin = Reader.ReadBytes(8);
|
||||
Array.Reverse(TempTitleIdRangeMin);
|
||||
TitleIdRangeMin = BitConverter.ToString(TempTitleIdRangeMin).Replace("-", "");
|
||||
|
||||
byte[] TempTitleIdRangeMax = Reader.ReadBytes(8);
|
||||
Array.Reverse(TempTitleIdRangeMax);
|
||||
TitleIdRangeMax = BitConverter.ToString(TempTitleIdRangeMax).Replace("-", "");
|
||||
|
||||
FSAccessControlOffset = Reader.ReadInt32();
|
||||
FSAccessControlSize = Reader.ReadInt32();
|
||||
ServiceAccessControlOffset = Reader.ReadInt32();
|
||||
ServiceAccessControlSize = Reader.ReadInt32();
|
||||
KernelAccessControlOffset = Reader.ReadInt32();
|
||||
KernelAccessControlSize = Reader.ReadInt32();
|
||||
|
||||
FSAccessControl = new FSAccessControl(ACIDStream, Offset + FSAccessControlOffset, FSAccessControlSize);
|
||||
ServiceAccessControl = new ServiceAccessControl(ACIDStream, Offset + ServiceAccessControlOffset, ServiceAccessControlSize);
|
||||
KernelAccessControl = new KernelAccessControl(ACIDStream, Offset + KernelAccessControlOffset, KernelAccessControlSize);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue