Nro.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using System;
  2. using System.Collections.ObjectModel;
  3. using System.IO;
  4. namespace Ryujinx.Core.Loaders.Executables
  5. {
  6. class Nro : IExecutable
  7. {
  8. private byte[] m_Text;
  9. private byte[] m_RO;
  10. private byte[] m_Data;
  11. public ReadOnlyCollection<byte> Text => Array.AsReadOnly(m_Text);
  12. public ReadOnlyCollection<byte> RO => Array.AsReadOnly(m_RO);
  13. public ReadOnlyCollection<byte> Data => Array.AsReadOnly(m_Data);
  14. public int Mod0Offset { get; private set; }
  15. public int TextOffset { get; private set; }
  16. public int ROOffset { get; private set; }
  17. public int DataOffset { get; private set; }
  18. public int BssSize { get; private set; }
  19. public Extensions Extension { get; private set; }
  20. public Nro(Stream Input)
  21. {
  22. BinaryReader Reader = new BinaryReader(Input);
  23. Input.Seek(4, SeekOrigin.Begin);
  24. int Mod0Offset = Reader.ReadInt32();
  25. int Padding8 = Reader.ReadInt32();
  26. int Paddingc = Reader.ReadInt32();
  27. int NroMagic = Reader.ReadInt32();
  28. int Unknown14 = Reader.ReadInt32();
  29. int FileSize = Reader.ReadInt32();
  30. int Unknown1c = Reader.ReadInt32();
  31. int TextOffset = Reader.ReadInt32();
  32. int TextSize = Reader.ReadInt32();
  33. int ROOffset = Reader.ReadInt32();
  34. int ROSize = Reader.ReadInt32();
  35. int DataOffset = Reader.ReadInt32();
  36. int DataSize = Reader.ReadInt32();
  37. int BssSize = Reader.ReadInt32();
  38. this.Mod0Offset = Mod0Offset;
  39. this.TextOffset = TextOffset;
  40. this.ROOffset = ROOffset;
  41. this.DataOffset = DataOffset;
  42. this.BssSize = BssSize;
  43. this.Extension = Extensions.NRO;
  44. byte[] Read(long Position, int Size)
  45. {
  46. Input.Seek(Position, SeekOrigin.Begin);
  47. return Reader.ReadBytes(Size);
  48. }
  49. m_Text = Read(TextOffset, TextSize);
  50. m_RO = Read(ROOffset, ROSize);
  51. m_Data = Read(DataOffset, DataSize);
  52. }
  53. }
  54. }