ACID.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System;
  2. using System.IO;
  3. namespace Ryujinx.HLE.Loaders.Npdm
  4. {
  5. class ACID
  6. {
  7. public byte[] RSA2048Signature;
  8. public byte[] RSA2048Modulus;
  9. public int Unknown1;
  10. public int Flags;
  11. public string TitleIdRangeMin;
  12. public string TitleIdRangeMax;
  13. private int FSAccessControlOffset;
  14. private int FSAccessControlSize;
  15. private int ServiceAccessControlOffset;
  16. private int ServiceAccessControlSize;
  17. private int KernelAccessControlOffset;
  18. private int KernelAccessControlSize;
  19. public FSAccessControl FSAccessControl;
  20. public ServiceAccessControl ServiceAccessControl;
  21. public KernelAccessControl KernelAccessControl;
  22. public const long ACIDMagic = 'A' << 0 | 'C' << 8 | 'I' << 16 | 'D' << 24;
  23. public ACID(Stream ACIDStream, int Offset)
  24. {
  25. ACIDStream.Seek(Offset, SeekOrigin.Begin);
  26. BinaryReader Reader = new BinaryReader(ACIDStream);
  27. RSA2048Signature = Reader.ReadBytes(0x100);
  28. RSA2048Modulus = Reader.ReadBytes(0x100);
  29. if (Reader.ReadInt32() != ACIDMagic)
  30. {
  31. throw new InvalidNpdmException("ACID Stream doesn't contain ACID section!");
  32. }
  33. Unknown1 = Reader.ReadInt32(); // Size field used with the above signature(?).
  34. Reader.ReadInt32(); // Padding / Unused
  35. Flags = Reader.ReadInt32(); // Bit0 must be 1 on retail, on devunit 0 is also allowed. Bit1 is unknown.
  36. byte[] TempTitleIdRangeMin = Reader.ReadBytes(8);
  37. Array.Reverse(TempTitleIdRangeMin);
  38. TitleIdRangeMin = BitConverter.ToString(TempTitleIdRangeMin).Replace("-", "");
  39. byte[] TempTitleIdRangeMax = Reader.ReadBytes(8);
  40. Array.Reverse(TempTitleIdRangeMax);
  41. TitleIdRangeMax = BitConverter.ToString(TempTitleIdRangeMax).Replace("-", "");
  42. FSAccessControlOffset = Reader.ReadInt32();
  43. FSAccessControlSize = Reader.ReadInt32();
  44. ServiceAccessControlOffset = Reader.ReadInt32();
  45. ServiceAccessControlSize = Reader.ReadInt32();
  46. KernelAccessControlOffset = Reader.ReadInt32();
  47. KernelAccessControlSize = Reader.ReadInt32();
  48. FSAccessControl = new FSAccessControl(ACIDStream, Offset + FSAccessControlOffset, FSAccessControlSize);
  49. ServiceAccessControl = new ServiceAccessControl(ACIDStream, Offset + ServiceAccessControlOffset, ServiceAccessControlSize);
  50. KernelAccessControl = new KernelAccessControl(ACIDStream, Offset + KernelAccessControlOffset, KernelAccessControlSize);
  51. }
  52. }
  53. }