From 337eb60baed9d546027f3ef618cb0f1934ca175d Mon Sep 17 00:00:00 2001 From: idunoe Date: Mon, 27 Oct 2014 13:17:07 +0800 Subject: [PATCH] SRV: Added <7.X srv:pm --- libctru/include/3ds/srv.h | 4 +++ libctru/source/srv.c | 60 +++++++++++++++++++++++++++++++++++---- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/libctru/include/3ds/srv.h b/libctru/include/3ds/srv.h index 5012eeb..141c0c6 100644 --- a/libctru/include/3ds/srv.h +++ b/libctru/include/3ds/srv.h @@ -4,3 +4,7 @@ Result srvInit(); Result srvExit(); Result srvRegisterClient(); Result srvGetServiceHandle(Handle* out, char* name); + +Result srvPmInit(); +Result srvRegisterProcess(u32 procid, u32 count, void *serviceaccesscontrol); +Result srvUnregisterProcess(u32 procid); diff --git a/libctru/source/srv.c b/libctru/source/srv.c index 06f3d8b..257b585 100644 --- a/libctru/source/srv.c +++ b/libctru/source/srv.c @@ -31,7 +31,6 @@ extern service_list_t* __service_ptr; static Handle g_srv_handle = 0; - static int __name_cmp(const char* a, const char* b) { u32 i; @@ -45,7 +44,7 @@ static int __name_cmp(const char* a, const char* b) { return 0; } -Handle __get_handle_from_list(char* name) { +Handle __get_handle_from_list(const char* name) { if((u32)__service_ptr == 0) return 0; @@ -83,18 +82,22 @@ Result srvExit() Result srvRegisterClient() { + Result rc = 0; + u32* cmdbuf = getThreadCommandBuffer(); + cmdbuf[0] = 0x10002; cmdbuf[1] = 0x20; - Result rc; if((rc = svcSendSyncRequest(g_srv_handle)))return rc; return cmdbuf[1]; } -Result srvGetServiceHandle(Handle* out, char* name) +Result srvGetServiceHandle(Handle* out, const char* name) { + Result rc = 0; + /* Look in service-list given to us by loader. If we find find a match, we return it. */ Handle h = __get_handle_from_list(name); @@ -109,10 +112,55 @@ Result srvGetServiceHandle(Handle* out, char* name) strcpy((char*) &cmdbuf[1], name); cmdbuf[3] = strlen(name); cmdbuf[4] = 0x0; - - Result rc; + if((rc = svcSendSyncRequest(g_srv_handle)))return rc; *out = cmdbuf[3]; return cmdbuf[1]; } + +// Old srv:pm interface, will only work on systems where srv:pm was a port (<7.X) +Result srvPmInit() +{ + Result rc = 0; + + if((rc = svcConnectToPort(&g_srv_handle, "srv:pm")))return rc; + + if((rc = srvRegisterClient())) { + svcCloseHandle(g_srv_handle); + g_srv_handle = 0; + } + + return rc; +} + +Result srvRegisterProcess(u32 procid, u32 count, void *serviceaccesscontrol) +{ + Result rc = 0; + + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x04030082; // <7.x + cmdbuf[1] = procid; + cmdbuf[2] = count; + cmdbuf[3] = (count << 16) | 2; + cmdbuf[4] = (u32)serviceaccesscontrol; + + if((rc = svcSendSyncRequest(g_srv_handle))) return rc; + + return cmdbuf[1]; +} + +Result srvUnregisterProcess(u32 procid) +{ + Result rc = 0; + + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x04040040; // <7.x + cmdbuf[1] = procid; + + if((rc = svcSendSyncRequest(g_srv_handle))) return rc; + + return cmdbuf[1]; +} \ No newline at end of file