ACI0.cs 1.9 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. }