ACI0.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using Ryujinx.HLE.OsHle.Utilities;
  2. using System;
  3. using System.IO;
  4. namespace Ryujinx.HLE.Loaders.Npdm
  5. {
  6. class ACI0
  7. {
  8. public string TitleId;
  9. private int FSAccessHeaderOffset;
  10. private int FSAccessHeaderSize;
  11. private int ServiceAccessControlOffset;
  12. private int ServiceAccessControlSize;
  13. private int KernelAccessControlOffset;
  14. private int KernelAccessControlSize;
  15. public FSAccessHeader FSAccessHeader;
  16. public ServiceAccessControl ServiceAccessControl;
  17. public KernelAccessControl KernelAccessControl;
  18. public const long ACI0Magic = 'A' << 0 | 'C' << 8 | 'I' << 16 | '0' << 24;
  19. public ACI0(Stream ACI0Stream, int Offset)
  20. {
  21. ACI0Stream.Seek(Offset, SeekOrigin.Begin);
  22. BinaryReader Reader = new BinaryReader(ACI0Stream);
  23. if (Reader.ReadInt32() != ACI0Magic)
  24. {
  25. throw new InvalidNpdmException("ACI0 Stream doesn't contain ACI0 section!");
  26. }
  27. ACI0Stream.Seek(0x0C, SeekOrigin.Current);
  28. byte[] TempTitleId = Reader.ReadBytes(8);
  29. Array.Reverse(TempTitleId);
  30. TitleId = BitConverter.ToString(TempTitleId).Replace("-", "");
  31. // Reserved (Not currently used, potentially to be used for lowest title ID in future.)
  32. ACI0Stream.Seek(0x08, SeekOrigin.Current);
  33. FSAccessHeaderOffset = Reader.ReadInt32();
  34. FSAccessHeaderSize = Reader.ReadInt32();
  35. ServiceAccessControlOffset = Reader.ReadInt32();
  36. ServiceAccessControlSize = Reader.ReadInt32();
  37. KernelAccessControlOffset = Reader.ReadInt32();
  38. KernelAccessControlSize = Reader.ReadInt32();
  39. FSAccessHeader = new FSAccessHeader(ACI0Stream, Offset + FSAccessHeaderOffset, FSAccessHeaderSize);
  40. ServiceAccessControl = new ServiceAccessControl(ACI0Stream, Offset + ServiceAccessControlOffset, ServiceAccessControlSize);
  41. KernelAccessControl = new KernelAccessControl(ACI0Stream, Offset + KernelAccessControlOffset, KernelAccessControlSize);
  42. }
  43. }
  44. }