ACI0.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Ryujinx.HLE.Exceptions;
  2. using System.IO;
  3. namespace Ryujinx.HLE.Loaders.Npdm
  4. {
  5. class ACI0
  6. {
  7. private const int ACI0Magic = 'A' << 0 | 'C' << 8 | 'I' << 16 | '0' << 24;
  8. public long TitleId { get; private set; }
  9. public int FsVersion { get; private set; }
  10. public ulong FsPermissionsBitmask { get; private set; }
  11. public ServiceAccessControl ServiceAccessControl { get; private set; }
  12. public KernelAccessControl KernelAccessControl { get; private set; }
  13. public ACI0(Stream Stream, int Offset)
  14. {
  15. Stream.Seek(Offset, SeekOrigin.Begin);
  16. BinaryReader Reader = new BinaryReader(Stream);
  17. if (Reader.ReadInt32() != ACI0Magic)
  18. {
  19. throw new InvalidNpdmException("ACI0 Stream doesn't contain ACI0 section!");
  20. }
  21. Stream.Seek(0xc, SeekOrigin.Current);
  22. TitleId = Reader.ReadInt64();
  23. //Reserved.
  24. Stream.Seek(8, SeekOrigin.Current);
  25. int FsAccessHeaderOffset = Reader.ReadInt32();
  26. int FsAccessHeaderSize = Reader.ReadInt32();
  27. int ServiceAccessControlOffset = Reader.ReadInt32();
  28. int ServiceAccessControlSize = Reader.ReadInt32();
  29. int KernelAccessControlOffset = Reader.ReadInt32();
  30. int KernelAccessControlSize = Reader.ReadInt32();
  31. FsAccessHeader FsAccessHeader = new FsAccessHeader(Stream, Offset + FsAccessHeaderOffset, FsAccessHeaderSize);
  32. FsVersion = FsAccessHeader.Version;
  33. FsPermissionsBitmask = FsAccessHeader.PermissionsBitmask;
  34. ServiceAccessControl = new ServiceAccessControl(Stream, Offset + ServiceAccessControlOffset, ServiceAccessControlSize);
  35. KernelAccessControl = new KernelAccessControl(Stream, Offset + KernelAccessControlOffset, KernelAccessControlSize);
  36. }
  37. }
  38. }