aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Ns/IApplicationManagerInterface.cs
diff options
context:
space:
mode:
authorThomas Guillemard <thog@protonmail.com>2019-02-14 01:44:39 +0100
committerjduncanator <1518948+jduncanator@users.noreply.github.com>2019-02-14 11:44:39 +1100
commitb126ea48c63a3de8da8f3b817860c0323f2621ef (patch)
treeeb58d7b31719050da390e2b79824d6e931b85da8 /Ryujinx.HLE/HOS/Services/Ns/IApplicationManagerInterface.cs
parent7e9f5555747315d142e1ae20266cb581647db0cd (diff)
Support HomeBrew Loader (#577)
* Make it possibles to load hb-loader and hb-menu One issue remains with hb-menu homebrew icons because of SIMD issues (libjpeg-turbo related) and netloader doesn't work. * Implement GetApplicationControlData * Fix shared fonts for NSO/NRO * Add homebrew NRO romfs support This readd the NRO support by parsing the ASET header * Address comments about HomebrewRomFs * override Dispose in homebrew romfs stream * Use a struct for file timestamp * Simplify positional increments in GetApplicationControlData * Address comments * improve readability of the memory permission check in SetProcessMemoryPermission * Fix previous broken check * Add address space checks in SetProcessMemoryPermission
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Ns/IApplicationManagerInterface.cs')
-rw-r--r--Ryujinx.HLE/HOS/Services/Ns/IApplicationManagerInterface.cs209
1 files changed, 205 insertions, 4 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Ns/IApplicationManagerInterface.cs b/Ryujinx.HLE/HOS/Services/Ns/IApplicationManagerInterface.cs
index 72d7787f..88fdb792 100644
--- a/Ryujinx.HLE/HOS/Services/Ns/IApplicationManagerInterface.cs
+++ b/Ryujinx.HLE/HOS/Services/Ns/IApplicationManagerInterface.cs
@@ -1,5 +1,9 @@
-using Ryujinx.HLE.HOS.Ipc;
+using LibHac;
+using Ryujinx.Common.Logging;
+using Ryujinx.HLE.HOS.Ipc;
+using System;
using System.Collections.Generic;
+using System.Text;
namespace Ryujinx.HLE.HOS.Services.Ns
{
@@ -9,14 +13,211 @@ namespace Ryujinx.HLE.HOS.Services.Ns
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
- private bool _isInitialized;
-
public IApplicationManagerInterface()
{
_commands = new Dictionary<int, ServiceProcessRequest>
{
-
+ { 400, GetApplicationControlData }
};
}
+
+ public long GetApplicationControlData(ServiceCtx context)
+ {
+ long position = context.Request.ReceiveBuff[0].Position;
+
+ Nacp nacp = context.Device.System.ControlData;
+
+ for (int i = 0; i < 0x10; i++)
+ {
+ NacpDescription description = nacp.Descriptions[i];
+
+ byte[] titleData = new byte[0x200];
+ byte[] developerData = new byte[0x100];
+
+ if (description !=null && description.Title != null)
+ {
+ byte[] titleDescriptionData = Encoding.ASCII.GetBytes(description.Title);
+ Buffer.BlockCopy(titleDescriptionData, 0, titleData, 0, titleDescriptionData.Length);
+
+ }
+
+ if (description != null && description.Developer != null)
+ {
+ byte[] developerDescriptionData = Encoding.ASCII.GetBytes(description.Developer);
+ Buffer.BlockCopy(developerDescriptionData, 0, developerData, 0, developerDescriptionData.Length);
+ }
+
+ context.Memory.WriteBytes(position, titleData);
+ context.Memory.WriteBytes(position + 0x200, developerData);
+
+ position += i * 0x300;
+ }
+
+ byte[] isbn = new byte[0x25];
+
+ if (nacp.Isbn != null)
+ {
+ byte[] isbnData = Encoding.ASCII.GetBytes(nacp.Isbn);
+ Buffer.BlockCopy(isbnData, 0, isbn, 0, isbnData.Length);
+ }
+
+ context.Memory.WriteBytes(position, isbn);
+ position += isbn.Length;
+
+ context.Memory.WriteByte(position++, nacp.StartupUserAccount);
+ context.Memory.WriteByte(position++, nacp.TouchScreenUsageMode);
+ context.Memory.WriteByte(position++, nacp.AocRegistrationType);
+
+ context.Memory.WriteInt32(position, nacp.AttributeFlag);
+ position += 4;
+
+ context.Memory.WriteUInt32(position, nacp.SupportedLanguageFlag);
+ position += 4;
+
+ context.Memory.WriteUInt32(position, nacp.ParentalControlFlag);
+ position += 4;
+
+ context.Memory.WriteByte(position++, nacp.Screenshot);
+ context.Memory.WriteByte(position++, nacp.VideoCapture);
+ context.Memory.WriteByte(position++, nacp.DataLossConfirmation);
+ context.Memory.WriteByte(position++, nacp.PlayLogPolicy);
+
+ context.Memory.WriteUInt64(position, nacp.PresenceGroupId);
+ position += 8;
+
+ for (int i = 0; i < nacp.RatingAge.Length; i++)
+ {
+ context.Memory.WriteSByte(position++, nacp.RatingAge[i]);
+ }
+
+ byte[] displayVersion = new byte[0x10];
+
+ if (nacp.DisplayVersion != null)
+ {
+ byte[] displayVersionData = Encoding.ASCII.GetBytes(nacp.DisplayVersion);
+ Buffer.BlockCopy(displayVersionData, 0, displayVersion, 0, displayVersionData.Length);
+ }
+
+ context.Memory.WriteBytes(position, displayVersion);
+ position += displayVersion.Length;
+
+ context.Memory.WriteUInt64(position, nacp.AddOnContentBaseId);
+ position += 8;
+
+ context.Memory.WriteUInt64(position, nacp.SaveDataOwnerId);
+ position += 8;
+
+ context.Memory.WriteInt64(position, nacp.UserAccountSaveDataSize);
+ position += 8;
+
+ context.Memory.WriteInt64(position, nacp.UserAccountSaveDataJournalSize);
+ position += 8;
+
+ context.Memory.WriteInt64(position, nacp.DeviceSaveDataSize);
+ position += 8;
+
+ context.Memory.WriteInt64(position, nacp.DeviceSaveDataJournalSize);
+ position += 8;
+
+ context.Memory.WriteInt64(position, nacp.BcatDeliveryCacheStorageSize);
+ position += 8;
+
+ byte[] applicationErrorCodeCategory = new byte[0x8];
+
+ if (nacp.ApplicationErrorCodeCategory != null)
+ {
+ byte[] applicationErrorCodeCategoryData = Encoding.ASCII.GetBytes(nacp.ApplicationErrorCodeCategory);
+ Buffer.BlockCopy(applicationErrorCodeCategoryData, 0, applicationErrorCodeCategoryData, 0, applicationErrorCodeCategoryData.Length);
+ }
+
+ context.Memory.WriteBytes(position, applicationErrorCodeCategory);
+ position += applicationErrorCodeCategory.Length;
+
+ for (int i = 0; i < nacp.LocalCommunicationId.Length; i++)
+ {
+ context.Memory.WriteUInt64(position, nacp.LocalCommunicationId[i]);
+ position += 8;
+ }
+
+ context.Memory.WriteByte(position++, nacp.LogoType);
+ context.Memory.WriteByte(position++, nacp.LogoHandling);
+ context.Memory.WriteByte(position++, nacp.RuntimeAddOnContentInstall);
+
+ byte[] reserved000 = new byte[0x3];
+ context.Memory.WriteBytes(position, reserved000);
+ position += reserved000.Length;
+
+ context.Memory.WriteByte(position++, nacp.CrashReport);
+ context.Memory.WriteByte(position++, nacp.Hdcp);
+ context.Memory.WriteUInt64(position, nacp.SeedForPseudoDeviceId);
+ position += 8;
+
+ byte[] bcatPassphrase = new byte[65];
+ if (nacp.BcatPassphrase != null)
+ {
+ byte[] bcatPassphraseData = Encoding.ASCII.GetBytes(nacp.BcatPassphrase);
+ Buffer.BlockCopy(bcatPassphraseData, 0, bcatPassphrase, 0, bcatPassphraseData.Length);
+ }
+
+ context.Memory.WriteBytes(position, bcatPassphrase);
+ position += bcatPassphrase.Length;
+
+ context.Memory.WriteByte(position++, nacp.Reserved01);
+
+ byte[] reserved02 = new byte[0x6];
+ context.Memory.WriteBytes(position, reserved02);
+ position += reserved02.Length;
+
+ context.Memory.WriteInt64(position, nacp.UserAccountSaveDataSizeMax);
+ position += 8;
+
+ context.Memory.WriteInt64(position, nacp.UserAccountSaveDataJournalSizeMax);
+ position += 8;
+
+ context.Memory.WriteInt64(position, nacp.DeviceSaveDataSizeMax);
+ position += 8;
+
+ context.Memory.WriteInt64(position, nacp.DeviceSaveDataJournalSizeMax);
+ position += 8;
+
+ context.Memory.WriteInt64(position, nacp.TemporaryStorageSize);
+ position += 8;
+
+ context.Memory.WriteInt64(position, nacp.CacheStorageSize);
+ position += 8;
+
+ context.Memory.WriteInt64(position, nacp.CacheStorageJournalSize);
+ position += 8;
+
+ context.Memory.WriteInt64(position, nacp.CacheStorageDataAndJournalSizeMax);
+ position += 8;
+
+ context.Memory.WriteInt16(position, nacp.CacheStorageIndex);
+ position += 2;
+
+ byte[] reserved03 = new byte[0x6];
+ context.Memory.WriteBytes(position, reserved03);
+ position += reserved03.Length;
+
+
+ for (int i = 0; i < 16; i++)
+ {
+ ulong value = 0;
+
+ if (nacp.PlayLogQueryableApplicationId.Count > i)
+ {
+ value = nacp.PlayLogQueryableApplicationId[i];
+ }
+
+ context.Memory.WriteUInt64(position, value);
+ position += 8;
+ }
+
+ context.Memory.WriteByte(position++, nacp.PlayLogQueryCapability);
+ context.Memory.WriteByte(position++, nacp.RepairFlag);
+ context.Memory.WriteByte(position++, nacp.ProgramIndex);
+
+ return 0;
+ }
}
}