KernelInitialProcess.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using Ryujinx.HLE.Loaders.Compression;
  2. using System.IO;
  3. namespace Ryujinx.HLE.Loaders.Executables
  4. {
  5. class KernelInitialProcess : IExecutable
  6. {
  7. public string Name { get; private set; }
  8. public ulong TitleId { get; private set; }
  9. public int ProcessCategory { get; private set; }
  10. public byte MainThreadPriority { get; private set; }
  11. public byte DefaultProcessorId { get; private set; }
  12. public bool Is64Bits { get; private set; }
  13. public bool Addr39Bits { get; private set; }
  14. public bool IsService { get; private set; }
  15. public byte[] Text { get; private set; }
  16. public byte[] Ro { get; private set; }
  17. public byte[] Data { get; private set; }
  18. public int TextOffset { get; private set; }
  19. public int RoOffset { get; private set; }
  20. public int DataOffset { get; private set; }
  21. public int BssOffset { get; private set; }
  22. public int BssSize { get; private set; }
  23. public int MainThreadStackSize { get; private set; }
  24. public int[] Capabilities { get; private set; }
  25. private struct SegmentHeader
  26. {
  27. public int Offset { get; private set; }
  28. public int DecompressedSize { get; private set; }
  29. public int CompressedSize { get; private set; }
  30. public int Attribute { get; private set; }
  31. public SegmentHeader(
  32. int offset,
  33. int decompressedSize,
  34. int compressedSize,
  35. int attribute)
  36. {
  37. Offset = offset;
  38. DecompressedSize = decompressedSize;
  39. CompressedSize = compressedSize;
  40. Attribute = attribute;
  41. }
  42. }
  43. public KernelInitialProcess(Stream input)
  44. {
  45. BinaryReader reader = new BinaryReader(input);
  46. string magic = ReadString(reader, 4);
  47. if (magic != "KIP1")
  48. {
  49. }
  50. Name = ReadString(reader, 12);
  51. TitleId = reader.ReadUInt64();
  52. ProcessCategory = reader.ReadInt32();
  53. MainThreadPriority = reader.ReadByte();
  54. DefaultProcessorId = reader.ReadByte();
  55. byte reserved = reader.ReadByte();
  56. byte flags = reader.ReadByte();
  57. Is64Bits = (flags & 0x08) != 0;
  58. Addr39Bits = (flags & 0x10) != 0;
  59. IsService = (flags & 0x20) != 0;
  60. SegmentHeader[] segments = new SegmentHeader[6];
  61. for (int index = 0; index < segments.Length; index++)
  62. {
  63. segments[index] = new SegmentHeader(
  64. reader.ReadInt32(),
  65. reader.ReadInt32(),
  66. reader.ReadInt32(),
  67. reader.ReadInt32());
  68. }
  69. TextOffset = segments[0].Offset;
  70. RoOffset = segments[1].Offset;
  71. DataOffset = segments[2].Offset;
  72. BssOffset = segments[3].Offset;
  73. BssSize = segments[3].DecompressedSize;
  74. MainThreadStackSize = segments[1].Attribute;
  75. Capabilities = new int[32];
  76. for (int index = 0; index < Capabilities.Length; index++)
  77. {
  78. Capabilities[index] = reader.ReadInt32();
  79. }
  80. input.Seek(0x100, SeekOrigin.Begin);
  81. Text = ReadSegment(segments[0], input);
  82. Ro = ReadSegment(segments[1], input);
  83. Data = ReadSegment(segments[2], input);
  84. }
  85. private byte[] ReadSegment(SegmentHeader header, Stream input)
  86. {
  87. byte[] data = new byte[header.DecompressedSize];
  88. input.Read(data, 0, header.CompressedSize);
  89. BackwardsLz.DecompressInPlace(data, header.CompressedSize);
  90. return data;
  91. }
  92. private static string ReadString(BinaryReader reader, int maxSize)
  93. {
  94. string value = string.Empty;
  95. for (int index = 0; index < maxSize; index++)
  96. {
  97. char chr = (char)reader.ReadByte();
  98. if (chr == '\0')
  99. {
  100. reader.BaseStream.Seek(maxSize - index - 1, SeekOrigin.Current);
  101. break;
  102. }
  103. value += chr;
  104. }
  105. return value;
  106. }
  107. }
  108. }