From 23bd10f6db0b66a2c37a90329a6b0a96a804aa92 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Mon, 22 Apr 2019 04:50:54 -0700 Subject: [PATCH] ro: add ldrRoLoadNrrEx, fix roDmnt --- nx/include/switch/services/ro.h | 3 ++- nx/source/services/ro.c | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/nx/include/switch/services/ro.h b/nx/include/switch/services/ro.h index 26543931..835a0466 100644 --- a/nx/include/switch/services/ro.h +++ b/nx/include/switch/services/ro.h @@ -19,5 +19,6 @@ Result ldrRoLoadNro(u64* out_address, u64 nro_address, u64 nro_size, u64 bss_add Result ldrRoUnloadNro(u64 nro_address); Result ldrRoLoadNrr(u64 nrr_address, u64 nrr_size); Result ldrRoUnloadNrr(u64 nrr_address); +Result ldrRoLoadNrrEx(u64 nrr_address, u64 nrr_size); -Result roDmntGetModuleInfos(u64 pid, LoaderModuleInfo *out_module_infos, size_t out_size, u32 *num_out); +Result roDmntGetModuleInfos(u64 pid, LoaderModuleInfo *out_module_infos, size_t max_out_modules, u32 *num_out); diff --git a/nx/source/services/ro.c b/nx/source/services/ro.c index 65662cbf..51513e29 100644 --- a/nx/source/services/ro.c +++ b/nx/source/services/ro.c @@ -134,7 +134,7 @@ Result ldrRoUnloadNro(u64 nro_address) { return rc; } -Result ldrRoLoadNrr(u64 nrr_address, u64 nrr_size) { +static Result _ldrRoLoadNrr(u64 cmd_id, u64 nrr_address, u64 nrr_size) { IpcCommand c; ipcInitialize(&c); ipcSendPid(&c); @@ -150,7 +150,7 @@ Result ldrRoLoadNrr(u64 nrr_address, u64 nrr_size) { raw = serviceIpcPrepareHeader(&g_roSrv, &c, sizeof(*raw)); raw->magic = SFCI_MAGIC; - raw->cmd_id = 2; + raw->cmd_id = cmd_id; raw->pid = 0; raw->nrr_address = nrr_address; raw->nrr_size = nrr_size; @@ -173,6 +173,10 @@ Result ldrRoLoadNrr(u64 nrr_address, u64 nrr_size) { return rc; } +Result ldrRoLoadNrr(u64 nrr_address, u64 nrr_size) { + return _ldrRoLoadNrr(2, nrr_address, nrr_size); +} + Result ldrRoUnloadNrr(u64 nrr_address) { IpcCommand c; ipcInitialize(&c); @@ -210,6 +214,13 @@ Result ldrRoUnloadNrr(u64 nrr_address) { return rc; } +Result ldrRoLoadNrrEx(u64 nrr_address, u64 nrr_size) { + if (hosversionBefore(7,0,0)) { + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + } + return _ldrRoLoadNrr(10, nrr_address, nrr_size); +} + Result _ldrRoInitialize(void) { IpcCommand c; ipcInitialize(&c); @@ -243,11 +254,11 @@ Result _ldrRoInitialize(void) { return rc; } -Result roDmntGetModuleInfos(u64 pid, LoaderModuleInfo *out_module_infos, size_t out_size, u32 *num_out) { +Result roDmntGetModuleInfos(u64 pid, LoaderModuleInfo *out_module_infos, size_t max_out_modules, u32 *num_out) { IpcCommand c; ipcInitialize(&c); - ipcAddRecvStatic(&c, out_module_infos, out_size, 0); + ipcAddRecvBuffer(&c, out_module_infos, max_out_modules * sizeof(*out_module_infos), BufferType_Normal); struct { u64 magic;