IApplicationManagerInterface.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. using LibHac;
  2. using Ryujinx.HLE.HOS.Ipc;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Text;
  6. namespace Ryujinx.HLE.HOS.Services.Ns
  7. {
  8. class IApplicationManagerInterface : IpcService
  9. {
  10. private Dictionary<int, ServiceProcessRequest> _commands;
  11. public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
  12. public IApplicationManagerInterface()
  13. {
  14. _commands = new Dictionary<int, ServiceProcessRequest>
  15. {
  16. { 400, GetApplicationControlData }
  17. };
  18. }
  19. public long GetApplicationControlData(ServiceCtx context)
  20. {
  21. long position = context.Request.ReceiveBuff[0].Position;
  22. Nacp nacp = context.Device.System.ControlData;
  23. for (int i = 0; i < 0x10; i++)
  24. {
  25. NacpDescription description = nacp.Descriptions[i];
  26. byte[] titleData = new byte[0x200];
  27. byte[] developerData = new byte[0x100];
  28. if (description !=null && description.Title != null)
  29. {
  30. byte[] titleDescriptionData = Encoding.ASCII.GetBytes(description.Title);
  31. Buffer.BlockCopy(titleDescriptionData, 0, titleData, 0, titleDescriptionData.Length);
  32. }
  33. if (description != null && description.Developer != null)
  34. {
  35. byte[] developerDescriptionData = Encoding.ASCII.GetBytes(description.Developer);
  36. Buffer.BlockCopy(developerDescriptionData, 0, developerData, 0, developerDescriptionData.Length);
  37. }
  38. context.Memory.WriteBytes(position, titleData);
  39. context.Memory.WriteBytes(position + 0x200, developerData);
  40. position += i * 0x300;
  41. }
  42. byte[] isbn = new byte[0x25];
  43. if (nacp.Isbn != null)
  44. {
  45. byte[] isbnData = Encoding.ASCII.GetBytes(nacp.Isbn);
  46. Buffer.BlockCopy(isbnData, 0, isbn, 0, isbnData.Length);
  47. }
  48. context.Memory.WriteBytes(position, isbn);
  49. position += isbn.Length;
  50. context.Memory.WriteByte(position++, nacp.StartupUserAccount);
  51. context.Memory.WriteByte(position++, nacp.TouchScreenUsageMode);
  52. context.Memory.WriteByte(position++, nacp.AocRegistrationType);
  53. context.Memory.WriteInt32(position, nacp.AttributeFlag);
  54. position += 4;
  55. context.Memory.WriteUInt32(position, nacp.SupportedLanguageFlag);
  56. position += 4;
  57. context.Memory.WriteUInt32(position, nacp.ParentalControlFlag);
  58. position += 4;
  59. context.Memory.WriteByte(position++, nacp.Screenshot);
  60. context.Memory.WriteByte(position++, nacp.VideoCapture);
  61. context.Memory.WriteByte(position++, nacp.DataLossConfirmation);
  62. context.Memory.WriteByte(position++, nacp.PlayLogPolicy);
  63. context.Memory.WriteUInt64(position, nacp.PresenceGroupId);
  64. position += 8;
  65. for (int i = 0; i < nacp.RatingAge.Length; i++)
  66. {
  67. context.Memory.WriteSByte(position++, nacp.RatingAge[i]);
  68. }
  69. byte[] displayVersion = new byte[0x10];
  70. if (nacp.DisplayVersion != null)
  71. {
  72. byte[] displayVersionData = Encoding.ASCII.GetBytes(nacp.DisplayVersion);
  73. Buffer.BlockCopy(displayVersionData, 0, displayVersion, 0, displayVersionData.Length);
  74. }
  75. context.Memory.WriteBytes(position, displayVersion);
  76. position += displayVersion.Length;
  77. context.Memory.WriteUInt64(position, nacp.AddOnContentBaseId);
  78. position += 8;
  79. context.Memory.WriteUInt64(position, nacp.SaveDataOwnerId);
  80. position += 8;
  81. context.Memory.WriteInt64(position, nacp.UserAccountSaveDataSize);
  82. position += 8;
  83. context.Memory.WriteInt64(position, nacp.UserAccountSaveDataJournalSize);
  84. position += 8;
  85. context.Memory.WriteInt64(position, nacp.DeviceSaveDataSize);
  86. position += 8;
  87. context.Memory.WriteInt64(position, nacp.DeviceSaveDataJournalSize);
  88. position += 8;
  89. context.Memory.WriteInt64(position, nacp.BcatDeliveryCacheStorageSize);
  90. position += 8;
  91. byte[] applicationErrorCodeCategory = new byte[0x8];
  92. if (nacp.ApplicationErrorCodeCategory != null)
  93. {
  94. byte[] applicationErrorCodeCategoryData = Encoding.ASCII.GetBytes(nacp.ApplicationErrorCodeCategory);
  95. Buffer.BlockCopy(applicationErrorCodeCategoryData, 0, applicationErrorCodeCategoryData, 0, applicationErrorCodeCategoryData.Length);
  96. }
  97. context.Memory.WriteBytes(position, applicationErrorCodeCategory);
  98. position += applicationErrorCodeCategory.Length;
  99. for (int i = 0; i < nacp.LocalCommunicationId.Length; i++)
  100. {
  101. context.Memory.WriteUInt64(position, nacp.LocalCommunicationId[i]);
  102. position += 8;
  103. }
  104. context.Memory.WriteByte(position++, nacp.LogoType);
  105. context.Memory.WriteByte(position++, nacp.LogoHandling);
  106. context.Memory.WriteByte(position++, nacp.RuntimeAddOnContentInstall);
  107. byte[] reserved000 = new byte[0x3];
  108. context.Memory.WriteBytes(position, reserved000);
  109. position += reserved000.Length;
  110. context.Memory.WriteByte(position++, nacp.CrashReport);
  111. context.Memory.WriteByte(position++, nacp.Hdcp);
  112. context.Memory.WriteUInt64(position, nacp.SeedForPseudoDeviceId);
  113. position += 8;
  114. byte[] bcatPassphrase = new byte[65];
  115. if (nacp.BcatPassphrase != null)
  116. {
  117. byte[] bcatPassphraseData = Encoding.ASCII.GetBytes(nacp.BcatPassphrase);
  118. Buffer.BlockCopy(bcatPassphraseData, 0, bcatPassphrase, 0, bcatPassphraseData.Length);
  119. }
  120. context.Memory.WriteBytes(position, bcatPassphrase);
  121. position += bcatPassphrase.Length;
  122. context.Memory.WriteByte(position++, nacp.Reserved01);
  123. byte[] reserved02 = new byte[0x6];
  124. context.Memory.WriteBytes(position, reserved02);
  125. position += reserved02.Length;
  126. context.Memory.WriteInt64(position, nacp.UserAccountSaveDataSizeMax);
  127. position += 8;
  128. context.Memory.WriteInt64(position, nacp.UserAccountSaveDataJournalSizeMax);
  129. position += 8;
  130. context.Memory.WriteInt64(position, nacp.DeviceSaveDataSizeMax);
  131. position += 8;
  132. context.Memory.WriteInt64(position, nacp.DeviceSaveDataJournalSizeMax);
  133. position += 8;
  134. context.Memory.WriteInt64(position, nacp.TemporaryStorageSize);
  135. position += 8;
  136. context.Memory.WriteInt64(position, nacp.CacheStorageSize);
  137. position += 8;
  138. context.Memory.WriteInt64(position, nacp.CacheStorageJournalSize);
  139. position += 8;
  140. context.Memory.WriteInt64(position, nacp.CacheStorageDataAndJournalSizeMax);
  141. position += 8;
  142. context.Memory.WriteInt16(position, nacp.CacheStorageIndex);
  143. position += 2;
  144. byte[] reserved03 = new byte[0x6];
  145. context.Memory.WriteBytes(position, reserved03);
  146. position += reserved03.Length;
  147. for (int i = 0; i < 16; i++)
  148. {
  149. ulong value = 0;
  150. if (nacp.PlayLogQueryableApplicationId.Count > i)
  151. {
  152. value = nacp.PlayLogQueryableApplicationId[i];
  153. }
  154. context.Memory.WriteUInt64(position, value);
  155. position += 8;
  156. }
  157. context.Memory.WriteByte(position++, nacp.PlayLogQueryCapability);
  158. context.Memory.WriteByte(position++, nacp.RepairFlag);
  159. context.Memory.WriteByte(position++, nacp.ProgramIndex);
  160. return 0;
  161. }
  162. }
  163. }