]> Chaos Git - corbenik/ctrulib.git/commitdiff
SRV: Added <7.X srv:pm
authoridunoe <idunoe@asia.com>
Mon, 27 Oct 2014 05:17:07 +0000 (13:17 +0800)
committeridunoe <idunoe@asia.com>
Mon, 27 Oct 2014 05:17:07 +0000 (13:17 +0800)
libctru/include/3ds/srv.h
libctru/source/srv.c

index 5012eeb2def68ee48a657a2862287c9aa2ea3bda..141c0c6b5376103500b92e303e5adf864136ba14 100644 (file)
@@ -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);
index 06f3d8bdc6f9bcdd6ff80aa3f31157a505db58a9..257b58551201f2579e71f4964d32c32f64a9fb32 100644 (file)
@@ -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