From dbbaf64ad306ad8d3bcc307932d6f24a1ad514b6 Mon Sep 17 00:00:00 2001 From: SciresM Date: Mon, 25 Jun 2018 09:02:08 -0700 Subject: [PATCH] ns:dev: Add TerminateProcess and TerminateProgram (#122) * ns:dev: Add TerminateProcess and TerminateProgram --- nx/include/switch/services/ns.h | 7 +++ nx/source/services/ns.c | 86 +++++++++++++++++++++++++++++++-- 2 files changed, 90 insertions(+), 3 deletions(-) diff --git a/nx/include/switch/services/ns.h b/nx/include/switch/services/ns.h index a67cb802..98c8358b 100644 --- a/nx/include/switch/services/ns.h +++ b/nx/include/switch/services/ns.h @@ -38,3 +38,10 @@ void nsvmExit(void); Result nsvmNeedsUpdateVulnerability(bool *out); Result nsvmGetSafeSystemVersion(u16 *out); + +/* ns:dev */ +Result nsdevInitialize(); +void nsdevExit(); + +Result nsdevTerminateProcess(u64 pid); +Result nsdevTerminateProgram(u64 tid); \ No newline at end of file diff --git a/nx/source/services/ns.c b/nx/source/services/ns.c index 6efe6677..3cc05cda 100644 --- a/nx/source/services/ns.c +++ b/nx/source/services/ns.c @@ -6,8 +6,8 @@ #include "services/sm.h" #include "services/ns.h" -static Service g_nsAppManSrv, g_nsGetterSrv, g_nsvmSrv; -static u64 g_nsRefCnt, g_nsvmRefCnt; +static Service g_nsAppManSrv, g_nsGetterSrv, g_nsvmSrv, g_nsdevSrv; +static u64 g_nsRefCnt, g_nsvmRefCnt, g_nsdevRefCnt; static Result _nsGetInterface(Service* srv_out, u64 cmd_id); @@ -43,6 +43,20 @@ void nsExit(void) } } +Result nsdevInitialize() { + atomicIncrement64(&g_nsdevRefCnt); + + if (serviceIsActive(&g_nsdevSrv)) + return 0; + + return smGetService(&g_nsdevSrv, "ns:dev"); +} + +void nsdevExit() { + if (atomicDecrement64(&g_nsdevRefCnt) == 0) + serviceClose(&g_nsdevSrv); +} + static Result _nsGetInterface(Service* srv_out, u64 cmd_id) { IpcCommand c; ipcInitialize(&c); @@ -289,4 +303,70 @@ Result nsvmGetSafeSystemVersion(u16 *out) } return rc; -} \ No newline at end of file +} + +Result nsdevTerminateProcess(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 = 1; + raw->pid = pid; + + Result rc = serviceIpcDispatch(&g_nsdevSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + ipcParse(&r); + + struct { + u64 magic; + u64 result; + } *resp = r.Raw; + + rc = resp->result; + } + + return rc; +} + +Result nsdevTerminateProgram(u64 tid) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + u64 tid; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 2; + raw->tid = tid; + + Result rc = serviceIpcDispatch(&g_nsdevSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + ipcParse(&r); + + struct { + u64 magic; + u64 result; + } *resp = r.Raw; + + rc = resp->result; + } + + return rc; +}