From e5d0821678ed9b5d1e04e0b7af8d5475a9fc9be1 Mon Sep 17 00:00:00 2001 From: plutoo Date: Sun, 3 Dec 2017 18:05:51 +0100 Subject: [PATCH] Implement pm:dmnt --- nx/include/switch.h | 1 + nx/source/services/fs.c | 4 +- nx/source/services/pm.c | 155 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 nx/source/services/pm.c diff --git a/nx/include/switch.h b/nx/include/switch.h index 704b2118..377c7a12 100644 --- a/nx/include/switch.h +++ b/nx/include/switch.h @@ -34,6 +34,7 @@ extern "C" { #include #include #include +#include #include #include diff --git a/nx/source/services/fs.c b/nx/source/services/fs.c index f0904404..d58f57a8 100644 --- a/nx/source/services/fs.c +++ b/nx/source/services/fs.c @@ -4,7 +4,9 @@ static Handle g_fsHandle = INVALID_HANDLE; Result fsInitialize() { - if(g_fsHandle != INVALID_HANDLE)return 0; + if (g_fsHandle != INVALID_HANDLE) + return 0; + Result rc = smGetService(&g_fsHandle, "fsp-srv"); if (R_SUCCEEDED(rc)) { diff --git a/nx/source/services/pm.c b/nx/source/services/pm.c new file mode 100644 index 00000000..b888d558 --- /dev/null +++ b/nx/source/services/pm.c @@ -0,0 +1,155 @@ +// Copyright 2017 plutoo +#include + +static Handle g_pmdmntHandle = INVALID_HANDLE; + +Result pmdmntInitialize() { + Result rc = smGetService(&g_pmdmntHandle, "pm:dmnt"); + + if (R_FAILED(rc)) { + g_pmdmntHandle = INVALID_HANDLE; + } + + return rc; +} + +Result pmdmntStartProcess(u64 pid) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + u64 pid; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 2; + raw->pid = pid; + + Result rc = ipcDispatch(g_pmdmntHandle); + + if (R_SUCCEEDED(rc)) { + IpcCommandResponse r; + ipcParseResponse(&r); + + struct { + u64 magic; + u64 result; + } *resp = r.Raw; + + rc = resp->result; + } + + return rc; +} + +Result pmdmntEnableDebugForTitleId(Handle* handle_out, u64 title_id) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + u64 title_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 4; + raw->title_id = title_id; + + Result rc = ipcDispatch(g_pmdmntHandle); + + if (R_SUCCEEDED(rc)) { + IpcCommandResponse r; + ipcParseResponse(&r); + + struct { + u64 magic; + u64 result; + } *resp = r.Raw; + + rc = resp->result; + + if (R_SUCCEEDED(rc)) { + *handle_out = r.Handles[0]; + } + } + + return rc; +} + +Result pmdmntGetApplicationPid(u64* pid_out) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 5; + + Result rc = ipcDispatch(g_pmdmntHandle); + + if (R_SUCCEEDED(rc)) { + IpcCommandResponse r; + ipcParseResponse(&r); + + struct { + u64 magic; + u64 result; + u64 pid; + } *resp = r.Raw; + + rc = resp->result; + + if (R_SUCCEEDED(rc)) { + *pid_out = resp->pid; + } + } + + return rc; +} + +Result pmdmntEnableDebugForApplication(Handle* handle_out) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 6; + + Result rc = ipcDispatch(g_pmdmntHandle); + + if (R_SUCCEEDED(rc)) { + IpcCommandResponse r; + ipcParseResponse(&r); + + struct { + u64 magic; + u64 result; + } *resp = r.Raw; + + rc = resp->result; + + if (R_SUCCEEDED(rc)) { + *handle_out = r.Handles[0]; + } + } + + return rc; +}