ACID.cs 2.8 KB

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