diff --git a/README.md b/README.md index 6a2411279..841a8258c 100644 --- a/README.md +++ b/README.md @@ -67,4 +67,4 @@ Run `dotnet run -c Release -- path\to\game_exefs_and_romfs_folder` to run offici **Latest build** These builds are compiled automatically for each commit on the master branch. They may be unstable or not work at all. -To download the latest automatic build for Windows (64-bits), [Click Here](https://ci.appveyor.com/api/projects/gdkchan/ryujinx/artifacts/ryujinx_latest_unstable.zip). +To download the latest automatic build for Windows (64-bits), [Click Here](https://ci.appveyor.com/api/projects/gdkchan/ryujinx/artifacts/ryujinx_latest_unstable.zip?pr=false). diff --git a/Ryujinx.Core/OsHle/Handles/HSession.cs b/Ryujinx.Core/OsHle/Handles/HSession.cs index 8aa1c06bc..f30e91f98 100644 --- a/Ryujinx.Core/OsHle/Handles/HSession.cs +++ b/Ryujinx.Core/OsHle/Handles/HSession.cs @@ -1,21 +1,23 @@ +using Ryujinx.Core.OsHle.IpcServices; + namespace Ryujinx.Core.OsHle.Handles { class HSession { - public string ServiceName { get; private set; } + public IIpcService Service { get; private set; } public bool IsInitialized { get; private set; } public int State { get; set; } - public HSession(string ServiceName) + public HSession(IIpcService Service) { - this.ServiceName = ServiceName; + this.Service = Service; } public HSession(HSession Session) { - ServiceName = Session.ServiceName; + Service = Session.Service; IsInitialized = Session.IsInitialized; } diff --git a/Ryujinx.Core/OsHle/Ipc/IpcHandler.cs b/Ryujinx.Core/OsHle/Ipc/IpcHandler.cs index 5785dbf30..2495d7014 100644 --- a/Ryujinx.Core/OsHle/Ipc/IpcHandler.cs +++ b/Ryujinx.Core/OsHle/Ipc/IpcHandler.cs @@ -1,79 +1,13 @@ using ChocolArm64.Memory; using Ryujinx.Core.OsHle.Handles; -using Ryujinx.Core.OsHle.Objects; -using Ryujinx.Core.OsHle.Services; +using Ryujinx.Core.OsHle.IpcServices; using System; -using System.Collections.Generic; using System.IO; namespace Ryujinx.Core.OsHle.Ipc { static class IpcHandler { - private static Dictionary<(string, int), ServiceProcessRequest> ServiceCmds = - new Dictionary<(string, int), ServiceProcessRequest>() - { - { ( "acc:u0", 3), Service.AccU0ListOpenUsers }, - { ( "acc:u0", 5), Service.AccU0GetProfile }, - { ( "acc:u0", 100), Service.AccU0InitializeApplicationInfo }, - { ( "acc:u0", 101), Service.AccU0GetBaasAccountManagerForApplication }, - { ( "apm", 0), Service.ApmOpenSession }, - { ( "apm:p", 0), Service.ApmOpenSession }, - { ( "appletOE", 0), Service.AppletOpenApplicationProxy }, - { ( "audout:u", 0), Service.AudOutListAudioOuts }, - { ( "audout:u", 1), Service.AudOutOpenAudioOut }, - { ( "audren:u", 0), Service.AudRenOpenAudioRenderer }, - { ( "audren:u", 1), Service.AudRenGetAudioRendererWorkBufferSize }, - { ( "friend:a", 0), Service.FriendCreateFriendService }, - { ( "fsp-srv", 1), Service.FspSrvInitialize }, - { ( "fsp-srv", 18), Service.FspSrvMountSdCard }, - { ( "fsp-srv", 51), Service.FspSrvMountSaveData }, - { ( "fsp-srv", 200), Service.FspSrvOpenDataStorageByCurrentProcess }, - { ( "fsp-srv", 203), Service.FspSrvOpenRomStorage }, - { ( "fsp-srv", 1005), Service.FspSrvGetGlobalAccessLogMode }, - { ( "hid", 0), Service.HidCreateAppletResource }, - { ( "hid", 11), Service.HidActivateTouchScreen }, - { ( "hid", 100), Service.HidSetSupportedNpadStyleSet }, - { ( "hid", 101), Service.HidGetSupportedNpadStyleSet }, - { ( "hid", 102), Service.HidSetSupportedNpadIdType }, - { ( "hid", 103), Service.HidActivateNpad }, - { ( "hid", 120), Service.HidSetNpadJoyHoldType }, - { ( "hid", 121), Service.HidGetNpadJoyHoldType }, - { ( "hid", 203), Service.HidCreateActiveVibrationDeviceList }, - { ( "lm", 0), Service.LmInitialize }, - { ( "nvdrv", 0), Service.NvDrvOpen }, - { ( "nvdrv", 1), Service.NvDrvIoctl }, - { ( "nvdrv", 2), Service.NvDrvClose }, - { ( "nvdrv", 3), Service.NvDrvInitialize }, - { ( "nvdrv", 4), Service.NvDrvQueryEvent }, - { ( "nvdrv", 8), Service.NvDrvSetClientPid }, - { ( "nvdrv:a", 0), Service.NvDrvOpen }, - { ( "nvdrv:a", 1), Service.NvDrvIoctl }, - { ( "nvdrv:a", 2), Service.NvDrvClose }, - { ( "nvdrv:a", 3), Service.NvDrvInitialize }, - { ( "nvdrv:a", 4), Service.NvDrvQueryEvent }, - { ( "nvdrv:a", 8), Service.NvDrvSetClientPid }, - { ( "pctl:a", 0), Service.PctlCreateService }, - { ( "pl:u", 1), Service.PlGetLoadState }, - { ( "pl:u", 2), Service.PlGetFontSize }, - { ( "pl:u", 3), Service.PlGetSharedMemoryAddressOffset }, - { ( "pl:u", 4), Service.PlGetSharedMemoryNativeHandle }, - { ( "set", 1), Service.SetGetAvailableLanguageCodes }, - { ( "sm:", 0), Service.SmInitialize }, - { ( "sm:", 1), Service.SmGetService }, - { ( "time:u", 0), Service.TimeGetStandardUserSystemClock }, - { ( "time:u", 1), Service.TimeGetStandardNetworkSystemClock }, - { ( "time:u", 2), Service.TimeGetStandardSteadyClock }, - { ( "time:u", 3), Service.TimeGetTimeZoneService }, - { ( "time:u", 4), Service.TimeGetStandardLocalSystemClock }, - { ( "time:s", 0), Service.TimeGetStandardUserSystemClock }, - { ( "time:s", 1), Service.TimeGetStandardNetworkSystemClock }, - { ( "time:s", 2), Service.TimeGetStandardSteadyClock }, - { ( "time:s", 3), Service.TimeGetTimeZoneService }, - { ( "time:s", 4), Service.TimeGetStandardLocalSystemClock }, - { ( "vi:m", 2), Service.ViGetDisplayService }, - }; - private const long SfciMagic = 'S' << 0 | 'F' << 8 | 'C' << 16 | 'I' << 24; private const long SfcoMagic = 'S' << 0 | 'F' << 8 | 'C' << 16 | 'O' << 24; @@ -94,7 +28,7 @@ namespace Ryujinx.Core.OsHle.Ipc if (Request.Type == IpcMessageType.Request) { - string ServiceName = Session.ServiceName; + string ServiceName = Session.Service.GetType().Name; ServiceProcessRequest ProcReq = null; @@ -113,13 +47,13 @@ namespace Ryujinx.Core.OsHle.Ipc if (Obj is HDomain) { - ServiceCmds.TryGetValue((ServiceName, CmdId), out ProcReq); + Session.Service.Commands.TryGetValue(CmdId, out ProcReq); DbgServiceName = $"{ProcReq?.Method.Name ?? CmdId.ToString()}"; } else if (Obj != null) { - ((IIpcInterface)Obj).Commands.TryGetValue(CmdId, out ProcReq); + ((IIpcService)Obj).Commands.TryGetValue(CmdId, out ProcReq); DbgServiceName = $"{Obj.GetType().Name} {ProcReq?.Method.Name ?? CmdId.ToString()}"; } @@ -142,13 +76,13 @@ namespace Ryujinx.Core.OsHle.Ipc { object Obj = ((HSessionObj)Session).Obj; - ((IIpcInterface)Obj).Commands.TryGetValue(CmdId, out ProcReq); + ((IIpcService)Obj).Commands.TryGetValue(CmdId, out ProcReq); DbgServiceName = $"{Obj.GetType().Name} {ProcReq?.Method.Name ?? CmdId.ToString()}"; } else { - ServiceCmds.TryGetValue((ServiceName, CmdId), out ProcReq); + Session.Service.Commands.TryGetValue(CmdId, out ProcReq); DbgServiceName = $"{ProcReq?.Method.Name ?? CmdId.ToString()}"; } diff --git a/Ryujinx.Core/OsHle/Objects/Acc/IManagerForApplication.cs b/Ryujinx.Core/OsHle/IpcServices/Acc/IManagerForApplication.cs similarity index 88% rename from Ryujinx.Core/OsHle/Objects/Acc/IManagerForApplication.cs rename to Ryujinx.Core/OsHle/IpcServices/Acc/IManagerForApplication.cs index afbfab240..ab491eac7 100644 --- a/Ryujinx.Core/OsHle/Objects/Acc/IManagerForApplication.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Acc/IManagerForApplication.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Acc +namespace Ryujinx.Core.OsHle.IpcServices.Acc { - class IManagerForApplication : IIpcInterface + class IManagerForApplication : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Acc/IProfile.cs b/Ryujinx.Core/OsHle/IpcServices/Acc/IProfile.cs similarity index 91% rename from Ryujinx.Core/OsHle/Objects/Acc/IProfile.cs rename to Ryujinx.Core/OsHle/IpcServices/Acc/IProfile.cs index 94d171833..77fe2b48c 100644 --- a/Ryujinx.Core/OsHle/Objects/Acc/IProfile.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Acc/IProfile.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Acc +namespace Ryujinx.Core.OsHle.IpcServices.Acc { - class IProfile : IIpcInterface + class IProfile : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/IpcServices/Acc/ServiceAcc.cs b/Ryujinx.Core/OsHle/IpcServices/Acc/ServiceAcc.cs new file mode 100644 index 000000000..8844bb5d1 --- /dev/null +++ b/Ryujinx.Core/OsHle/IpcServices/Acc/ServiceAcc.cs @@ -0,0 +1,49 @@ +using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; + +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; + +namespace Ryujinx.Core.OsHle.IpcServices.Acc +{ + class ServiceAcc : IIpcService + { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServiceAcc() + { + m_Commands = new Dictionary() + { + { 3, ListOpenUsers }, + { 5, GetProfile }, + { 100, InitializeApplicationInfo }, + { 101, GetBaasAccountManagerForApplication } + }; + } + + public long ListOpenUsers(ServiceCtx Context) + { + return 0; + } + + public long GetProfile(ServiceCtx Context) + { + MakeObject(Context, new IProfile()); + + return 0; + } + + public long InitializeApplicationInfo(ServiceCtx Context) + { + return 0; + } + + public long GetBaasAccountManagerForApplication(ServiceCtx Context) + { + MakeObject(Context, new IManagerForApplication()); + + return 0; + } + } +} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Objects/Am/IApplicationFunctions.cs b/Ryujinx.Core/OsHle/IpcServices/Am/IApplicationFunctions.cs similarity index 93% rename from Ryujinx.Core/OsHle/Objects/Am/IApplicationFunctions.cs rename to Ryujinx.Core/OsHle/IpcServices/Am/IApplicationFunctions.cs index 939ad2486..30020c1d8 100644 --- a/Ryujinx.Core/OsHle/Objects/Am/IApplicationFunctions.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Am/IApplicationFunctions.cs @@ -2,11 +2,11 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; using System.IO; -using static Ryujinx.Core.OsHle.Objects.ObjHelper; +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; -namespace Ryujinx.Core.OsHle.Objects.Am +namespace Ryujinx.Core.OsHle.IpcServices.Am { - class IApplicationFunctions : IIpcInterface + class IApplicationFunctions : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Am/IApplicationProxy.cs b/Ryujinx.Core/OsHle/IpcServices/Am/IApplicationProxy.cs similarity index 93% rename from Ryujinx.Core/OsHle/Objects/Am/IApplicationProxy.cs rename to Ryujinx.Core/OsHle/IpcServices/Am/IApplicationProxy.cs index 4a164daf1..5417d7f04 100644 --- a/Ryujinx.Core/OsHle/Objects/Am/IApplicationProxy.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Am/IApplicationProxy.cs @@ -1,11 +1,11 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -using static Ryujinx.Core.OsHle.Objects.ObjHelper; +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; -namespace Ryujinx.Core.OsHle.Objects.Am +namespace Ryujinx.Core.OsHle.IpcServices.Am { - class IApplicationProxy : IIpcInterface + class IApplicationProxy : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Am/IAudioController.cs b/Ryujinx.Core/OsHle/IpcServices/Am/IAudioController.cs similarity index 82% rename from Ryujinx.Core/OsHle/Objects/Am/IAudioController.cs rename to Ryujinx.Core/OsHle/IpcServices/Am/IAudioController.cs index c37042fdb..1212f1e24 100644 --- a/Ryujinx.Core/OsHle/Objects/Am/IAudioController.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Am/IAudioController.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Am +namespace Ryujinx.Core.OsHle.IpcServices.Am { - class IAudioController : IIpcInterface + class IAudioController : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Am/ICommonStateGetter.cs b/Ryujinx.Core/OsHle/IpcServices/Am/ICommonStateGetter.cs similarity index 95% rename from Ryujinx.Core/OsHle/Objects/Am/ICommonStateGetter.cs rename to Ryujinx.Core/OsHle/IpcServices/Am/ICommonStateGetter.cs index 83d61fa64..2999bbbae 100644 --- a/Ryujinx.Core/OsHle/Objects/Am/ICommonStateGetter.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Am/ICommonStateGetter.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Am +namespace Ryujinx.Core.OsHle.IpcServices.Am { - class ICommonStateGetter : IIpcInterface + class ICommonStateGetter : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Am/IDebugFunctions.cs b/Ryujinx.Core/OsHle/IpcServices/Am/IDebugFunctions.cs similarity index 82% rename from Ryujinx.Core/OsHle/Objects/Am/IDebugFunctions.cs rename to Ryujinx.Core/OsHle/IpcServices/Am/IDebugFunctions.cs index d04d8363f..944e58d81 100644 --- a/Ryujinx.Core/OsHle/Objects/Am/IDebugFunctions.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Am/IDebugFunctions.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Am +namespace Ryujinx.Core.OsHle.IpcServices.Am { - class IDebugFunctions : IIpcInterface + class IDebugFunctions : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Am/IDisplayController.cs b/Ryujinx.Core/OsHle/IpcServices/Am/IDisplayController.cs similarity index 82% rename from Ryujinx.Core/OsHle/Objects/Am/IDisplayController.cs rename to Ryujinx.Core/OsHle/IpcServices/Am/IDisplayController.cs index 9eafa70dc..979e842a6 100644 --- a/Ryujinx.Core/OsHle/Objects/Am/IDisplayController.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Am/IDisplayController.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Am +namespace Ryujinx.Core.OsHle.IpcServices.Am { - class IDisplayController : IIpcInterface + class IDisplayController : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Am/ILibraryAppletCreator.cs b/Ryujinx.Core/OsHle/IpcServices/Am/ILibraryAppletCreator.cs similarity index 82% rename from Ryujinx.Core/OsHle/Objects/Am/ILibraryAppletCreator.cs rename to Ryujinx.Core/OsHle/IpcServices/Am/ILibraryAppletCreator.cs index 10e0f4f4a..9f5b5e69c 100644 --- a/Ryujinx.Core/OsHle/Objects/Am/ILibraryAppletCreator.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Am/ILibraryAppletCreator.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Am +namespace Ryujinx.Core.OsHle.IpcServices.Am { - class ILibraryAppletCreator : IIpcInterface + class ILibraryAppletCreator : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Am/ISelfController.cs b/Ryujinx.Core/OsHle/IpcServices/Am/ISelfController.cs similarity index 95% rename from Ryujinx.Core/OsHle/Objects/Am/ISelfController.cs rename to Ryujinx.Core/OsHle/IpcServices/Am/ISelfController.cs index 712874e87..90ddd54b8 100644 --- a/Ryujinx.Core/OsHle/Objects/Am/ISelfController.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Am/ISelfController.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Am +namespace Ryujinx.Core.OsHle.IpcServices.Am { - class ISelfController : IIpcInterface + class ISelfController : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Am/IStorage.cs b/Ryujinx.Core/OsHle/IpcServices/Am/IStorage.cs similarity index 83% rename from Ryujinx.Core/OsHle/Objects/Am/IStorage.cs rename to Ryujinx.Core/OsHle/IpcServices/Am/IStorage.cs index b30059ba2..375b960b1 100644 --- a/Ryujinx.Core/OsHle/Objects/Am/IStorage.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Am/IStorage.cs @@ -1,11 +1,11 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -using static Ryujinx.Core.OsHle.Objects.ObjHelper; +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; -namespace Ryujinx.Core.OsHle.Objects.Am +namespace Ryujinx.Core.OsHle.IpcServices.Am { - class IStorage : IIpcInterface + class IStorage : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Am/IStorageAccessor.cs b/Ryujinx.Core/OsHle/IpcServices/Am/IStorageAccessor.cs similarity index 94% rename from Ryujinx.Core/OsHle/Objects/Am/IStorageAccessor.cs rename to Ryujinx.Core/OsHle/IpcServices/Am/IStorageAccessor.cs index df260cc3e..6d83e6f94 100644 --- a/Ryujinx.Core/OsHle/Objects/Am/IStorageAccessor.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Am/IStorageAccessor.cs @@ -3,9 +3,9 @@ using Ryujinx.Core.OsHle.Ipc; using System; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Am +namespace Ryujinx.Core.OsHle.IpcServices.Am { - class IStorageAccessor : IIpcInterface + class IStorageAccessor : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Am/IWindowController.cs b/Ryujinx.Core/OsHle/IpcServices/Am/IWindowController.cs similarity index 89% rename from Ryujinx.Core/OsHle/Objects/Am/IWindowController.cs rename to Ryujinx.Core/OsHle/IpcServices/Am/IWindowController.cs index aa6e961e0..ddc73bced 100644 --- a/Ryujinx.Core/OsHle/Objects/Am/IWindowController.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Am/IWindowController.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Am +namespace Ryujinx.Core.OsHle.IpcServices.Am { - class IWindowController : IIpcInterface + class IWindowController : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/IpcServices/Am/ServiceAppletOE.cs b/Ryujinx.Core/OsHle/IpcServices/Am/ServiceAppletOE.cs new file mode 100644 index 000000000..b60c93dd5 --- /dev/null +++ b/Ryujinx.Core/OsHle/IpcServices/Am/ServiceAppletOE.cs @@ -0,0 +1,29 @@ +using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; + +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; + +namespace Ryujinx.Core.OsHle.IpcServices.Am +{ + class ServiceAppletOE : IIpcService + { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServiceAppletOE() + { + m_Commands = new Dictionary() + { + { 0, OpenApplicationProxy } + }; + } + + public long OpenApplicationProxy(ServiceCtx Context) + { + MakeObject(Context, new IApplicationProxy()); + + return 0; + } + } +} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Objects/Android/GbpBuffer.cs b/Ryujinx.Core/OsHle/IpcServices/Android/GbpBuffer.cs similarity index 97% rename from Ryujinx.Core/OsHle/Objects/Android/GbpBuffer.cs rename to Ryujinx.Core/OsHle/IpcServices/Android/GbpBuffer.cs index edd115237..5fe585d06 100644 --- a/Ryujinx.Core/OsHle/Objects/Android/GbpBuffer.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Android/GbpBuffer.cs @@ -1,6 +1,6 @@ using System.IO; -namespace Ryujinx.Core.OsHle.Objects.Android +namespace Ryujinx.Core.OsHle.IpcServices.Android { struct GbpBuffer { diff --git a/Ryujinx.Core/OsHle/Objects/Android/NvFlinger.cs b/Ryujinx.Core/OsHle/IpcServices/Android/NvFlinger.cs similarity index 99% rename from Ryujinx.Core/OsHle/Objects/Android/NvFlinger.cs rename to Ryujinx.Core/OsHle/IpcServices/Android/NvFlinger.cs index 11069cb22..85a06cea4 100644 --- a/Ryujinx.Core/OsHle/Objects/Android/NvFlinger.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Android/NvFlinger.cs @@ -6,9 +6,9 @@ using System.Collections.Generic; using System.Text; using System.Threading; -using static Ryujinx.Core.OsHle.Objects.Android.Parcel; +using static Ryujinx.Core.OsHle.IpcServices.Android.Parcel; -namespace Ryujinx.Core.OsHle.Objects.Android +namespace Ryujinx.Core.OsHle.IpcServices.Android { class NvFlinger : IDisposable { diff --git a/Ryujinx.Core/OsHle/Objects/Android/Parcel.cs b/Ryujinx.Core/OsHle/IpcServices/Android/Parcel.cs similarity index 96% rename from Ryujinx.Core/OsHle/Objects/Android/Parcel.cs rename to Ryujinx.Core/OsHle/IpcServices/Android/Parcel.cs index cd7179e1e..3404c227e 100644 --- a/Ryujinx.Core/OsHle/Objects/Android/Parcel.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Android/Parcel.cs @@ -1,7 +1,7 @@ using System; using System.IO; -namespace Ryujinx.Core.OsHle.Objects.Android +namespace Ryujinx.Core.OsHle.IpcServices.Android { static class Parcel { diff --git a/Ryujinx.Core/OsHle/Objects/Apm/ISession.cs b/Ryujinx.Core/OsHle/IpcServices/Apm/ISession.cs similarity index 89% rename from Ryujinx.Core/OsHle/Objects/Apm/ISession.cs rename to Ryujinx.Core/OsHle/IpcServices/Apm/ISession.cs index 3ab330055..500f7596c 100644 --- a/Ryujinx.Core/OsHle/Objects/Apm/ISession.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Apm/ISession.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Apm +namespace Ryujinx.Core.OsHle.IpcServices.Apm { - class ISession : IIpcInterface + class ISession : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/IpcServices/Apm/ServiceApm.cs b/Ryujinx.Core/OsHle/IpcServices/Apm/ServiceApm.cs new file mode 100644 index 000000000..d6c0400ac --- /dev/null +++ b/Ryujinx.Core/OsHle/IpcServices/Apm/ServiceApm.cs @@ -0,0 +1,29 @@ +using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; + +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; + +namespace Ryujinx.Core.OsHle.IpcServices.Apm +{ + class ServiceApm : IIpcService + { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServiceApm() + { + m_Commands = new Dictionary() + { + { 0, OpenSession } + }; + } + + public long OpenSession(ServiceCtx Context) + { + MakeObject(Context, new ISession()); + + return 0; + } + } +} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Objects/Aud/IAudioOut.cs b/Ryujinx.Core/OsHle/IpcServices/Aud/IAudioOut.cs similarity index 98% rename from Ryujinx.Core/OsHle/Objects/Aud/IAudioOut.cs rename to Ryujinx.Core/OsHle/IpcServices/Aud/IAudioOut.cs index 061c63763..a45b23ccd 100644 --- a/Ryujinx.Core/OsHle/Objects/Aud/IAudioOut.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Aud/IAudioOut.cs @@ -7,9 +7,9 @@ using System; using System.Collections.Generic; using System.IO; -namespace Ryujinx.Core.OsHle.Objects.Aud +namespace Ryujinx.Core.OsHle.IpcServices.Aud { - class IAudioOut : IIpcInterface + class IAudioOut : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Aud/IAudioRenderer.cs b/Ryujinx.Core/OsHle/IpcServices/Aud/IAudioRenderer.cs similarity index 96% rename from Ryujinx.Core/OsHle/Objects/Aud/IAudioRenderer.cs rename to Ryujinx.Core/OsHle/IpcServices/Aud/IAudioRenderer.cs index 053564773..bfde0b65b 100644 --- a/Ryujinx.Core/OsHle/Objects/Aud/IAudioRenderer.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Aud/IAudioRenderer.cs @@ -2,9 +2,9 @@ using Ryujinx.Core.OsHle.Handles; using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Aud +namespace Ryujinx.Core.OsHle.IpcServices.Aud { - class IAudioRenderer : IIpcInterface + class IAudioRenderer : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/IpcServices/Aud/ServiceAudOut.cs b/Ryujinx.Core/OsHle/IpcServices/Aud/ServiceAudOut.cs new file mode 100644 index 000000000..eb923562b --- /dev/null +++ b/Ryujinx.Core/OsHle/IpcServices/Aud/ServiceAudOut.cs @@ -0,0 +1,57 @@ +using ChocolArm64.Memory; +using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; +using System.Text; + +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; + +namespace Ryujinx.Core.OsHle.IpcServices.Aud +{ + class ServiceAudOut : IIpcService + { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServiceAudOut() + { + m_Commands = new Dictionary() + { + { 0, ListAudioOuts }, + { 1, OpenAudioOut }, + }; + } + + public long ListAudioOuts(ServiceCtx Context) + { + long Position = Context.Request.ReceiveBuff[0].Position; + + AMemoryHelper.WriteBytes(Context.Memory, Position, Encoding.ASCII.GetBytes("iface")); + + Context.ResponseData.Write(1); + + return 0; + } + + public long OpenAudioOut(ServiceCtx Context) + { + MakeObject(Context, new IAudioOut()); + + Context.ResponseData.Write(48000); //Sample Rate + Context.ResponseData.Write(2); //Channel Count + Context.ResponseData.Write(2); //PCM Format + /* + 0 - Invalid + 1 - INT8 + 2 - INT16 + 3 - INT24 + 4 - INT32 + 5 - PCM Float + 6 - ADPCM + */ + Context.ResponseData.Write(0); //Unknown + + return 0; + } + } +} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/IpcServices/Aud/ServiceAudRen.cs b/Ryujinx.Core/OsHle/IpcServices/Aud/ServiceAudRen.cs new file mode 100644 index 000000000..eccc699c4 --- /dev/null +++ b/Ryujinx.Core/OsHle/IpcServices/Aud/ServiceAudRen.cs @@ -0,0 +1,51 @@ +using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; + +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; + +namespace Ryujinx.Core.OsHle.IpcServices.Aud +{ + class ServiceAudRen : IIpcService + { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServiceAudRen() + { + m_Commands = new Dictionary() + { + { 0, OpenAudioRenderer }, + { 1, GetAudioRendererWorkBufferSize }, + }; + } + + public long OpenAudioRenderer(ServiceCtx Context) + { + MakeObject(Context, new IAudioRenderer()); + + return 0; + } + + public long GetAudioRendererWorkBufferSize(ServiceCtx Context) + { + int SampleRate = Context.RequestData.ReadInt32(); + int Unknown4 = Context.RequestData.ReadInt32(); + int Unknown8 = Context.RequestData.ReadInt32(); + int UnknownC = Context.RequestData.ReadInt32(); + int Unknown10 = Context.RequestData.ReadInt32(); + int Unknown14 = Context.RequestData.ReadInt32(); + int Unknown18 = Context.RequestData.ReadInt32(); + int Unknown1c = Context.RequestData.ReadInt32(); + int Unknown20 = Context.RequestData.ReadInt32(); + int Unknown24 = Context.RequestData.ReadInt32(); + int Unknown28 = Context.RequestData.ReadInt32(); + int Unknown2c = Context.RequestData.ReadInt32(); + int Rev1Magic = Context.RequestData.ReadInt32(); + + Context.ResponseData.Write(0x400L); + + return 0; + } + } +} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Objects/ErrorCode.cs b/Ryujinx.Core/OsHle/IpcServices/ErrorCode.cs similarity index 81% rename from Ryujinx.Core/OsHle/Objects/ErrorCode.cs rename to Ryujinx.Core/OsHle/IpcServices/ErrorCode.cs index 659ed8b94..a4e197b22 100644 --- a/Ryujinx.Core/OsHle/Objects/ErrorCode.cs +++ b/Ryujinx.Core/OsHle/IpcServices/ErrorCode.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.Core.OsHle.Objects +namespace Ryujinx.Core.OsHle.IpcServices { static class ErrorCode { diff --git a/Ryujinx.Core/OsHle/Objects/ErrorModule.cs b/Ryujinx.Core/OsHle/IpcServices/ErrorModule.cs similarity index 55% rename from Ryujinx.Core/OsHle/Objects/ErrorModule.cs rename to Ryujinx.Core/OsHle/IpcServices/ErrorModule.cs index 0221031b4..0d15db60a 100644 --- a/Ryujinx.Core/OsHle/Objects/ErrorModule.cs +++ b/Ryujinx.Core/OsHle/IpcServices/ErrorModule.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.Core.OsHle.Objects +namespace Ryujinx.Core.OsHle.IpcServices { enum ErrorModule { diff --git a/Ryujinx.Core/OsHle/Objects/Friend/IFriendService.cs b/Ryujinx.Core/OsHle/IpcServices/Friend/IFriendService.cs similarity index 82% rename from Ryujinx.Core/OsHle/Objects/Friend/IFriendService.cs rename to Ryujinx.Core/OsHle/IpcServices/Friend/IFriendService.cs index e98e27cad..e3e03da85 100644 --- a/Ryujinx.Core/OsHle/Objects/Friend/IFriendService.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Friend/IFriendService.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Friend +namespace Ryujinx.Core.OsHle.IpcServices.Friend { - class IFriendService : IIpcInterface + class IFriendService : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/IpcServices/Friend/ServiceFriend.cs b/Ryujinx.Core/OsHle/IpcServices/Friend/ServiceFriend.cs new file mode 100644 index 000000000..674877f67 --- /dev/null +++ b/Ryujinx.Core/OsHle/IpcServices/Friend/ServiceFriend.cs @@ -0,0 +1,29 @@ +using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; + +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; + +namespace Ryujinx.Core.OsHle.IpcServices.Friend +{ + class ServiceFriend : IIpcService + { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServiceFriend() + { + m_Commands = new Dictionary() + { + { 0, CreateFriendService } + }; + } + + public static long CreateFriendService(ServiceCtx Context) + { + MakeObject(Context, new IFriendService()); + + return 0; + } + } +} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Objects/FspSrv/FsErr.cs b/Ryujinx.Core/OsHle/IpcServices/FspSrv/FsErr.cs similarity index 79% rename from Ryujinx.Core/OsHle/Objects/FspSrv/FsErr.cs rename to Ryujinx.Core/OsHle/IpcServices/FspSrv/FsErr.cs index d9aa60ae7..656d529f2 100644 --- a/Ryujinx.Core/OsHle/Objects/FspSrv/FsErr.cs +++ b/Ryujinx.Core/OsHle/IpcServices/FspSrv/FsErr.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.Core.OsHle.Objects.FspSrv +namespace Ryujinx.Core.OsHle.IpcServices.FspSrv { static class FsErr { diff --git a/Ryujinx.Core/OsHle/Objects/FspSrv/IDirectory.cs b/Ryujinx.Core/OsHle/IpcServices/FspSrv/IDirectory.cs similarity index 97% rename from Ryujinx.Core/OsHle/Objects/FspSrv/IDirectory.cs rename to Ryujinx.Core/OsHle/IpcServices/FspSrv/IDirectory.cs index 785b1ba38..54dbec746 100644 --- a/Ryujinx.Core/OsHle/Objects/FspSrv/IDirectory.cs +++ b/Ryujinx.Core/OsHle/IpcServices/FspSrv/IDirectory.cs @@ -5,9 +5,9 @@ using System.Collections.Generic; using System.IO; using System.Text; -namespace Ryujinx.Core.OsHle.Objects.FspSrv +namespace Ryujinx.Core.OsHle.IpcServices.FspSrv { - class IDirectory : IIpcInterface, IDisposable + class IDirectory : IIpcService, IDisposable { private const int DirectoryEntrySize = 0x310; diff --git a/Ryujinx.Core/OsHle/Objects/FspSrv/IFile.cs b/Ryujinx.Core/OsHle/IpcServices/FspSrv/IFile.cs similarity index 96% rename from Ryujinx.Core/OsHle/Objects/FspSrv/IFile.cs rename to Ryujinx.Core/OsHle/IpcServices/FspSrv/IFile.cs index 82706f609..ac2100f29 100644 --- a/Ryujinx.Core/OsHle/Objects/FspSrv/IFile.cs +++ b/Ryujinx.Core/OsHle/IpcServices/FspSrv/IFile.cs @@ -4,9 +4,9 @@ using System; using System.Collections.Generic; using System.IO; -namespace Ryujinx.Core.OsHle.Objects.FspSrv +namespace Ryujinx.Core.OsHle.IpcServices.FspSrv { - class IFile : IIpcInterface, IDisposable + class IFile : IIpcService, IDisposable { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/FspSrv/IFileSystem.cs b/Ryujinx.Core/OsHle/IpcServices/FspSrv/IFileSystem.cs similarity index 98% rename from Ryujinx.Core/OsHle/Objects/FspSrv/IFileSystem.cs rename to Ryujinx.Core/OsHle/IpcServices/FspSrv/IFileSystem.cs index 6b86a4739..ee9de8bc8 100644 --- a/Ryujinx.Core/OsHle/Objects/FspSrv/IFileSystem.cs +++ b/Ryujinx.Core/OsHle/IpcServices/FspSrv/IFileSystem.cs @@ -4,12 +4,12 @@ using System; using System.Collections.Generic; using System.IO; -using static Ryujinx.Core.OsHle.Objects.ErrorCode; -using static Ryujinx.Core.OsHle.Objects.ObjHelper; +using static Ryujinx.Core.OsHle.IpcServices.ErrorCode; +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; -namespace Ryujinx.Core.OsHle.Objects.FspSrv +namespace Ryujinx.Core.OsHle.IpcServices.FspSrv { - class IFileSystem : IIpcInterface + class IFileSystem : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/FspSrv/IStorage.cs b/Ryujinx.Core/OsHle/IpcServices/FspSrv/IStorage.cs similarity index 94% rename from Ryujinx.Core/OsHle/Objects/FspSrv/IStorage.cs rename to Ryujinx.Core/OsHle/IpcServices/FspSrv/IStorage.cs index 4eca37e8e..297461a04 100644 --- a/Ryujinx.Core/OsHle/Objects/FspSrv/IStorage.cs +++ b/Ryujinx.Core/OsHle/IpcServices/FspSrv/IStorage.cs @@ -3,9 +3,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; using System.IO; -namespace Ryujinx.Core.OsHle.Objects.FspSrv +namespace Ryujinx.Core.OsHle.IpcServices.FspSrv { - class IStorage : IIpcInterface + class IStorage : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/IpcServices/FspSrv/ServiceFspSrv.cs b/Ryujinx.Core/OsHle/IpcServices/FspSrv/ServiceFspSrv.cs new file mode 100644 index 000000000..991f40272 --- /dev/null +++ b/Ryujinx.Core/OsHle/IpcServices/FspSrv/ServiceFspSrv.cs @@ -0,0 +1,67 @@ +using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; + +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; + +namespace Ryujinx.Core.OsHle.IpcServices.FspSrv +{ + class ServiceFspSrv : IIpcService + { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServiceFspSrv() + { + m_Commands = new Dictionary() + { + { 1, Initialize }, + { 18, MountSdCard }, + { 51, MountSaveData }, + { 200, OpenDataStorageByCurrentProcess }, + { 203, OpenRomStorage }, + { 1005, GetGlobalAccessLogMode } + }; + } + + public long Initialize(ServiceCtx Context) + { + return 0; + } + + public long MountSdCard(ServiceCtx Context) + { + MakeObject(Context, new IFileSystem(Context.Ns.VFs.GetSdCardPath())); + + return 0; + } + + public long MountSaveData(ServiceCtx Context) + { + MakeObject(Context, new IFileSystem(Context.Ns.VFs.GetGameSavesPath())); + + return 0; + } + + public long OpenDataStorageByCurrentProcess(ServiceCtx Context) + { + MakeObject(Context, new IStorage(Context.Ns.VFs.RomFs)); + + return 0; + } + + public long OpenRomStorage(ServiceCtx Context) + { + MakeObject(Context, new IStorage(Context.Ns.VFs.RomFs)); + + return 0; + } + + public long GetGlobalAccessLogMode(ServiceCtx Context) + { + Context.ResponseData.Write(0); + + return 0; + } + } +} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Objects/Hid/IActiveVibrationDeviceList.cs b/Ryujinx.Core/OsHle/IpcServices/Hid/IActiveVibrationDeviceList.cs similarity index 79% rename from Ryujinx.Core/OsHle/Objects/Hid/IActiveVibrationDeviceList.cs rename to Ryujinx.Core/OsHle/IpcServices/Hid/IActiveVibrationDeviceList.cs index aae3c38d3..020e8e7e6 100644 --- a/Ryujinx.Core/OsHle/Objects/Hid/IActiveVibrationDeviceList.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Hid/IActiveVibrationDeviceList.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Hid +namespace Ryujinx.Core.OsHle.IpcServices.Hid { - class IActiveApplicationDeviceList : IIpcInterface + class IActiveApplicationDeviceList : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Hid/IAppletResource.cs b/Ryujinx.Core/OsHle/IpcServices/Hid/IAppletResource.cs similarity index 89% rename from Ryujinx.Core/OsHle/Objects/Hid/IAppletResource.cs rename to Ryujinx.Core/OsHle/IpcServices/Hid/IAppletResource.cs index 7d56d04ba..d22e0ff23 100644 --- a/Ryujinx.Core/OsHle/Objects/Hid/IAppletResource.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Hid/IAppletResource.cs @@ -2,9 +2,9 @@ using Ryujinx.Core.OsHle.Handles; using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Hid +namespace Ryujinx.Core.OsHle.IpcServices.Hid { - class IAppletResource : IIpcInterface + class IAppletResource : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/IpcServices/Hid/ServiceHid.cs b/Ryujinx.Core/OsHle/IpcServices/Hid/ServiceHid.cs new file mode 100644 index 000000000..5cca9319e --- /dev/null +++ b/Ryujinx.Core/OsHle/IpcServices/Hid/ServiceHid.cs @@ -0,0 +1,98 @@ +using Ryujinx.Core.OsHle.Handles; +using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; + +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; + +namespace Ryujinx.Core.OsHle.IpcServices.Hid +{ + class ServiceHid : IIpcService + { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServiceHid() + { + m_Commands = new Dictionary() + { + { 0, CreateAppletResource }, + { 11, ActivateTouchScreen }, + { 100, SetSupportedNpadStyleSet }, + { 101, GetSupportedNpadStyleSet }, + { 102, SetSupportedNpadIdType }, + { 103, ActivateNpad }, + { 120, SetNpadJoyHoldType }, + { 121, GetNpadJoyHoldType }, + { 203, CreateActiveVibrationDeviceList }, + }; + } + + public long CreateAppletResource(ServiceCtx Context) + { + HSharedMem HidHndData = Context.Ns.Os.Handles.GetData(Context.Ns.Os.HidHandle); + + MakeObject(Context, new IAppletResource(HidHndData)); + + return 0; + } + + public long ActivateTouchScreen(ServiceCtx Context) + { + long Unknown = Context.RequestData.ReadInt64(); + + return 0; + } + + public long GetSupportedNpadStyleSet(ServiceCtx Context) + { + Context.ResponseData.Write(0); + + return 0; + } + + public long SetSupportedNpadStyleSet(ServiceCtx Context) + { + long Unknown0 = Context.RequestData.ReadInt64(); + long Unknown8 = Context.RequestData.ReadInt64(); + + return 0; + } + + public long SetSupportedNpadIdType(ServiceCtx Context) + { + long Unknown = Context.RequestData.ReadInt64(); + + return 0; + } + + public long ActivateNpad(ServiceCtx Context) + { + long Unknown = Context.RequestData.ReadInt64(); + + return 0; + } + + public long SetNpadJoyHoldType(ServiceCtx Context) + { + long Unknown0 = Context.RequestData.ReadInt64(); + long Unknown8 = Context.RequestData.ReadInt64(); + + return 0; + } + + public long GetNpadJoyHoldType(ServiceCtx Context) + { + Context.ResponseData.Write(0L); + + return 0; + } + + public long CreateActiveVibrationDeviceList(ServiceCtx Context) + { + MakeObject(Context, new IActiveApplicationDeviceList()); + + return 0; + } + } +} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Objects/IIpcInterface.cs b/Ryujinx.Core/OsHle/IpcServices/IIpcService.cs similarity index 69% rename from Ryujinx.Core/OsHle/Objects/IIpcInterface.cs rename to Ryujinx.Core/OsHle/IpcServices/IIpcService.cs index c57a09748..eebcdfbe5 100644 --- a/Ryujinx.Core/OsHle/Objects/IIpcInterface.cs +++ b/Ryujinx.Core/OsHle/IpcServices/IIpcService.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects +namespace Ryujinx.Core.OsHle.IpcServices { - interface IIpcInterface + interface IIpcService { IReadOnlyDictionary Commands { get; } } diff --git a/Ryujinx.Core/OsHle/IpcServices/Lm/ServiceLm.cs b/Ryujinx.Core/OsHle/IpcServices/Lm/ServiceLm.cs new file mode 100644 index 000000000..e665253c1 --- /dev/null +++ b/Ryujinx.Core/OsHle/IpcServices/Lm/ServiceLm.cs @@ -0,0 +1,27 @@ +using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; + +namespace Ryujinx.Core.OsHle.IpcServices.Lm +{ + class ServiceLm : IIpcService + { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServiceLm() + { + m_Commands = new Dictionary() + { + { 0, Initialize } + }; + } + + public long Initialize(ServiceCtx Context) + { + Context.Session.Initialize(); + + return 0; + } + } +} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Services/ServiceNvDrv.cs b/Ryujinx.Core/OsHle/IpcServices/NvServices/ServiceNvDrv.cs similarity index 94% rename from Ryujinx.Core/OsHle/Services/ServiceNvDrv.cs rename to Ryujinx.Core/OsHle/IpcServices/NvServices/ServiceNvDrv.cs index 6c5fdaedd..1de0ab706 100644 --- a/Ryujinx.Core/OsHle/Services/ServiceNvDrv.cs +++ b/Ryujinx.Core/OsHle/IpcServices/NvServices/ServiceNvDrv.cs @@ -6,14 +6,14 @@ using Ryujinx.Graphics.Gpu; using System; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Services +namespace Ryujinx.Core.OsHle.IpcServices.NvServices { - static partial class Service + class ServiceNvDrv : IIpcService { - private delegate long ServiceProcessRequest(ServiceCtx Context); + private delegate long ServiceProcessIoctl(ServiceCtx Context); - private static Dictionary<(string, int), ServiceProcessRequest> IoctlCmds = - new Dictionary<(string, int), ServiceProcessRequest>() + private static Dictionary<(string, int), ServiceProcessIoctl> IoctlCmds = + new Dictionary<(string, int), ServiceProcessIoctl>() { { ("/dev/nvhost-as-gpu", 0x4101), NvGpuAsIoctlBindChannel }, { ("/dev/nvhost-as-gpu", 0x4102), NvGpuAsIoctlAllocSpace }, @@ -42,7 +42,24 @@ namespace Ryujinx.Core.OsHle.Services { ("/dev/nvmap", 0x010e), NvMapIocGetId }, }; - public static long NvDrvOpen(ServiceCtx Context) + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServiceNvDrv() + { + m_Commands = new Dictionary() + { + { 0, Open }, + { 1, Ioctl }, + { 2, Close }, + { 3, Initialize }, + { 4, QueryEvent }, + { 8, SetClientPid }, + }; + } + + public static long Open(ServiceCtx Context) { long NamePtr = Context.Request.SendBuff[0].Position; @@ -56,7 +73,7 @@ namespace Ryujinx.Core.OsHle.Services return 0; } - public static long NvDrvIoctl(ServiceCtx Context) + public static long Ioctl(ServiceCtx Context) { int Fd = Context.RequestData.ReadInt32(); int Cmd = Context.RequestData.ReadInt32() & 0xffff; @@ -67,7 +84,7 @@ namespace Ryujinx.Core.OsHle.Services Context.ResponseData.Write(0); - if (IoctlCmds.TryGetValue((FdData.Name, Cmd), out ServiceProcessRequest ProcReq)) + if (IoctlCmds.TryGetValue((FdData.Name, Cmd), out ServiceProcessIoctl ProcReq)) { return ProcReq(Context); } @@ -77,7 +94,7 @@ namespace Ryujinx.Core.OsHle.Services } } - public static long NvDrvClose(ServiceCtx Context) + public static long Close(ServiceCtx Context) { int Fd = Context.RequestData.ReadInt32(); @@ -88,7 +105,7 @@ namespace Ryujinx.Core.OsHle.Services return 0; } - public static long NvDrvInitialize(ServiceCtx Context) + public static long Initialize(ServiceCtx Context) { long TransferMemSize = Context.RequestData.ReadInt64(); int TransferMemHandle = Context.Request.HandleDesc.ToCopy[0]; @@ -98,7 +115,7 @@ namespace Ryujinx.Core.OsHle.Services return 0; } - public static long NvDrvQueryEvent(ServiceCtx Context) + public static long QueryEvent(ServiceCtx Context) { int Fd = Context.RequestData.ReadInt32(); int EventId = Context.RequestData.ReadInt32(); @@ -110,7 +127,7 @@ namespace Ryujinx.Core.OsHle.Services return 0; } - public static long NvDrvSetClientPid(ServiceCtx Context) + public static long SetClientPid(ServiceCtx Context) { long Pid = Context.RequestData.ReadInt64(); diff --git a/Ryujinx.Core/OsHle/Objects/ObjHelper.cs b/Ryujinx.Core/OsHle/IpcServices/ObjHelper.cs similarity index 93% rename from Ryujinx.Core/OsHle/Objects/ObjHelper.cs rename to Ryujinx.Core/OsHle/IpcServices/ObjHelper.cs index a151a2879..ff71838a6 100644 --- a/Ryujinx.Core/OsHle/Objects/ObjHelper.cs +++ b/Ryujinx.Core/OsHle/IpcServices/ObjHelper.cs @@ -1,7 +1,7 @@ using Ryujinx.Core.OsHle.Handles; using Ryujinx.Core.OsHle.Ipc; -namespace Ryujinx.Core.OsHle.Objects +namespace Ryujinx.Core.OsHle.IpcServices { static class ObjHelper { diff --git a/Ryujinx.Core/OsHle/Objects/Am/IParentalControlService.cs b/Ryujinx.Core/OsHle/IpcServices/Pctl/IParentalControlService.cs similarity index 81% rename from Ryujinx.Core/OsHle/Objects/Am/IParentalControlService.cs rename to Ryujinx.Core/OsHle/IpcServices/Pctl/IParentalControlService.cs index 1feacfa64..4eb92d31d 100644 --- a/Ryujinx.Core/OsHle/Objects/Am/IParentalControlService.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Pctl/IParentalControlService.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Am +namespace Ryujinx.Core.OsHle.IpcServices.Pctl { - class IParentalControlService : IIpcInterface + class IParentalControlService : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/IpcServices/Pctl/ServicePctl.cs b/Ryujinx.Core/OsHle/IpcServices/Pctl/ServicePctl.cs new file mode 100644 index 000000000..2d5e22a46 --- /dev/null +++ b/Ryujinx.Core/OsHle/IpcServices/Pctl/ServicePctl.cs @@ -0,0 +1,29 @@ +using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; + +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; + +namespace Ryujinx.Core.OsHle.IpcServices.Pctl +{ + class ServicePctl : IIpcService + { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServicePctl() + { + m_Commands = new Dictionary() + { + { 0, CreateService } + }; + } + + public static long CreateService(ServiceCtx Context) + { + MakeObject(Context, new IParentalControlService()); + + return 0; + } + } +} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/IpcServices/Pl/ServicePl.cs b/Ryujinx.Core/OsHle/IpcServices/Pl/ServicePl.cs new file mode 100644 index 000000000..abc34ed21 --- /dev/null +++ b/Ryujinx.Core/OsHle/IpcServices/Pl/ServicePl.cs @@ -0,0 +1,51 @@ +using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; + +namespace Ryujinx.Core.OsHle.IpcServices.Pl +{ + class ServicePl : IIpcService + { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServicePl() + { + m_Commands = new Dictionary() + { + { 1, GetLoadState }, + { 2, GetFontSize }, + { 3, GetSharedMemoryAddressOffset }, + { 4, GetSharedMemoryNativeHandle } + }; + } + + public static long GetLoadState(ServiceCtx Context) + { + Context.ResponseData.Write(1); //Loaded + + return 0; + } + + public static long GetFontSize(ServiceCtx Context) + { + Context.ResponseData.Write(Horizon.FontSize); + + return 0; + } + + public static long GetSharedMemoryAddressOffset(ServiceCtx Context) + { + Context.ResponseData.Write(0); + + return 0; + } + + public static long GetSharedMemoryNativeHandle(ServiceCtx Context) + { + Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(Context.Ns.Os.FontHandle); + + return 0; + } + } +} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/IpcServices/ServiceFactory.cs b/Ryujinx.Core/OsHle/IpcServices/ServiceFactory.cs new file mode 100644 index 000000000..e9613050f --- /dev/null +++ b/Ryujinx.Core/OsHle/IpcServices/ServiceFactory.cs @@ -0,0 +1,50 @@ +using Ryujinx.Core.OsHle.IpcServices.Acc; +using Ryujinx.Core.OsHle.IpcServices.Am; +using Ryujinx.Core.OsHle.IpcServices.Apm; +using Ryujinx.Core.OsHle.IpcServices.Aud; +using Ryujinx.Core.OsHle.IpcServices.Friend; +using Ryujinx.Core.OsHle.IpcServices.FspSrv; +using Ryujinx.Core.OsHle.IpcServices.Hid; +using Ryujinx.Core.OsHle.IpcServices.Lm; +using Ryujinx.Core.OsHle.IpcServices.NvServices; +using Ryujinx.Core.OsHle.IpcServices.Pctl; +using Ryujinx.Core.OsHle.IpcServices.Pl; +using Ryujinx.Core.OsHle.IpcServices.Set; +using Ryujinx.Core.OsHle.IpcServices.Sm; +using Ryujinx.Core.OsHle.IpcServices.Time; +using Ryujinx.Core.OsHle.IpcServices.Vi; +using System; + +namespace Ryujinx.Core.OsHle.IpcServices +{ + static class ServiceFactory + { + public static IIpcService MakeService(string Name) + { + switch (Name) + { + case "acc:u0": return new ServiceAcc(); + case "apm": return new ServiceApm(); + case "apm:p": return new ServiceApm(); + case "appletOE": return new ServiceAppletOE(); + case "audout:u": return new ServiceAudOut(); + case "audren:u": return new ServiceAudRen(); + case "friend:a": return new ServiceFriend(); + case "fsp-srv": return new ServiceFspSrv(); + case "hid": return new ServiceHid(); + case "lm": return new ServiceLm(); + case "nvdrv": return new ServiceNvDrv(); + case "nvdrv:a": return new ServiceNvDrv(); + case "pctl:a": return new ServicePctl(); + case "pl:u": return new ServicePl(); + case "set": return new ServiceSet(); + case "sm:": return new ServiceSm(); + case "time:s": return new ServiceTime(); + case "time:u": return new ServiceTime(); + case "vi:m": return new ServiceVi(); + } + + throw new NotImplementedException(Name); + } + } +} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Services/ServiceSet.cs b/Ryujinx.Core/OsHle/IpcServices/Set/ServiceSet.cs similarity index 57% rename from Ryujinx.Core/OsHle/Services/ServiceSet.cs rename to Ryujinx.Core/OsHle/IpcServices/Set/ServiceSet.cs index 83ea5b2ce..05e409b0d 100644 --- a/Ryujinx.Core/OsHle/Services/ServiceSet.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Set/ServiceSet.cs @@ -1,12 +1,26 @@ using ChocolArm64.Memory; +using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Services +namespace Ryujinx.Core.OsHle.IpcServices.Set { - static partial class Service + class ServiceSet : IIpcService { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServiceSet() + { + m_Commands = new Dictionary() + { + { 1, GetAvailableLanguageCodes } + }; + } + private const int LangCodesCount = 13; - public static long SetGetAvailableLanguageCodes(ServiceCtx Context) + public static long GetAvailableLanguageCodes(ServiceCtx Context) { int PtrBuffSize = Context.RequestData.ReadInt32(); diff --git a/Ryujinx.Core/OsHle/Services/ServiceSm.cs b/Ryujinx.Core/OsHle/IpcServices/Sm/ServiceSm.cs similarity index 56% rename from Ryujinx.Core/OsHle/Services/ServiceSm.cs rename to Ryujinx.Core/OsHle/IpcServices/Sm/ServiceSm.cs index 58abed241..a5f1b329b 100644 --- a/Ryujinx.Core/OsHle/Services/ServiceSm.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Sm/ServiceSm.cs @@ -1,20 +1,34 @@ using Ryujinx.Core.OsHle.Handles; using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Services +namespace Ryujinx.Core.OsHle.IpcServices.Sm { - static partial class Service + class ServiceSm : IIpcService { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServiceSm() + { + m_Commands = new Dictionary() + { + { 0, Initialize }, + { 1, GetService } + }; + } + private const int SmNotInitialized = 0x415; - public static long SmInitialize(ServiceCtx Context) + public long Initialize(ServiceCtx Context) { Context.Session.Initialize(); return 0; } - public static long SmGetService(ServiceCtx Context) + public long GetService(ServiceCtx Context) { //Only for kernel version > 3.0.0. if (!Context.Session.IsInitialized) @@ -36,7 +50,12 @@ namespace Ryujinx.Core.OsHle.Services } } - HSession Session = new HSession(Name); + if (Name == string.Empty) + { + return 0; + } + + HSession Session = new HSession(ServiceFactory.MakeService(Name)); int Handle = Context.Ns.Os.Handles.GenerateId(Session); diff --git a/Ryujinx.Core/OsHle/Objects/Time/ISteadyClock.cs b/Ryujinx.Core/OsHle/IpcServices/Time/ISteadyClock.cs similarity index 83% rename from Ryujinx.Core/OsHle/Objects/Time/ISteadyClock.cs rename to Ryujinx.Core/OsHle/IpcServices/Time/ISteadyClock.cs index 1116b8492..d20e4378a 100644 --- a/Ryujinx.Core/OsHle/Objects/Time/ISteadyClock.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Time/ISteadyClock.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Time +namespace Ryujinx.Core.OsHle.IpcServices.Time { - class ISteadyClock : IIpcInterface + class ISteadyClock : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Time/ISystemClock.cs b/Ryujinx.Core/OsHle/IpcServices/Time/ISystemClock.cs similarity index 92% rename from Ryujinx.Core/OsHle/Objects/Time/ISystemClock.cs rename to Ryujinx.Core/OsHle/IpcServices/Time/ISystemClock.cs index 3aa706915..4d4493dad 100644 --- a/Ryujinx.Core/OsHle/Objects/Time/ISystemClock.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Time/ISystemClock.cs @@ -2,9 +2,9 @@ using Ryujinx.Core.OsHle.Ipc; using System; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Time +namespace Ryujinx.Core.OsHle.IpcServices.Time { - class ISystemClock : IIpcInterface + class ISystemClock : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Time/ITimeZoneService.cs b/Ryujinx.Core/OsHle/IpcServices/Time/ITimeZoneService.cs similarity index 82% rename from Ryujinx.Core/OsHle/Objects/Time/ITimeZoneService.cs rename to Ryujinx.Core/OsHle/IpcServices/Time/ITimeZoneService.cs index c083628bb..9875fa2fc 100644 --- a/Ryujinx.Core/OsHle/Objects/Time/ITimeZoneService.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Time/ITimeZoneService.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Time +namespace Ryujinx.Core.OsHle.IpcServices.Time { - class ITimeZoneService : IIpcInterface + class ITimeZoneService : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/IpcServices/Time/ServiceTime.cs b/Ryujinx.Core/OsHle/IpcServices/Time/ServiceTime.cs new file mode 100644 index 000000000..43f28bb80 --- /dev/null +++ b/Ryujinx.Core/OsHle/IpcServices/Time/ServiceTime.cs @@ -0,0 +1,62 @@ +using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; + +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; + +namespace Ryujinx.Core.OsHle.IpcServices.Time +{ + class ServiceTime : IIpcService + { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServiceTime() + { + m_Commands = new Dictionary() + { + { 0, GetStandardUserSystemClock }, + { 1, GetStandardNetworkSystemClock }, + { 2, GetStandardSteadyClock }, + { 3, GetTimeZoneService }, + { 4, GetStandardLocalSystemClock } + }; + } + + public long GetStandardUserSystemClock(ServiceCtx Context) + { + MakeObject(Context, new ISystemClock(SystemClockType.User)); + + return 0; + } + + public long GetStandardNetworkSystemClock(ServiceCtx Context) + { + MakeObject(Context, new ISystemClock(SystemClockType.Network)); + + return 0; + } + + public long GetStandardSteadyClock(ServiceCtx Context) + { + MakeObject(Context, new ISteadyClock()); + + return 0; + } + + public long GetTimeZoneService(ServiceCtx Context) + { + MakeObject(Context, new ITimeZoneService()); + + return 0; + } + + public long GetStandardLocalSystemClock(ServiceCtx Context) + { + MakeObject(Context, new ISystemClock(SystemClockType.Local)); + + return 0; + } + + } +} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Objects/Time/SystemClockType.cs b/Ryujinx.Core/OsHle/IpcServices/Time/SystemClockType.cs similarity index 64% rename from Ryujinx.Core/OsHle/Objects/Time/SystemClockType.cs rename to Ryujinx.Core/OsHle/IpcServices/Time/SystemClockType.cs index f447ca1cf..2314942a3 100644 --- a/Ryujinx.Core/OsHle/Objects/Time/SystemClockType.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Time/SystemClockType.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.Core.OsHle.Objects.Time +namespace Ryujinx.Core.OsHle.IpcServices.Time { enum SystemClockType { diff --git a/Ryujinx.Core/OsHle/Objects/Vi/IApplicationDisplayService.cs b/Ryujinx.Core/OsHle/IpcServices/Vi/IApplicationDisplayService.cs similarity index 96% rename from Ryujinx.Core/OsHle/Objects/Vi/IApplicationDisplayService.cs rename to Ryujinx.Core/OsHle/IpcServices/Vi/IApplicationDisplayService.cs index b3ec0e90c..a899cdd56 100644 --- a/Ryujinx.Core/OsHle/Objects/Vi/IApplicationDisplayService.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Vi/IApplicationDisplayService.cs @@ -4,12 +4,12 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; using System.IO; -using static Ryujinx.Core.OsHle.Objects.Android.Parcel; -using static Ryujinx.Core.OsHle.Objects.ObjHelper; +using static Ryujinx.Core.OsHle.IpcServices.Android.Parcel; +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; -namespace Ryujinx.Core.OsHle.Objects.Vi +namespace Ryujinx.Core.OsHle.IpcServices.Vi { - class IApplicationDisplayService : IIpcInterface + class IApplicationDisplayService : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Vi/IHOSBinderDriver.cs b/Ryujinx.Core/OsHle/IpcServices/Vi/IHOSBinderDriver.cs similarity index 93% rename from Ryujinx.Core/OsHle/Objects/Vi/IHOSBinderDriver.cs rename to Ryujinx.Core/OsHle/IpcServices/Vi/IHOSBinderDriver.cs index bbea3368c..a89c1df82 100644 --- a/Ryujinx.Core/OsHle/Objects/Vi/IHOSBinderDriver.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Vi/IHOSBinderDriver.cs @@ -1,12 +1,12 @@ using ChocolArm64.Memory; using Ryujinx.Core.OsHle.Ipc; -using Ryujinx.Core.OsHle.Objects.Android; +using Ryujinx.Core.OsHle.IpcServices.Android; using System; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Vi +namespace Ryujinx.Core.OsHle.IpcServices.Vi { - class IHOSBinderDriver : IIpcInterface, IDisposable + class IHOSBinderDriver : IIpcService, IDisposable { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Vi/IManagerDisplayService.cs b/Ryujinx.Core/OsHle/IpcServices/Vi/IManagerDisplayService.cs similarity index 89% rename from Ryujinx.Core/OsHle/Objects/Vi/IManagerDisplayService.cs rename to Ryujinx.Core/OsHle/IpcServices/Vi/IManagerDisplayService.cs index f1b3cdd0a..5adee78d1 100644 --- a/Ryujinx.Core/OsHle/Objects/Vi/IManagerDisplayService.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Vi/IManagerDisplayService.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Vi +namespace Ryujinx.Core.OsHle.IpcServices.Vi { - class IManagerDisplayService : IIpcInterface + class IManagerDisplayService : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/Objects/Vi/ISystemDisplayService.cs b/Ryujinx.Core/OsHle/IpcServices/Vi/ISystemDisplayService.cs similarity index 85% rename from Ryujinx.Core/OsHle/Objects/Vi/ISystemDisplayService.cs rename to Ryujinx.Core/OsHle/IpcServices/Vi/ISystemDisplayService.cs index 4c83c25f1..d87fcbf6e 100644 --- a/Ryujinx.Core/OsHle/Objects/Vi/ISystemDisplayService.cs +++ b/Ryujinx.Core/OsHle/IpcServices/Vi/ISystemDisplayService.cs @@ -1,9 +1,9 @@ using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; -namespace Ryujinx.Core.OsHle.Objects.Vi +namespace Ryujinx.Core.OsHle.IpcServices.Vi { - class ISystemDisplayService : IIpcInterface + class ISystemDisplayService : IIpcService { private Dictionary m_Commands; diff --git a/Ryujinx.Core/OsHle/IpcServices/Vi/ServiceVi.cs b/Ryujinx.Core/OsHle/IpcServices/Vi/ServiceVi.cs new file mode 100644 index 000000000..2c3dd2a3c --- /dev/null +++ b/Ryujinx.Core/OsHle/IpcServices/Vi/ServiceVi.cs @@ -0,0 +1,31 @@ +using Ryujinx.Core.OsHle.Ipc; +using System.Collections.Generic; + +using static Ryujinx.Core.OsHle.IpcServices.ObjHelper; + +namespace Ryujinx.Core.OsHle.IpcServices.Vi +{ + class ServiceVi : IIpcService + { + private Dictionary m_Commands; + + public IReadOnlyDictionary Commands => m_Commands; + + public ServiceVi() + { + m_Commands = new Dictionary() + { + { 2, GetDisplayService } + }; + } + + public long GetDisplayService(ServiceCtx Context) + { + int Unknown = Context.RequestData.ReadInt32(); + + MakeObject(Context, new IApplicationDisplayService()); + + return 0; + } + } +} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Services/ServiceAcc.cs b/Ryujinx.Core/OsHle/Services/ServiceAcc.cs deleted file mode 100644 index f25113e59..000000000 --- a/Ryujinx.Core/OsHle/Services/ServiceAcc.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Ryujinx.Core.OsHle.Objects.Acc; - -using static Ryujinx.Core.OsHle.Objects.ObjHelper; - -namespace Ryujinx.Core.OsHle.Services -{ - static partial class Service - { - public static long AccU0ListOpenUsers(ServiceCtx Context) - { - return 0; - } - - public static long AccU0GetProfile(ServiceCtx Context) - { - MakeObject(Context, new IProfile()); - - return 0; - } - - public static long AccU0InitializeApplicationInfo(ServiceCtx Context) - { - return 0; - } - - public static long AccU0GetBaasAccountManagerForApplication(ServiceCtx Context) - { - MakeObject(Context, new IManagerForApplication()); - - return 0; - } - } -} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Services/ServiceApm.cs b/Ryujinx.Core/OsHle/Services/ServiceApm.cs deleted file mode 100644 index e1bc0d348..000000000 --- a/Ryujinx.Core/OsHle/Services/ServiceApm.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Ryujinx.Core.OsHle.Objects.Apm; - -using static Ryujinx.Core.OsHle.Objects.ObjHelper; - -namespace Ryujinx.Core.OsHle.Services -{ - static partial class Service - { - public static long ApmOpenSession(ServiceCtx Context) - { - MakeObject(Context, new ISession()); - - return 0; - } - } -} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Services/ServiceAppletOE.cs b/Ryujinx.Core/OsHle/Services/ServiceAppletOE.cs deleted file mode 100644 index bbb2484b4..000000000 --- a/Ryujinx.Core/OsHle/Services/ServiceAppletOE.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Ryujinx.Core.OsHle.Objects.Am; - -using static Ryujinx.Core.OsHle.Objects.ObjHelper; - -namespace Ryujinx.Core.OsHle.Services -{ - static partial class Service - { - public static long AppletOpenApplicationProxy(ServiceCtx Context) - { - MakeObject(Context, new IApplicationProxy()); - - return 0; - } - } -} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Services/ServiceAud.cs b/Ryujinx.Core/OsHle/Services/ServiceAud.cs deleted file mode 100644 index a8ba7dc01..000000000 --- a/Ryujinx.Core/OsHle/Services/ServiceAud.cs +++ /dev/null @@ -1,71 +0,0 @@ -using ChocolArm64.Memory; -using Ryujinx.Core.OsHle.Objects.Aud; -using System.Text; - -using static Ryujinx.Core.OsHle.Objects.ObjHelper; - -namespace Ryujinx.Core.OsHle.Services -{ - static partial class Service - { - public static long AudOutListAudioOuts(ServiceCtx Context) - { - long Position = Context.Request.ReceiveBuff[0].Position; - - AMemoryHelper.WriteBytes(Context.Memory, Position, Encoding.ASCII.GetBytes("iface")); - - Context.ResponseData.Write(1); - - return 0; - } - - public static long AudOutOpenAudioOut(ServiceCtx Context) - { - MakeObject(Context, new IAudioOut()); - - Context.ResponseData.Write(48000); //Sample Rate - Context.ResponseData.Write(2); //Channel Count - Context.ResponseData.Write(2); //PCM Format - /* - 0 - Invalid - 1 - INT8 - 2 - INT16 - 3 - INT24 - 4 - INT32 - 5 - PCM Float - 6 - ADPCM - */ - Context.ResponseData.Write(0); //Unknown - - return 0; - } - - public static long AudRenOpenAudioRenderer(ServiceCtx Context) - { - MakeObject(Context, new IAudioRenderer()); - - return 0; - } - - public static long AudRenGetAudioRendererWorkBufferSize(ServiceCtx Context) - { - int SampleRate = Context.RequestData.ReadInt32(); - int Unknown4 = Context.RequestData.ReadInt32(); - int Unknown8 = Context.RequestData.ReadInt32(); - int UnknownC = Context.RequestData.ReadInt32(); - int Unknown10 = Context.RequestData.ReadInt32(); - int Unknown14 = Context.RequestData.ReadInt32(); - int Unknown18 = Context.RequestData.ReadInt32(); - int Unknown1c = Context.RequestData.ReadInt32(); - int Unknown20 = Context.RequestData.ReadInt32(); - int Unknown24 = Context.RequestData.ReadInt32(); - int Unknown28 = Context.RequestData.ReadInt32(); - int Unknown2c = Context.RequestData.ReadInt32(); - int Rev1Magic = Context.RequestData.ReadInt32(); - - Context.ResponseData.Write(0x400L); - - return 0; - } - } -} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Services/ServiceFriend.cs b/Ryujinx.Core/OsHle/Services/ServiceFriend.cs deleted file mode 100644 index d1229bd46..000000000 --- a/Ryujinx.Core/OsHle/Services/ServiceFriend.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Ryujinx.Core.OsHle.Objects.Friend; - -using static Ryujinx.Core.OsHle.Objects.ObjHelper; - -namespace Ryujinx.Core.OsHle.Services -{ - static partial class Service - { - public static long FriendCreateFriendService(ServiceCtx Context) - { - MakeObject(Context, new IFriendService()); - - return 0; - } - } -} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Services/ServiceFspSrv.cs b/Ryujinx.Core/OsHle/Services/ServiceFspSrv.cs deleted file mode 100644 index 3fe41cf06..000000000 --- a/Ryujinx.Core/OsHle/Services/ServiceFspSrv.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Ryujinx.Core.OsHle.Objects.FspSrv; - -using static Ryujinx.Core.OsHle.Objects.ObjHelper; - -namespace Ryujinx.Core.OsHle.Services -{ - static partial class Service - { - public static long FspSrvInitialize(ServiceCtx Context) - { - return 0; - } - - public static long FspSrvMountSdCard(ServiceCtx Context) - { - MakeObject(Context, new IFileSystem(Context.Ns.VFs.GetSdCardPath())); - - return 0; - } - - public static long FspSrvMountSaveData(ServiceCtx Context) - { - MakeObject(Context, new IFileSystem(Context.Ns.VFs.GetGameSavesPath())); - - return 0; - } - - public static long FspSrvOpenDataStorageByCurrentProcess(ServiceCtx Context) - { - MakeObject(Context, new IStorage(Context.Ns.VFs.RomFs)); - - return 0; - } - - public static long FspSrvOpenRomStorage(ServiceCtx Context) - { - MakeObject(Context, new IStorage(Context.Ns.VFs.RomFs)); - - return 0; - } - - public static long FspSrvGetGlobalAccessLogMode(ServiceCtx Context) - { - Context.ResponseData.Write(0); - - return 0; - } - } -} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Services/ServiceHid.cs b/Ryujinx.Core/OsHle/Services/ServiceHid.cs deleted file mode 100644 index aed3e959c..000000000 --- a/Ryujinx.Core/OsHle/Services/ServiceHid.cs +++ /dev/null @@ -1,77 +0,0 @@ -using Ryujinx.Core.OsHle.Handles; -using Ryujinx.Core.OsHle.Objects.Hid; - -using static Ryujinx.Core.OsHle.Objects.ObjHelper; - -namespace Ryujinx.Core.OsHle.Services -{ - static partial class Service - { - public static long HidCreateAppletResource(ServiceCtx Context) - { - HSharedMem HidHndData = Context.Ns.Os.Handles.GetData(Context.Ns.Os.HidHandle); - - MakeObject(Context, new IAppletResource(HidHndData)); - - return 0; - } - - public static long HidActivateTouchScreen(ServiceCtx Context) - { - long Unknown = Context.RequestData.ReadInt64(); - - return 0; - } - - public static long HidGetSupportedNpadStyleSet(ServiceCtx Context) - { - Context.ResponseData.Write(0); - - return 0; - } - - public static long HidSetSupportedNpadStyleSet(ServiceCtx Context) - { - long Unknown0 = Context.RequestData.ReadInt64(); - long Unknown8 = Context.RequestData.ReadInt64(); - - return 0; - } - - public static long HidSetSupportedNpadIdType(ServiceCtx Context) - { - long Unknown = Context.RequestData.ReadInt64(); - - return 0; - } - - public static long HidActivateNpad(ServiceCtx Context) - { - long Unknown = Context.RequestData.ReadInt64(); - - return 0; - } - - public static long HidSetNpadJoyHoldType(ServiceCtx Context) - { - long Unknown0 = Context.RequestData.ReadInt64(); - long Unknown8 = Context.RequestData.ReadInt64(); - - return 0; - } - - public static long HidGetNpadJoyHoldType(ServiceCtx Context) - { - Context.ResponseData.Write(0L); - - return 0; - } - - public static long HidCreateActiveVibrationDeviceList(ServiceCtx Context) - { - MakeObject(Context, new IActiveApplicationDeviceList()); - - return 0; - } - } -} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Services/ServiceLm.cs b/Ryujinx.Core/OsHle/Services/ServiceLm.cs deleted file mode 100644 index 1fdde5521..000000000 --- a/Ryujinx.Core/OsHle/Services/ServiceLm.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Ryujinx.Core.OsHle.Services -{ - static partial class Service - { - public static long LmInitialize(ServiceCtx Context) - { - Context.Session.Initialize(); - - return 0; - } - } -} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Services/ServicePctl.cs b/Ryujinx.Core/OsHle/Services/ServicePctl.cs deleted file mode 100644 index 9c4406bb6..000000000 --- a/Ryujinx.Core/OsHle/Services/ServicePctl.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Ryujinx.Core.OsHle.Objects.Am; - -using static Ryujinx.Core.OsHle.Objects.ObjHelper; - -namespace Ryujinx.Core.OsHle.Services -{ - static partial class Service - { - public static long PctlCreateService(ServiceCtx Context) - { - MakeObject(Context, new IParentalControlService()); - - return 0; - } - } -} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Services/ServicePl.cs b/Ryujinx.Core/OsHle/Services/ServicePl.cs deleted file mode 100644 index 21e6741cd..000000000 --- a/Ryujinx.Core/OsHle/Services/ServicePl.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Ryujinx.Core.OsHle.Ipc; - -namespace Ryujinx.Core.OsHle.Services -{ - static partial class Service - { - public static long PlGetLoadState(ServiceCtx Context) - { - Context.ResponseData.Write(1); //Loaded - - return 0; - } - - public static long PlGetFontSize(ServiceCtx Context) - { - Context.ResponseData.Write(Horizon.FontSize); - - return 0; - } - - public static long PlGetSharedMemoryAddressOffset(ServiceCtx Context) - { - Context.ResponseData.Write(0); - - return 0; - } - - public static long PlGetSharedMemoryNativeHandle(ServiceCtx Context) - { - Context.Response.HandleDesc = IpcHandleDesc.MakeCopy(Context.Ns.Os.FontHandle); - - return 0; - } - } -} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Services/ServiceTime.cs b/Ryujinx.Core/OsHle/Services/ServiceTime.cs deleted file mode 100644 index a5fddcba6..000000000 --- a/Ryujinx.Core/OsHle/Services/ServiceTime.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Ryujinx.Core.OsHle.Objects.Time; - -using static Ryujinx.Core.OsHle.Objects.ObjHelper; - -namespace Ryujinx.Core.OsHle.Services -{ - static partial class Service - { - public static long TimeGetStandardUserSystemClock(ServiceCtx Context) - { - MakeObject(Context, new ISystemClock(SystemClockType.User)); - - return 0; - } - - public static long TimeGetStandardNetworkSystemClock(ServiceCtx Context) - { - MakeObject(Context, new ISystemClock(SystemClockType.Network)); - - return 0; - } - - public static long TimeGetStandardSteadyClock(ServiceCtx Context) - { - MakeObject(Context, new ISteadyClock()); - - return 0; - } - - public static long TimeGetTimeZoneService(ServiceCtx Context) - { - MakeObject(Context, new ITimeZoneService()); - - return 0; - } - - public static long TimeGetStandardLocalSystemClock(ServiceCtx Context) - { - MakeObject(Context, new ISystemClock(SystemClockType.Local)); - - return 0; - } - - } -} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Services/ServiceVi.cs b/Ryujinx.Core/OsHle/Services/ServiceVi.cs deleted file mode 100644 index 75cdc31b2..000000000 --- a/Ryujinx.Core/OsHle/Services/ServiceVi.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Ryujinx.Core.OsHle.Objects.Vi; - -using static Ryujinx.Core.OsHle.Objects.ObjHelper; - -namespace Ryujinx.Core.OsHle.Services -{ - static partial class Service - { - public static long ViGetDisplayService(ServiceCtx Context) - { - int Unknown = Context.RequestData.ReadInt32(); - - MakeObject(Context, new IApplicationDisplayService()); - - return 0; - } - } -} \ No newline at end of file diff --git a/Ryujinx.Core/OsHle/Svc/SvcSystem.cs b/Ryujinx.Core/OsHle/Svc/SvcSystem.cs index a69d3b409..3b9142c78 100644 --- a/Ryujinx.Core/OsHle/Svc/SvcSystem.cs +++ b/Ryujinx.Core/OsHle/Svc/SvcSystem.cs @@ -3,6 +3,7 @@ using ChocolArm64.State; using Ryujinx.Core.OsHle.Exceptions; using Ryujinx.Core.OsHle.Handles; using Ryujinx.Core.OsHle.Ipc; +using Ryujinx.Core.OsHle.IpcServices; using System; using System.Threading; @@ -61,7 +62,7 @@ namespace Ryujinx.Core.OsHle.Svc //TODO: Validate that app has perms to access the service, and that the service //actually exists, return error codes otherwise. - HSession Session = new HSession(Name); + HSession Session = new HSession(ServiceFactory.MakeService(Name)); ThreadState.X1 = (ulong)Ns.Os.Handles.GenerateId(Session); ThreadState.X0 = (int)SvcResult.Success;