KipExecutable.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using LibHac.Fs;
  2. using LibHac.Loader;
  3. namespace Ryujinx.HLE.Loaders.Executables
  4. {
  5. class KipExecutable : IExecutable
  6. {
  7. public byte[] Text { get; }
  8. public byte[] Ro { get; }
  9. public byte[] Data { get; }
  10. public int TextOffset { get; }
  11. public int RoOffset { get; }
  12. public int DataOffset { get; }
  13. public int BssOffset { get; }
  14. public int BssSize { get; }
  15. public int[] Capabilities { get; }
  16. public bool UsesSecureMemory { get; }
  17. public bool Is64BitAddressSpace { get; }
  18. public bool Is64Bit { get; }
  19. public ulong ProgramId { get; }
  20. public byte Priority { get; }
  21. public int StackSize { get; }
  22. public byte IdealCoreId { get; }
  23. public int Version { get; }
  24. public string Name { get; }
  25. public KipExecutable(IStorage inStorage)
  26. {
  27. KipReader reader = new KipReader();
  28. reader.Initialize(inStorage).ThrowIfFailure();
  29. TextOffset = reader.Segments[0].MemoryOffset;
  30. RoOffset = reader.Segments[1].MemoryOffset;
  31. DataOffset = reader.Segments[2].MemoryOffset;
  32. BssOffset = reader.Segments[3].MemoryOffset;
  33. BssSize = reader.Segments[3].Size;
  34. StackSize = reader.StackSize;
  35. UsesSecureMemory = reader.UsesSecureMemory;
  36. Is64BitAddressSpace = reader.Is64BitAddressSpace;
  37. Is64Bit = reader.Is64Bit;
  38. ProgramId = reader.ProgramId;
  39. Priority = reader.Priority;
  40. IdealCoreId = reader.IdealCoreId;
  41. Version = reader.Version;
  42. Name = reader.Name.ToString();
  43. Capabilities = new int[32];
  44. for (int index = 0; index < Capabilities.Length; index++)
  45. {
  46. Capabilities[index] = (int)reader.Capabilities[index];
  47. }
  48. Text = DecompressSection(reader, KipReader.SegmentType.Text);
  49. Ro = DecompressSection(reader, KipReader.SegmentType.Ro);
  50. Data = DecompressSection(reader, KipReader.SegmentType.Data);
  51. }
  52. private static byte[] DecompressSection(KipReader reader, KipReader.SegmentType segmentType)
  53. {
  54. reader.GetSegmentSize(segmentType, out int uncompressedSize).ThrowIfFailure();
  55. byte[] result = new byte[uncompressedSize];
  56. reader.ReadSegment(segmentType, result).ThrowIfFailure();
  57. return result;
  58. }
  59. }
  60. }