From ee23569db83a1e20b6176b5f2b8d59098215f982 Mon Sep 17 00:00:00 2001 From: yellows8 Date: Thu, 22 Dec 2016 01:32:49 -0500 Subject: [PATCH] Added bossRegisterTask, bossSendProperty, bossDeleteTask, and bossCmd34. --- libctru/include/3ds/services/boss.h | 29 +++++++++ libctru/source/services/boss.c | 95 +++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) diff --git a/libctru/include/3ds/services/boss.h b/libctru/include/3ds/services/boss.h index 479909c..1ad5fed 100644 --- a/libctru/include/3ds/services/boss.h +++ b/libctru/include/3ds/services/boss.h @@ -16,6 +16,22 @@ void bossExit(void); /// Returns the BOSS session handle. Handle bossGetSessionHandle(); +/** + * @brief Register a task. + * @param taskID BOSS taskID. + * @param unk0 Unknown, usually zero. + * @param unk1 Unknown, usually zero. + */ +Result bossRegisterTask(char *taskID, u8 unk0, u8 unk1); + +/** + * @brief Send a property. + * @param PropertyID PropertyID + * @param buf Input buffer data. + * @param size Buffer size. + */ +Result bossSendProperty(u16 PropertyID, void* buf, u32 size); + /** * @brief ? * @param taskID BOSS taskID. @@ -28,3 +44,16 @@ Result bossStartTaskImmediate(char *taskID); */ Result bossStartBgImmediate(char *taskID); +/** + * @brief Deletes a task by using CancelTask and UnregisterTask internally. + * @param taskID BOSS taskID. + * @param unk Unknown, usually zero? + */ +Result bossDeleteTask(char *taskID, u32 unk); + +/** + * @brief ? + * @param taskID BOSS taskID. + */ +Result bossCmd34(char *taskID); + diff --git a/libctru/source/services/boss.c b/libctru/source/services/boss.c index 987e0db..eb4240d 100644 --- a/libctru/source/services/boss.c +++ b/libctru/source/services/boss.c @@ -75,6 +75,57 @@ static Result bossipc_InitializeSession(u64 programID) return (Result)cmdbuf[1]; } +Result bossRegisterTask(char *taskID, u8 unk0, u8 unk1) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + u32 size = strlen(taskID)+1; + + cmdbuf[0] = IPC_MakeHeader(0xB,3,2); // 0xB00C2 + cmdbuf[1] = size; + cmdbuf[2] = unk0; + cmdbuf[3] = unk1; + cmdbuf[4] = IPC_Desc_Buffer(size, IPC_BUFFER_R); + cmdbuf[5] = (u32)taskID; + + if(R_FAILED(ret = svcSendSyncRequest(bossHandle)))return ret; + + return (Result)cmdbuf[1]; +} + +static Result bossipc_UnregisterTask(char *taskID, u32 unk) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + u32 size = strlen(taskID)+1; + + cmdbuf[0] = IPC_MakeHeader(0xC,2,2); // 0xC0082 + cmdbuf[1] = size; + cmdbuf[2] = unk; + cmdbuf[3] = IPC_Desc_Buffer(size, IPC_BUFFER_R); + cmdbuf[4] = (u32)taskID; + + if(R_FAILED(ret = svcSendSyncRequest(bossHandle)))return ret; + + return (Result)cmdbuf[1]; +} + +Result bossSendProperty(u16 PropertyID, void* buf, u32 size) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x14,2,2); // 0x140082 + cmdbuf[1] = PropertyID; + cmdbuf[2] = size; + cmdbuf[3] = IPC_Desc_Buffer(size, IPC_BUFFER_R); + cmdbuf[4] = (u32)buf; + + if(R_FAILED(ret = svcSendSyncRequest(bossHandle)))return ret; + + return (Result)cmdbuf[1]; +} + Result bossStartTaskImmediate(char *taskID) { Result ret = 0; @@ -91,6 +142,34 @@ Result bossStartTaskImmediate(char *taskID) return (Result)cmdbuf[1]; } +Result bossipc_CancelTask(char *taskID) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + u32 size = strlen(taskID)+1; + + cmdbuf[0] = IPC_MakeHeader(0x1E,1,2); // 0x1E0042 + cmdbuf[1] = size; + cmdbuf[2] = IPC_Desc_Buffer(size, IPC_BUFFER_R); + cmdbuf[3] = (u32)taskID; + + if(R_FAILED(ret = svcSendSyncRequest(bossHandle)))return ret; + + return (Result)cmdbuf[1]; +} + +Result bossDeleteTask(char *taskID, u32 unk) +{ + Result ret=0; + + ret = bossipc_CancelTask(taskID); + if(R_FAILED(ret))return ret; + + ret = bossipc_UnregisterTask(taskID, unk); + + return ret; +} + Result bossStartBgImmediate(char *taskID) { Result ret = 0; @@ -107,3 +186,19 @@ Result bossStartBgImmediate(char *taskID) return (Result)cmdbuf[1]; } +Result bossCmd34(char *taskID) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + u32 size = strlen(taskID)+1; + + cmdbuf[0] = IPC_MakeHeader(0x34,1,2); // 0x340042 + cmdbuf[1] = size; + cmdbuf[2] = IPC_Desc_Buffer(size, IPC_BUFFER_R); + cmdbuf[3] = (u32)taskID; + + if(R_FAILED(ret = svcSendSyncRequest(bossHandle)))return ret; + + return (Result)cmdbuf[1]; +} +