From 2c04f993d6c74a494f4f06198765b3cf1df832ce Mon Sep 17 00:00:00 2001 From: smea Date: Tue, 23 Dec 2014 20:47:00 -0800 Subject: [PATCH] added HB service support (ninjhax only) --- libctru/include/3ds.h | 1 + libctru/include/3ds/services/hb.h | 16 +++++++++++ libctru/source/services/hb.c | 48 +++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 libctru/include/3ds/services/hb.h create mode 100644 libctru/source/services/hb.c diff --git a/libctru/include/3ds.h b/libctru/include/3ds.h index 3366a84..1713255 100644 --- a/libctru/include/3ds.h +++ b/libctru/include/3ds.h @@ -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 index 0000000..4c9db57 --- /dev/null +++ b/libctru/include/3ds/services/hb.h @@ -0,0 +1,16 @@ +#ifndef HB_H +#define HB_H + +// WARNING ! THIS FILE PROVIDES AN INTERFACE TO A NON-OFFICIAL SERVICE PROVIDED BY NINJHAX +// BY USING COMMANDS FROM THIS SERVICE YOU WILL LIKELY MAKE YOUR APPLICATION INCOMPATIBLE WITH OTHER HOMEBREW LAUNCHING METHODS +// A GOOD WAY TO COPE WITH THIS IS TO CHECK THE OUTPUT OF initHb FOR ERRORS + +#include <3ds/types.h> + +Result initHb(); +void exitHb(); + +Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv); +Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages); + +#endif diff --git a/libctru/source/services/hb.c b/libctru/source/services/hb.c new file mode 100644 index 0000000..8221a4e --- /dev/null +++ b/libctru/source/services/hb.c @@ -0,0 +1,48 @@ +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/hb.h> + +static Handle hbHandle; + +Result initHb() +{ + return srvGetServiceHandle(&hbHandle, "hb:HB"); +} + +void exitHb() +{ + svcCloseHandle(hbHandle); +} + +Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x00060000; + + if((ret = svcSendSyncRequest(hbHandle))!=0) return ret; + + if(load3dsx)*load3dsx=(void*)cmdbuf[2]; + if(setArgv)*setArgv=(void*)cmdbuf[3]; + + return (Result)cmdbuf[1]; +} + +Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x000900C0; + cmdbuf[1] = (u32)addr; + cmdbuf[2] = pages; + cmdbuf[3] = mode; + + if((ret = svcSendSyncRequest(hbHandle))!=0) return ret; + + if(reprotectedPages)*reprotectedPages=(u32)cmdbuf[2]; + + return (Result)cmdbuf[1]; +}