]> Chaos Git - corbenik/ctrulib.git/commitdiff
added HB service support (ninjhax only)
authorsmea <smealum@gmail.com>
Wed, 24 Dec 2014 04:47:00 +0000 (20:47 -0800)
committersmea <smealum@gmail.com>
Wed, 24 Dec 2014 04:47:00 +0000 (20:47 -0800)
libctru/include/3ds.h
libctru/include/3ds/services/hb.h [new file with mode: 0644]
libctru/source/services/hb.c [new file with mode: 0644]

index 3366a846c1e019061180366b8f238dff5b7a19cc..17132558b784c2f7c7d30ef66b74c60368363465 100644 (file)
@@ -30,6 +30,7 @@ extern "C" {
 #include <3ds/services/mic.h>
 #include <3ds/services/mvd.h>
 #include <3ds/services/qtm.h>
+#include <3ds/services/hb.h>
 
 #include <3ds/gpu/gx.h>
 #include <3ds/gpu/gpu.h>
diff --git a/libctru/include/3ds/services/hb.h b/libctru/include/3ds/services/hb.h
new file mode 100644 (file)
index 0000000..4c9db57
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef HB_H\r
+#define HB_H\r
+\r
+// WARNING ! THIS FILE PROVIDES AN INTERFACE TO A NON-OFFICIAL SERVICE PROVIDED BY NINJHAX\r
+// BY USING COMMANDS FROM THIS SERVICE YOU WILL LIKELY MAKE YOUR APPLICATION INCOMPATIBLE WITH OTHER HOMEBREW LAUNCHING METHODS\r
+// A GOOD WAY TO COPE WITH THIS IS TO CHECK THE OUTPUT OF initHb FOR ERRORS\r
+\r
+#include <3ds/types.h>\r
+\r
+Result initHb();\r
+void exitHb();\r
+\r
+Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv);\r
+Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages);\r
+\r
+#endif\r
diff --git a/libctru/source/services/hb.c b/libctru/source/services/hb.c
new file mode 100644 (file)
index 0000000..8221a4e
--- /dev/null
@@ -0,0 +1,48 @@
+#include <3ds/types.h>\r
+#include <3ds/svc.h>\r
+#include <3ds/srv.h>\r
+#include <3ds/services/hb.h>\r
+\r
+static Handle hbHandle;\r
+\r
+Result initHb()\r
+{\r
+       return srvGetServiceHandle(&hbHandle, "hb:HB");\r
+}\r
+\r
+void exitHb()\r
+{\r
+       svcCloseHandle(hbHandle);\r
+}\r
+\r
+Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv)\r
+{\r
+       Result ret = 0;\r
+       u32 *cmdbuf = getThreadCommandBuffer();\r
+\r
+       cmdbuf[0] = 0x00060000;\r
+\r
+       if((ret = svcSendSyncRequest(hbHandle))!=0) return ret;\r
+\r
+       if(load3dsx)*load3dsx=(void*)cmdbuf[2];\r
+       if(setArgv)*setArgv=(void*)cmdbuf[3];\r
+       \r
+       return (Result)cmdbuf[1];\r
+}\r
+\r
+Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages)\r
+{\r
+       Result ret = 0;\r
+       u32 *cmdbuf = getThreadCommandBuffer();\r
+\r
+       cmdbuf[0] = 0x000900C0;\r
+       cmdbuf[1] = (u32)addr;\r
+       cmdbuf[2] = pages;\r
+       cmdbuf[3] = mode;\r
+\r
+       if((ret = svcSendSyncRequest(hbHandle))!=0) return ret;\r
+\r
+       if(reprotectedPages)*reprotectedPages=(u32)cmdbuf[2];\r
+       \r
+       return (Result)cmdbuf[1];\r
+}\r