ACI0.cs
1 using Ryujinx.HLE.Exceptions; 2 using System.IO; 3 4 namespace Ryujinx.HLE.Loaders.Npdm 5 { 6 public class Aci0 7 { 8 private const int Aci0Magic = 'A' << 0 | 'C' << 8 | 'I' << 16 | '0' << 24; 9 10 public ulong TitleId { get; set; } 11 12 public int FsVersion { get; private set; } 13 public ulong FsPermissionsBitmask { get; private set; } 14 15 public ServiceAccessControl ServiceAccessControl { get; private set; } 16 public KernelAccessControl KernelAccessControl { get; private set; } 17 18 /// <exception cref="InvalidNpdmException">The stream doesn't contain valid ACI0 data.</exception> 19 /// <exception cref="System.ArgumentException">The stream does not support reading, is <see langword="null"/>, or is already closed.</exception> 20 /// <exception cref="EndOfStreamException">The end of the stream is reached.</exception> 21 /// <exception cref="System.ObjectDisposedException">The stream is closed.</exception> 22 /// <exception cref="IOException">An I/O error occurred.</exception> 23 /// <exception cref="System.NotImplementedException">The FsAccessHeader.ContentOwnerId section is not implemented.</exception> 24 public Aci0(Stream stream, int offset) 25 { 26 stream.Seek(offset, SeekOrigin.Begin); 27 28 BinaryReader reader = new(stream); 29 30 if (reader.ReadInt32() != Aci0Magic) 31 { 32 throw new InvalidNpdmException("ACI0 Stream doesn't contain ACI0 section!"); 33 } 34 35 stream.Seek(0xc, SeekOrigin.Current); 36 37 TitleId = reader.ReadUInt64(); 38 39 // Reserved. 40 stream.Seek(8, SeekOrigin.Current); 41 42 int fsAccessHeaderOffset = reader.ReadInt32(); 43 int fsAccessHeaderSize = reader.ReadInt32(); 44 int serviceAccessControlOffset = reader.ReadInt32(); 45 int serviceAccessControlSize = reader.ReadInt32(); 46 int kernelAccessControlOffset = reader.ReadInt32(); 47 int kernelAccessControlSize = reader.ReadInt32(); 48 49 FsAccessHeader fsAccessHeader = new(stream, offset + fsAccessHeaderOffset, fsAccessHeaderSize); 50 51 FsVersion = fsAccessHeader.Version; 52 FsPermissionsBitmask = fsAccessHeader.PermissionsBitmask; 53 54 ServiceAccessControl = new ServiceAccessControl(stream, offset + serviceAccessControlOffset, serviceAccessControlSize); 55 56 KernelAccessControl = new KernelAccessControl(stream, offset + kernelAccessControlOffset, kernelAccessControlSize); 57 } 58 } 59 }