From 555f31b35eda3d23284cfa87034251804a7569bb Mon Sep 17 00:00:00 2001 From: Pirater12 Date: Sat, 10 Mar 2018 19:37:55 +0530 Subject: [PATCH] Add more PM:App functions --- libctru/include/3ds/services/pm.h | 19 +++++++ libctru/source/services/pm.c | 85 +++++++++++++++++++++++-------- 2 files changed, 83 insertions(+), 21 deletions(-) diff --git a/libctru/include/3ds/services/pm.h b/libctru/include/3ds/services/pm.h index e3d3e84..64927ab 100644 --- a/libctru/include/3ds/services/pm.h +++ b/libctru/include/3ds/services/pm.h @@ -47,3 +47,22 @@ Result PM_GetFIRMLaunchParams(u32 size, u8* out); * @param in Buffer to retrieve the launch parameters from. */ Result PM_LaunchFIRMSetParams(u32 firm_titleid_low, u32 size, u8* in); + +/** + * @brief Terminates the current Application + * @param timeout Timeout in nanoseconds + */ +Result PM_TerminateCurrentApplication(u64 timeout); + +/** + * @brief Terminates the specified Process + * @param pid Process-ID of the process to terminate + * @param timeout Timeout on nanoseconds + */ +Result PM_TerminateProcess(u8 pid, u64 timeout); + +/** + * @brief Unregisters a process + * @param tid TitleID of the process to unregister + */ + Result PM_UnregisterProcess(u64 tid); \ No newline at end of file diff --git a/libctru/source/services/pm.c b/libctru/source/services/pm.c index d782ddb..0498342 100644 --- a/libctru/source/services/pm.c +++ b/libctru/source/services/pm.c @@ -43,6 +43,66 @@ Result PM_LaunchTitle(u8 mediatype, u64 titleid, u32 launch_flags) return (Result)cmdbuf[1]; } +Result PM_LaunchFIRMSetParams(u32 firm_titleid_low, u32 size, u8* in) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x2,2,2); // 0x20082 + cmdbuf[1] = firm_titleid_low; + cmdbuf[2] = size; + cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_R); + cmdbuf[4] = (u32)in; + + if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; + + return (Result)cmdbuf[1]; +} + +Result PM_TerminateCurrentApplication(u64 timeout) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x3,2,0); // 0x30080 + cmdbuf[1] = timeout & 0xffffffff; + cmdbuf[2] = (timeout >> 32) & 0xffffffff; + + if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; + + return (Result)cmdbuf[1]; +} + +Result PM_TerminateProcess(u8 pid, u64 timeout) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x5,3,0); // 0x500C0 + cmdbuf[1] = pid; + cmdbuf[2] = timeout & 0xffffffff; + cmdbuf[3] = (timeout >> 32) & 0xffffffff; + + if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; + + return (Result)cmdbuf[1]; +} + +Result PM_GetFIRMLaunchParams(u32 size, u8* out) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x7,1,2); // 0x70042 + cmdbuf[1] = size; + cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_W); + cmdbuf[3] = (u32)out; + + if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; + + return (Result)cmdbuf[1]; +} + Result PM_GetTitleExheaderFlags(u8 mediatype, u64 titleid, u8* out) { Result ret = 0; @@ -76,31 +136,14 @@ Result PM_SetFIRMLaunchParams(u32 size, u8* in) return (Result)cmdbuf[1]; } -Result PM_GetFIRMLaunchParams(u32 size, u8* out) +Result PM_UnregisterProcess(u64 tid) { Result ret = 0; u32 *cmdbuf = getThreadCommandBuffer(); - cmdbuf[0] = IPC_MakeHeader(0x7,1,2); // 0x70042 - cmdbuf[1] = size; - cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_W); - cmdbuf[3] = (u32)out; - - if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; - - return (Result)cmdbuf[1]; -} - -Result PM_LaunchFIRMSetParams(u32 firm_titleid_low, u32 size, u8* in) -{ - Result ret = 0; - u32 *cmdbuf = getThreadCommandBuffer(); - - cmdbuf[0] = IPC_MakeHeader(0x2,2,2); // 0x20082 - cmdbuf[1] = firm_titleid_low; - cmdbuf[2] = size; - cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_R); - cmdbuf[4] = (u32)in; + cmdbuf[0] = IPC_MakeHeader(0xC,0,0); // 0xC0000 + cmdbuf[1] = tid & 0xffffffff; + cmdbuf[2] = (tid >> 32) & 0xffffffff; if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;