Config option to ignore missing services (#658)
* Implemented config option to ignore missing services * Removed unused using statement * Resolved comments from review
This commit is contained in:
parent
233fc95e1e
commit
b2e88b04a8
6 changed files with 73 additions and 3 deletions
20
Ryujinx.HLE/HOS/Services/DummyService.cs
Normal file
20
Ryujinx.HLE/HOS/Services/DummyService.cs
Normal file
|
@ -0,0 +1,20 @@
|
|||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services
|
||||
{
|
||||
class DummyService : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
public string ServiceName { get; set; }
|
||||
|
||||
public DummyService(string serviceName)
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>();
|
||||
ServiceName = serviceName;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -89,13 +89,29 @@ namespace Ryujinx.HLE.HOS.Services
|
|||
long sfciMagic = context.RequestData.ReadInt64();
|
||||
int commandId = (int)context.RequestData.ReadInt64();
|
||||
|
||||
if (service.Commands.TryGetValue(commandId, out ServiceProcessRequest processRequest))
|
||||
bool serviceExists = service.Commands.TryGetValue(commandId, out ServiceProcessRequest processRequest);
|
||||
|
||||
if (ServiceConfiguration.IgnoreMissingServices || serviceExists)
|
||||
{
|
||||
long result = 0;
|
||||
|
||||
context.ResponseData.BaseStream.Seek(_isDomain ? 0x20 : 0x10, SeekOrigin.Begin);
|
||||
|
||||
Logger.PrintDebug(LogClass.KernelIpc, $"{service.GetType().Name}: {processRequest.Method.Name}");
|
||||
if (serviceExists)
|
||||
{
|
||||
Logger.PrintDebug(LogClass.KernelIpc, $"{service.GetType().Name}: {processRequest.Method.Name}");
|
||||
|
||||
long result = processRequest(context);
|
||||
result = processRequest(context);
|
||||
}
|
||||
else
|
||||
{
|
||||
string serviceName;
|
||||
DummyService dummyService = service as DummyService;
|
||||
|
||||
serviceName = (dummyService == null) ? service.GetType().FullName : dummyService.ServiceName;
|
||||
|
||||
Logger.PrintWarning(LogClass.KernelIpc, $"Missing service {serviceName}: {commandId} ignored");
|
||||
}
|
||||
|
||||
if (_isDomain)
|
||||
{
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.HLE.HOS.Services.Acc;
|
||||
using Ryujinx.HLE.HOS.Services.Am;
|
||||
using Ryujinx.HLE.HOS.Services.Apm;
|
||||
|
@ -30,6 +31,11 @@ using System;
|
|||
|
||||
namespace Ryujinx.HLE.HOS.Services
|
||||
{
|
||||
public static class ServiceConfiguration
|
||||
{
|
||||
public static bool IgnoreMissingServices { get; set; }
|
||||
}
|
||||
|
||||
static class ServiceFactory
|
||||
{
|
||||
public static IpcService MakeService(Horizon system, string name)
|
||||
|
@ -209,6 +215,12 @@ namespace Ryujinx.HLE.HOS.Services
|
|||
return new IApplicationRootService();
|
||||
}
|
||||
|
||||
if (ServiceConfiguration.IgnoreMissingServices)
|
||||
{
|
||||
Logger.PrintWarning(LogClass.Service, $"Missing service {name} ignored");
|
||||
return new DummyService(name);
|
||||
}
|
||||
|
||||
throw new NotImplementedException(name);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue