IApplicationManagerInterface.cs 7.9 KB

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