NxRelocatableObject.cs 2.2 KB

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