IDebugMonitorInterface.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using Ryujinx.HLE.HOS.Ipc;
  2. using Ryujinx.HLE.HOS.Kernel;
  3. using Ryujinx.HLE.HOS.Kernel.Process;
  4. using Ryujinx.Horizon.Common;
  5. namespace Ryujinx.HLE.HOS.Services.Pm
  6. {
  7. [Service("pm:dmnt")]
  8. class IDebugMonitorInterface : IpcService
  9. {
  10. public IDebugMonitorInterface(ServiceCtx context) { }
  11. [CommandHipc(4)]
  12. // GetProgramId() -> sf::Out<ncm::ProgramId> out_process_id
  13. public ResultCode GetApplicationProcessId(ServiceCtx context)
  14. {
  15. // TODO: Not correct as it shouldn't be directly using kernel objects here
  16. foreach (KProcess process in context.Device.System.KernelContext.Processes.Values)
  17. {
  18. if (process.IsApplication)
  19. {
  20. context.ResponseData.Write(process.Pid);
  21. return ResultCode.Success;
  22. }
  23. }
  24. return ResultCode.ProcessNotFound;
  25. }
  26. [CommandHipc(65000)]
  27. // AtmosphereGetProcessInfo(os::ProcessId process_id) -> sf::OutCopyHandle out_process_handle, sf::Out<ncm::ProgramLocation> out_loc, sf::Out<cfg::OverrideStatus> out_status
  28. public ResultCode GetProcessInfo(ServiceCtx context)
  29. {
  30. ulong pid = context.RequestData.ReadUInt64();
  31. KProcess process = KernelStatic.GetProcessByPid(pid);
  32. if (context.Process.HandleTable.GenerateHandle(process, out int processHandle) != Result.Success)
  33. {
  34. throw new System.Exception("Out of handles!");
  35. }
  36. context.Response.HandleDesc = IpcHandleDesc.MakeCopy(processHandle);
  37. return ResultCode.Success;
  38. }
  39. }
  40. }