From 11c5986721b25769dcb60e698397b8341c2d3a3a Mon Sep 17 00:00:00 2001 From: Nanquitas Date: Fri, 10 Feb 2017 17:39:22 +0100 Subject: [PATCH] Update for 3.4 Preview 5 / Extended Memory mode on Old3DS --- Makefile | 69 ++- resources/iconM3.png | Bin 0 -> 2974 bytes romfs/{ntr_3_4.bin => ntr.n3ds.bin} | Bin 260264 -> 255044 bytes romfs/ntr.o3ds.bin | Bin 0 -> 70772 bytes source/appInfo.h | 8 +- source/config.c | 14 +- source/config.h | 5 +- source/homemenu.c | 730 ++++++++++++++++------------ source/main.c | 46 +- source/main.h | 29 +- source/mainMenu.c | 35 +- source/memory_functions.c | 212 ++++---- source/ntr_launcher.c | 19 +- source/pathPatcher.c | 26 +- source/updater.c | 5 +- 15 files changed, 765 insertions(+), 433 deletions(-) create mode 100644 resources/iconM3.png rename romfs/{ntr_3_4.bin => ntr.n3ds.bin} (70%) create mode 100644 romfs/ntr.o3ds.bin diff --git a/Makefile b/Makefile index e051959..75448bc 100644 --- a/Makefile +++ b/Makefile @@ -13,13 +13,24 @@ endif FONZD = 0 PABLOMK7 = 0 +EXTENDEDMODE = 0 -ifeq ($(FONZD), 1) - NAME := BootNTRSelector-FONZD-Banner -endif +ifeq ($(EXTENDEDMODE), 1) + ifeq ($(FONZD), 1) + NAME := BootNTRSelectorMode-3-FONZD-Banner + endif + + ifeq ($(PABLOMK7), 1) + NAME := BootNTRSelector-Mode3-PabloMK7-Banner + endif +else + ifeq ($(FONZD), 1) + NAME := BootNTRSelector-FONZD-Banner + endif -ifeq ($(PABLOMK7), 1) - NAME := BootNTRSelector-PabloMK7-Banner + ifeq ($(PABLOMK7), 1) + NAME := BootNTRSelector-PabloMK7-Banner + endif endif @@ -34,7 +45,7 @@ LIBRARY_DIRS := $(PORTLIBS) $(CTRULIB) LIBRARIES := citro3d ctru png z m VERSION_MAJOR := 2 -VERSION_MINOR := 5 +VERSION_MINOR := 6 VERSION_MICRO := 0 @@ -45,7 +56,8 @@ BUILD_FLAGS_CC := -g -Wall -Wno-strict-aliasing -O3 -mword-relocations \ -DFONZD_BANNER=${FONZD} -DPABLOMK7_BANNER=${PABLOMK7} \ -DAPP_VERSION_MAJOR=${VERSION_MAJOR} \ -DAPP_VERSION_MINOR=${VERSION_MINOR} \ - -DAPP_VERSION_REVISION=${VERSION_MICRO} + -DAPP_VERSION_REVISION=${VERSION_MICRO} \ + -DEXTENDEDMODE=${EXTENDEDMODE} BUILD_FLAGS_CXX := $(COMMON_FLAGS) -std=gnu++11 RUN_FLAGS := @@ -56,7 +68,11 @@ RUN_FLAGS := # 3DS/Wii U CONFIGURATION # ifeq ($(TARGET),$(filter $(TARGET),3DS WIIU)) - TITLE := Boot NTR Selector + ifeq ($(EXTENDEDMODE), 1) + TITLE := Boot NTR Selector Mode 3 + else + TITLE := Boot NTR Selector + endif DESCRIPTION := Enhanced NTR CFW Loader AUTHOR := Nanquitas endif @@ -68,13 +84,21 @@ ifeq ($(TARGET),3DS) LIBRARIES += citro3d ctru png z m PRODUCT_CODE := CTR-P-BNTR - UNIQUE_ID := 0xEB000 + ifeq ($(EXTENDEDMODE), 1) + UNIQUE_ID := 0xEB300 + else + UNIQUE_ID := 0xEB000 + endif CATEGORY := Application USE_ON_SD := true MEMORY_TYPE := Application - SYSTEM_MODE := 64MB + ifeq ($(EXTENDEDMODE), 1) + SYSTEM_MODE := 80MB + else + SYSTEM_MODE := 64MB + endif SYSTEM_MODE_EXT := Legacy CPU_SPEED := 268MHz ENABLE_L2_CACHE := true @@ -89,20 +113,15 @@ ifeq ($(TARGET),3DS) ifeq ($(PABLOMK7), 1) BANNER_IMAGE := resources/PabloMK7_banner.cgfx endif - ICON := resources/icon.png + ifeq ($(EXTENDEDMODE), 1) + ICON := resources/iconM3.png + else + ICON := resources/icon.png + endif + LOGO := endif -# Wii U CONFIGURATION # - -ifeq ($(TARGET),WIIU) - LIBRARY_DIRS += - LIBRARIES += - - LONG_DESCRIPTION := Enhanced NTR CFW Loader - ICON := -endif - # INTERNAL # include buildtools/make_base @@ -111,4 +130,10 @@ FONZD: clean make FONZD=1 PABLOMK7: clean - make PABLOMK7=1 \ No newline at end of file + make PABLOMK7=1 + +FONZDM3: clean + make FONZD=1 EXTENDEDMODE=1 + +PABLOMK7M3: clean + make PABLOMK7=1 EXTENDEDMODE=1 \ No newline at end of file diff --git a/resources/iconM3.png b/resources/iconM3.png new file mode 100644 index 0000000000000000000000000000000000000000..fc506f7f9ccc9a0ca20a84627351240d15a923c7 GIT binary patch literal 2974 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 Um;rPP7ytkO07*qoM6N<$f<(f(9{>OV literal 0 HcmV?d00001 diff --git a/romfs/ntr_3_4.bin b/romfs/ntr.n3ds.bin similarity index 70% rename from romfs/ntr_3_4.bin rename to romfs/ntr.n3ds.bin index da5543c885b36996f11113a99a3721d12034e453..5660c9b3bce1cd6a7bc8cbece2dbd80fc7fe1283 100644 GIT binary patch delta 36322 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 UJa;bC`28Q}f7kBq+;^V*53UNvQvd(} delta 41701 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 L^Ah;~Ndo^HiRcT4 literal 0 HcmV?d00001 diff --git a/source/appInfo.h b/source/appInfo.h index 75f680b..028f86a 100644 --- a/source/appInfo.h +++ b/source/appInfo.h @@ -3,9 +3,11 @@ #include "draw.h" -#define MAX_ENTRIES 10 -#define BUFFER_SIZE 100 -#define DEFAULT_COLOR 0xFFF8AE2D +#define MAX_ENTRIES 10 +#define BUFFER_SIZE 100 +#define DEFAULT_COLOR 0xFFF8AE2D +#define RED 0xFFFF0000 +#define GREEN 0xFF00FF00 typedef enum diff --git a/source/config.c b/source/config.c index fd7ec9e..4ae108f 100644 --- a/source/config.c +++ b/source/config.c @@ -136,21 +136,31 @@ void configInit(void) firstLaunch(); if (!saveConfig()) newAppTop(DEFAULT_COLOR, 0, "A problem occured while saving the settings."); + #if EXTENDEDMODE + bnConfig->versionToLaunch = V34; + #endif } else { time_t current = time(NULL); - - if (current - config->lastUpdateTime >= SECONDS_IN_WEEK) +#if EXTENDEDMODE + if (current - config->lastUpdateTime3 >= SECONDS_IN_WEEK) +#else + if (current - config->lastUpdateTime >= SECONDS_IN_WEEK) +#endif bnConfig->checkForUpdate = true; else bnConfig->checkForUpdate = false; } // svcCloseHandle(fsuHandle); +#if EXTENDEDMODE + bnConfig->versionToLaunch = V34; +#else if (config->flags & LV32) bnConfig->versionToLaunch = V32; else if (config->flags & LV33) bnConfig->versionToLaunch = V33; else if (config->flags & LV34) bnConfig->versionToLaunch = V34; +#endif error: return; } diff --git a/source/config.h b/source/config.h index 25e4637..9590dfa 100644 --- a/source/config.h +++ b/source/config.h @@ -9,7 +9,7 @@ (((major)<<24)|((minor)<<16)|((revision)<<8)) #endif -#define CURRENT_CONFIG_VERSION SYSTEM_VERSION(1, 0, 2) +#define CURRENT_CONFIG_VERSION SYSTEM_VERSION(1, 0, 3) #define SECONDS_IN_WEEK 604800 #define SECONDS_IN_DAY 86400 @@ -31,6 +31,7 @@ typedef struct config_s char binariesPath[0x100]; char pluginPath[0x100]; time_t lastUpdateTime; + time_t lastUpdateTime3; } config_t; @@ -67,6 +68,8 @@ typedef struct ntrConfig_s u32 arm11BinStart; u32 arm11BinSize; u32 ShowDbgFunc; + u32 memorymode; + char path[0x100]; } ntrConfig_t; typedef struct bootNtrConfig_s diff --git a/source/homemenu.c b/source/homemenu.c index 3c71c77..de6cae2 100644 --- a/source/homemenu.c +++ b/source/homemenu.c @@ -1,21 +1,27 @@ #include "main.h" #include "config.h" -extern ntrConfig_t *ntrConfig; -extern bootNtrConfig_t *bnConfig; -extern u8 *tmpBuffer; -extern char *g_primary_error; -extern char *g_secondary_error; +extern ntrConfig_t *ntrConfig; +extern bootNtrConfig_t *bnConfig; +extern u8 *tmpBuffer; +extern char *g_primary_error; +extern char *g_secondary_error; -Result bnInitParamsByHomeMenu(void) +#if DEBUG + #define newAppTopDebug(...) newAppTop(...) +#else + #define newAppTopDebug(...) +#endif + +/*Result bnInitParamsByHomeMenu(void) { - u32 hProcess = 0; - u32 ret; - vu32 t = 0x11111111; - u8 region; + u32 hProcess = 0; + u32 ret; + vu32 t = 0x11111111; + u8 region; again: - ret = svcOpenProcess(&hProcess, ntrConfig->HomeMenuPid); + ret = svcOpenProcess(&hProcess, ntrConfig->HomeMenuPid); if (ret) { newAppStatus(DEFAULT_COLOR, TINY | CENTER, "An error occurred"); @@ -27,300 +33,426 @@ Result bnInitParamsByHomeMenu(void) updateUI(); goto again; } - check_prim(ret, OPENPROCESS_FAILURE); - flushDataCache(); - *(u32 *)(tmpBuffer) = 0; - ret = copyRemoteMemory(CURRENT_PROCESS_HANDLE, (u32)tmpBuffer, hProcess, 0x00200000, 4); - check_sec(ret, REMOTECOPY_FAILURE); - svcCloseHandle(hProcess); - t = *(u32*)(tmpBuffer); - ret = cfguInit(); - check_prim(ret, CFGU_INIT_FAILURE); - ret = CFGU_SecureInfoGetRegion(®ion); - check_prim(ret, CFGU_SECURE_FAILURE); - if (region >= 7) - { - g_primary_error = WRONGREGION; + check_prim(ret, OPENPROCESS_FAILURE); + flushDataCache(); + *(u32 *)(tmpBuffer) = 0; + ret = copyRemoteMemory(CURRENT_PROCESS_HANDLE, (u32)tmpBuffer, hProcess, 0x00200000, 4); + check_sec(ret, REMOTECOPY_FAILURE); + svcCloseHandle(hProcess); + t = *(u32*)(tmpBuffer); + ret = cfguInit(); + check_prim(ret, CFGU_INIT_FAILURE); + ret = CFGU_SecureInfoGetRegion(®ion); + check_prim(ret, CFGU_SECURE_FAILURE); + if (region >= 7) + { + g_primary_error = WRONGREGION; goto error; - } - cfguExit(); - if (t == 0xe3a08001) - { - // old 3ds 10.6.0-27K - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 6, 0); - ntrConfig->HomeMenuInjectAddr = 0x12ded0; - ntrConfig->HomeFSReadAddr = 0x12c19c; - ntrConfig->HomeCardUpdateInitAddr = 0x118d78; - ntrConfig->HomeFSUHandleAddr = 0x32dfa4; - ntrConfig->HomeAptStartAppletAddr = 0x12ea08; - } - else if (t == 0xe8960140) - { - // old 3ds 10.3 usa - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 3, 0); - ntrConfig->HomeMenuInjectAddr = 0x12ddc4; - ntrConfig->HomeFSReadAddr = 0x12c090; - ntrConfig->HomeCardUpdateInitAddr = 0x118cc0; - ntrConfig->HomeFSUHandleAddr = 0x32dfa4; - ntrConfig->HomeAptStartAppletAddr = 0x12e8fc; - } - else if (t == 0xe5c580f5) - { - // old 3ds 10.3 eur - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 3, 0); - ntrConfig->HomeMenuInjectAddr = 0x12ddc4; - ntrConfig->HomeFSReadAddr = 0x12c090; - ntrConfig->HomeCardUpdateInitAddr = 0x118cc0; - ntrConfig->HomeFSUHandleAddr = 0x32dfa4; - ntrConfig->HomeAptStartAppletAddr = 0x12e8fc; - } - else if (t == 0x0a000004) - { - // old 3ds 10.1 eur - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 1, 0); - ntrConfig->HomeMenuInjectAddr = 0x12ddc4; - ntrConfig->HomeFSReadAddr = 0x12c090; - ntrConfig->HomeCardUpdateInitAddr = 0x118cc0; - ntrConfig->HomeFSUHandleAddr = 0x32dfa4; - ntrConfig->HomeAptStartAppletAddr = 0x12e8fc; - } - else if (t == 0xe1530721) - { - // old 3ds 10.1 usa - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 1, 0); - ntrConfig->HomeMenuInjectAddr = 0x12ddc4; - ntrConfig->HomeFSReadAddr = 0x12c090; - ntrConfig->HomeCardUpdateInitAddr = 0x118cc0; - ntrConfig->HomeFSUHandleAddr = 0x32dfa4; - ntrConfig->HomeAptStartAppletAddr = 0x12e8fc; - } - else if (t == 0xe59f80f4) - { - // new3ds 9.2.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 2, 0);; - ntrConfig->HomeMenuInjectAddr = 0x131208; - ntrConfig->HomeFSReadAddr = 0x0012F6EC; - ntrConfig->HomeCardUpdateInitAddr = 0x139900; - ntrConfig->HomeFSUHandleAddr = 0x002F0EFC; - ntrConfig->HomeAptStartAppletAddr = 0x00131C98; + } + cfguExit(); + if (t == 0xe3a08001) + { + // old 3ds 10.6.0-27K + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 6, 0); + ntrConfig->HomeMenuInjectAddr = 0x12ded0; + ntrConfig->HomeFSReadAddr = 0x12c19c; + ntrConfig->HomeCardUpdateInitAddr = 0x118d78; + ntrConfig->HomeFSUHandleAddr = 0x32dfa4; + ntrConfig->HomeAptStartAppletAddr = 0x12ea08; + } + else if (t == 0xe8960140) + { + // old 3ds 10.3 usa + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 3, 0); + ntrConfig->HomeMenuInjectAddr = 0x12ddc4; + ntrConfig->HomeFSReadAddr = 0x12c090; + ntrConfig->HomeCardUpdateInitAddr = 0x118cc0; + ntrConfig->HomeFSUHandleAddr = 0x32dfa4; + ntrConfig->HomeAptStartAppletAddr = 0x12e8fc; + } + else if (t == 0xe5c580f5) + { + // old 3ds 10.3 eur + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 3, 0); + ntrConfig->HomeMenuInjectAddr = 0x12ddc4; + ntrConfig->HomeFSReadAddr = 0x12c090; + ntrConfig->HomeCardUpdateInitAddr = 0x118cc0; + ntrConfig->HomeFSUHandleAddr = 0x32dfa4; + ntrConfig->HomeAptStartAppletAddr = 0x12e8fc; + } + else if (t == 0x0a000004) + { + // old 3ds 10.1 eur + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 1, 0); + ntrConfig->HomeMenuInjectAddr = 0x12ddc4; + ntrConfig->HomeFSReadAddr = 0x12c090; + ntrConfig->HomeCardUpdateInitAddr = 0x118cc0; + ntrConfig->HomeFSUHandleAddr = 0x32dfa4; + ntrConfig->HomeAptStartAppletAddr = 0x12e8fc; + } + else if (t == 0xe1530721) + { + // old 3ds 10.1 usa + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 1, 0); + ntrConfig->HomeMenuInjectAddr = 0x12ddc4; + ntrConfig->HomeFSReadAddr = 0x12c090; + ntrConfig->HomeCardUpdateInitAddr = 0x118cc0; + ntrConfig->HomeFSUHandleAddr = 0x32dfa4; + ntrConfig->HomeAptStartAppletAddr = 0x12e8fc; + } + else if (t == 0xe59f80f4) + { + // new3ds 9.2.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 2, 0);; + ntrConfig->HomeMenuInjectAddr = 0x131208; + ntrConfig->HomeFSReadAddr = 0x0012F6EC; + ntrConfig->HomeCardUpdateInitAddr = 0x139900; + ntrConfig->HomeFSUHandleAddr = 0x002F0EFC; + ntrConfig->HomeAptStartAppletAddr = 0x00131C98; - } - else if (t == 0xE28DD008) - { - // new3ds 9.1.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 1, 0);; - ntrConfig->HomeMenuInjectAddr = 0x00131208; - ntrConfig->HomeFSReadAddr = 0x0012F6EC; - ntrConfig->HomeCardUpdateInitAddr = 0x139900; - ntrConfig->HomeFSUHandleAddr = 0x002F1EFC; - ntrConfig->HomeAptStartAppletAddr = 0x00131C98; - } - else if (t == 0xE1B03F02) - { - // new3ds 9.0.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 0, 0);; - ntrConfig->HomeMenuInjectAddr = 0x00130CFC; - ntrConfig->HomeFSReadAddr = 0x0012F224; - ntrConfig->HomeCardUpdateInitAddr = 0x001393F4; - ntrConfig->HomeFSUHandleAddr = 0x002EFEFC; - ntrConfig->HomeAptStartAppletAddr = 0x0013178C; - } - else if (t == 0xE28F2E19) - { - // new3ds 8.1.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(8, 1, 0);; - ntrConfig->HomeMenuInjectAddr = 0x00129098; - ntrConfig->HomeFSReadAddr = 0x0011AAB8; - ntrConfig->HomeCardUpdateInitAddr = 0x0013339C; - ntrConfig->HomeFSUHandleAddr = 0x00278E4C; - ntrConfig->HomeAptStartAppletAddr = 0x00129BFC; - } - else if (t == 0xe59f201c) - { - // iQue 9.3.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 3, 0); - ntrConfig->HomeMenuInjectAddr = 0x13b7b0; - ntrConfig->HomeFSReadAddr = 0x1188e0; - ntrConfig->HomeCardUpdateInitAddr = 0x13434c; - ntrConfig->HomeFSUHandleAddr = 0x2240d4; - ntrConfig->HomeAptStartAppletAddr = 0x128480; - } - else if (t == 0xe3a06001) - { - // iQue 4.4.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(4, 4, 0); - ntrConfig->HomeMenuInjectAddr = 0x13c344; - ntrConfig->HomeFSReadAddr = 0x118888; - ntrConfig->HomeCardUpdateInitAddr = 0x134448; - ntrConfig->HomeFSUHandleAddr = 0x2210cc; - ntrConfig->HomeAptStartAppletAddr = 0x12844c; - } - else if (t == 0xeb0083b3) - { - // new3ds 9.5.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 5, 0); - ntrConfig->HomeMenuInjectAddr = 0x12e1f8; - ntrConfig->HomeFSReadAddr = 0x12c624; - ntrConfig->HomeCardUpdateInitAddr = 0x136a8c; - ntrConfig->HomeFSUHandleAddr = 0x313f7c; - ntrConfig->HomeAptStartAppletAddr = 0x12ec88; - } - else if (t == 0xe2053001) - { - // USA 9.9.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 9, 0); - ntrConfig->HomeMenuInjectAddr = 0x12ddc4; - ntrConfig->HomeFSReadAddr = 0x12c090; - ntrConfig->HomeCardUpdateInitAddr = 0x118cc0; - ntrConfig->HomeFSUHandleAddr = 0x32dfa4; - ntrConfig->HomeAptStartAppletAddr = 0x12e8fc; - } - else if (t == 0xe1a00000) - { - // TW 9.8.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 8, 0); - ntrConfig->HomeMenuInjectAddr = 0x13ba60; - ntrConfig->HomeFSReadAddr = 0x1188e0; - ntrConfig->HomeCardUpdateInitAddr = 0x13434c; - ntrConfig->HomeFSUHandleAddr = 0x2240d4; - ntrConfig->HomeAptStartAppletAddr = 0x128480; - } - else if (t == 0xe12fff1e) - { - if (region == 5) - { - // KR 10.1.0-23 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 1, 0); - ntrConfig->HomeMenuInjectAddr = 0x12ddc4; - ntrConfig->HomeFSReadAddr = 0x12c090; - ntrConfig->HomeCardUpdateInitAddr = 0x118cc0; - ntrConfig->HomeFSUHandleAddr = 0x32dfa4; - ntrConfig->HomeAptStartAppletAddr = 0x12e8fc; - } - else - { - // TW 9.9.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 9, 0); - ntrConfig->HomeMenuInjectAddr = 0x13c0ac; - ntrConfig->HomeFSReadAddr = 0x118c04; - ntrConfig->HomeCardUpdateInitAddr = 0x134794; - ntrConfig->HomeFSUHandleAddr = 0x2250e4; - ntrConfig->HomeAptStartAppletAddr = 0x1288c8; - } - } - else if (t == 0x0032dde8) - { - // JP 9.9.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 9, 0); - ntrConfig->HomeMenuInjectAddr = 0x12ddc4; - ntrConfig->HomeFSReadAddr = 0x12c090; - ntrConfig->HomeCardUpdateInitAddr = 0x118cc0; - ntrConfig->HomeFSUHandleAddr = 0x32dfa4; - ntrConfig->HomeAptStartAppletAddr = 0x12e8fc; - } - else if (t == 0xe1530005) - { - // JP 9.6.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 6, 0); - ntrConfig->HomeMenuInjectAddr = 0x12ddf4; - ntrConfig->HomeFSReadAddr = 0x12c0c0; - ntrConfig->HomeCardUpdateInitAddr = 0x118cf0; - ntrConfig->HomeFSUHandleAddr = 0x32efac; - ntrConfig->HomeAptStartAppletAddr = 0x12e92c; - } - else if (t == 0xe1a02004) - { - // USA 9.4.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 4, 0); - ntrConfig->HomeMenuInjectAddr = 0x12e204; - ntrConfig->HomeFSReadAddr = 0x12c630; - ntrConfig->HomeCardUpdateInitAddr = 0x136a98; - ntrConfig->HomeFSUHandleAddr = 0x313f7c; - ntrConfig->HomeAptStartAppletAddr = 0x12ec94; - } - else if (t == 0xe1966009) - { - //europe 9.7.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 7, 0); - ntrConfig->HomeMenuInjectAddr = 0x12dd98; - ntrConfig->HomeFSReadAddr = 0x12c064; - ntrConfig->HomeCardUpdateInitAddr = 0x118c94; - ntrConfig->HomeFSUHandleAddr = 0x32dfa4; - ntrConfig->HomeAptStartAppletAddr = 0x12e8d0; - } - else if (t == 0xe28f3fde) - { - // USA 8.1.0-9U - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(8, 1, 0); - ntrConfig->HomeMenuInjectAddr = 0x13f2d8; - ntrConfig->HomeFSReadAddr = 0x11a994; - ntrConfig->HomeCardUpdateInitAddr = 0x13719c; - ntrConfig->HomeFSUHandleAddr = 0x238df4; - ntrConfig->HomeAptStartAppletAddr = 0x12aac0; - } - else if (t == 0xe1a0231c) - { - // Korea 9.9.0 - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 9, 0); - ntrConfig->HomeMenuInjectAddr = 0x12dd98; - ntrConfig->HomeFSReadAddr = 0x12c064; - ntrConfig->HomeCardUpdateInitAddr = 0x118c94; - ntrConfig->HomeFSUHandleAddr = 0x32dfa4; - ntrConfig->HomeAptStartAppletAddr = 0x12e8d0; - } - else if (t == 0xea00001f) - { - // 10.4.0-29J - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 4, 0); - ntrConfig->HomeMenuInjectAddr = 0x12ded0; - ntrConfig->HomeFSReadAddr = 0x12c19c; - ntrConfig->HomeCardUpdateInitAddr = 0x118d78; - ntrConfig->HomeFSUHandleAddr = 0x32efa4; - ntrConfig->HomeAptStartAppletAddr = 0x12ea08; - } - else if (t == 0xe1a00006) - { - // new3ds 10.5.0U - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 5, 0); - ntrConfig->HomeMenuInjectAddr = 0x12ded0; - ntrConfig->HomeFSReadAddr = 0x12c19c; - ntrConfig->HomeCardUpdateInitAddr = 0x118d78; - ntrConfig->HomeFSUHandleAddr = 0x32dfa4; - ntrConfig->HomeAptStartAppletAddr = 0x12ea08; - } - else if (t == 0xe7941100 || t == 0xea0020d2) - { - // old/new3ds 11.1.0U/k - // old/new3ds 11.2.0U/k - // old/new3DS 11.3.0 U - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(11, 1, 0); - ntrConfig->HomeMenuInjectAddr = 0x12ded0; - ntrConfig->HomeFSReadAddr = 0x12c19c; - ntrConfig->HomeCardUpdateInitAddr = 0x118d78; - ntrConfig->HomeFSUHandleAddr = 0x32dfa4; - ntrConfig->HomeAptStartAppletAddr = 0x12ea08; - } - else if (t == 0xe0811101) - { - // old/new3ds 11.1.0E / J - // old/new3ds 11.2.0E / J - // old/new 11.3.0 E - ntrConfig->HomeMenuVersion = SYSTEM_VERSION(11, 1, 0); - ntrConfig->HomeMenuInjectAddr = 0x12ded0; - ntrConfig->HomeFSReadAddr = 0x12c19c; - ntrConfig->HomeCardUpdateInitAddr = 0x118d78; - ntrConfig->HomeFSUHandleAddr = 0x32efa4; - ntrConfig->HomeAptStartAppletAddr = 0x12ea08; - } + } + else if (t == 0xE28DD008) + { + // new3ds 9.1.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 1, 0);; + ntrConfig->HomeMenuInjectAddr = 0x00131208; + ntrConfig->HomeFSReadAddr = 0x0012F6EC; + ntrConfig->HomeCardUpdateInitAddr = 0x139900; + ntrConfig->HomeFSUHandleAddr = 0x002F1EFC; + ntrConfig->HomeAptStartAppletAddr = 0x00131C98; + } + else if (t == 0xE1B03F02) + { + // new3ds 9.0.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 0, 0);; + ntrConfig->HomeMenuInjectAddr = 0x00130CFC; + ntrConfig->HomeFSReadAddr = 0x0012F224; + ntrConfig->HomeCardUpdateInitAddr = 0x001393F4; + ntrConfig->HomeFSUHandleAddr = 0x002EFEFC; + ntrConfig->HomeAptStartAppletAddr = 0x0013178C; + } + else if (t == 0xE28F2E19) + { + // new3ds 8.1.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(8, 1, 0);; + ntrConfig->HomeMenuInjectAddr = 0x00129098; + ntrConfig->HomeFSReadAddr = 0x0011AAB8; + ntrConfig->HomeCardUpdateInitAddr = 0x0013339C; + ntrConfig->HomeFSUHandleAddr = 0x00278E4C; + ntrConfig->HomeAptStartAppletAddr = 0x00129BFC; + } + else if (t == 0xe59f201c) + { + // iQue 9.3.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 3, 0); + ntrConfig->HomeMenuInjectAddr = 0x13b7b0; + ntrConfig->HomeFSReadAddr = 0x1188e0; + ntrConfig->HomeCardUpdateInitAddr = 0x13434c; + ntrConfig->HomeFSUHandleAddr = 0x2240d4; + ntrConfig->HomeAptStartAppletAddr = 0x128480; + } + else if (t == 0xe3a06001) + { + // iQue 4.4.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(4, 4, 0); + ntrConfig->HomeMenuInjectAddr = 0x13c344; + ntrConfig->HomeFSReadAddr = 0x118888; + ntrConfig->HomeCardUpdateInitAddr = 0x134448; + ntrConfig->HomeFSUHandleAddr = 0x2210cc; + ntrConfig->HomeAptStartAppletAddr = 0x12844c; + } + else if (t == 0xeb0083b3) + { + // new3ds 9.5.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 5, 0); + ntrConfig->HomeMenuInjectAddr = 0x12e1f8; + ntrConfig->HomeFSReadAddr = 0x12c624; + ntrConfig->HomeCardUpdateInitAddr = 0x136a8c; + ntrConfig->HomeFSUHandleAddr = 0x313f7c; + ntrConfig->HomeAptStartAppletAddr = 0x12ec88; + } + else if (t == 0xe2053001) + { + // USA 9.9.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 9, 0); + ntrConfig->HomeMenuInjectAddr = 0x12ddc4; + ntrConfig->HomeFSReadAddr = 0x12c090; + ntrConfig->HomeCardUpdateInitAddr = 0x118cc0; + ntrConfig->HomeFSUHandleAddr = 0x32dfa4; + ntrConfig->HomeAptStartAppletAddr = 0x12e8fc; + } + else if (t == 0xe1a00000) + { + // TW 9.8.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 8, 0); + ntrConfig->HomeMenuInjectAddr = 0x13ba60; + ntrConfig->HomeFSReadAddr = 0x1188e0; + ntrConfig->HomeCardUpdateInitAddr = 0x13434c; + ntrConfig->HomeFSUHandleAddr = 0x2240d4; + ntrConfig->HomeAptStartAppletAddr = 0x128480; + } + else if (t == 0xe12fff1e) + { + if (region == 5) + { + // KR 10.1.0-23 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 1, 0); + ntrConfig->HomeMenuInjectAddr = 0x12ddc4; + ntrConfig->HomeFSReadAddr = 0x12c090; + ntrConfig->HomeCardUpdateInitAddr = 0x118cc0; + ntrConfig->HomeFSUHandleAddr = 0x32dfa4; + ntrConfig->HomeAptStartAppletAddr = 0x12e8fc; + } + else + { + // TW 9.9.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 9, 0); + ntrConfig->HomeMenuInjectAddr = 0x13c0ac; + ntrConfig->HomeFSReadAddr = 0x118c04; + ntrConfig->HomeCardUpdateInitAddr = 0x134794; + ntrConfig->HomeFSUHandleAddr = 0x2250e4; + ntrConfig->HomeAptStartAppletAddr = 0x1288c8; + } + } + else if (t == 0x0032dde8) + { + // JP 9.9.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 9, 0); + ntrConfig->HomeMenuInjectAddr = 0x12ddc4; + ntrConfig->HomeFSReadAddr = 0x12c090; + ntrConfig->HomeCardUpdateInitAddr = 0x118cc0; + ntrConfig->HomeFSUHandleAddr = 0x32dfa4; + ntrConfig->HomeAptStartAppletAddr = 0x12e8fc; + } + else if (t == 0xe1530005) + { + // JP 9.6.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 6, 0); + ntrConfig->HomeMenuInjectAddr = 0x12ddf4; + ntrConfig->HomeFSReadAddr = 0x12c0c0; + ntrConfig->HomeCardUpdateInitAddr = 0x118cf0; + ntrConfig->HomeFSUHandleAddr = 0x32efac; + ntrConfig->HomeAptStartAppletAddr = 0x12e92c; + } + else if (t == 0xe1a02004) + { + // USA 9.4.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 4, 0); + ntrConfig->HomeMenuInjectAddr = 0x12e204; + ntrConfig->HomeFSReadAddr = 0x12c630; + ntrConfig->HomeCardUpdateInitAddr = 0x136a98; + ntrConfig->HomeFSUHandleAddr = 0x313f7c; + ntrConfig->HomeAptStartAppletAddr = 0x12ec94; + } + else if (t == 0xe1966009) + { + //europe 9.7.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 7, 0); + ntrConfig->HomeMenuInjectAddr = 0x12dd98; + ntrConfig->HomeFSReadAddr = 0x12c064; + ntrConfig->HomeCardUpdateInitAddr = 0x118c94; + ntrConfig->HomeFSUHandleAddr = 0x32dfa4; + ntrConfig->HomeAptStartAppletAddr = 0x12e8d0; + } + else if (t == 0xe28f3fde) + { + // USA 8.1.0-9U + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(8, 1, 0); + ntrConfig->HomeMenuInjectAddr = 0x13f2d8; + ntrConfig->HomeFSReadAddr = 0x11a994; + ntrConfig->HomeCardUpdateInitAddr = 0x13719c; + ntrConfig->HomeFSUHandleAddr = 0x238df4; + ntrConfig->HomeAptStartAppletAddr = 0x12aac0; + } + else if (t == 0xe1a0231c) + { + // Korea 9.9.0 + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(9, 9, 0); + ntrConfig->HomeMenuInjectAddr = 0x12dd98; + ntrConfig->HomeFSReadAddr = 0x12c064; + ntrConfig->HomeCardUpdateInitAddr = 0x118c94; + ntrConfig->HomeFSUHandleAddr = 0x32dfa4; + ntrConfig->HomeAptStartAppletAddr = 0x12e8d0; + } + else if (t == 0xea00001f) + { + // 10.4.0-29J + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 4, 0); + ntrConfig->HomeMenuInjectAddr = 0x12ded0; + ntrConfig->HomeFSReadAddr = 0x12c19c; + ntrConfig->HomeCardUpdateInitAddr = 0x118d78; + ntrConfig->HomeFSUHandleAddr = 0x32efa4; + ntrConfig->HomeAptStartAppletAddr = 0x12ea08; + } + else if (t == 0xe1a00006) + { + // new3ds 10.5.0U + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(10, 5, 0); + ntrConfig->HomeMenuInjectAddr = 0x12ded0; + ntrConfig->HomeFSReadAddr = 0x12c19c; + ntrConfig->HomeCardUpdateInitAddr = 0x118d78; + ntrConfig->HomeFSUHandleAddr = 0x32dfa4; + ntrConfig->HomeAptStartAppletAddr = 0x12ea08; + } + else if (t == 0xe7941100 || t == 0xea0020d2) + { + // old/new3ds 11.1.0U/k + // old/new3ds 11.2.0U/k + // old/new3DS 11.3.0 U + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(11, 1, 0); + ntrConfig->HomeMenuInjectAddr = 0x12ded0; + ntrConfig->HomeFSReadAddr = 0x12c19c; + ntrConfig->HomeCardUpdateInitAddr = 0x118d78; + ntrConfig->HomeFSUHandleAddr = 0x32dfa4; + ntrConfig->HomeAptStartAppletAddr = 0x12ea08; + } + else if (t == 0xe0811101) + { + // old/new3ds 11.1.0E / J + // old/new3ds 11.2.0E / J + // old/new 11.3.0 E + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(11, 1, 0); + ntrConfig->HomeMenuInjectAddr = 0x12ded0; + ntrConfig->HomeFSReadAddr = 0x12c19c; + ntrConfig->HomeCardUpdateInitAddr = 0x118d78; + ntrConfig->HomeFSUHandleAddr = 0x32efa4; + ntrConfig->HomeAptStartAppletAddr = 0x12ea08; + } else - { - goto unsupported; - } - return (0); + { + goto unsupported; + } + return (0); unsupported: ntrConfig->HomeMenuVersion = 0; check_sec(RESULT_ERROR, UNKNOWN_HOMEMENU); error: - return (RESULT_ERROR); + return (RESULT_ERROR); +}*/ + + +#define MAX_MAP_SIZE (0x00400000) + +u32 translateAddr(u32 mappedAddr) +{ + if (mappedAddr < 0x0f000000) + { + return (0); + } + return (mappedAddr - 0x0f000000 + 0x00100000); +} + +u32 locateSwapBuffer(u32 startAddr, u32 endAddr) +{ + + static u32 pat[] = { 0xe1833000, 0xe2044cff, 0xe3c33cff, 0xe1833004, 0xe1824f93 }; + static u32 pat2[] = { 0xe8830e60, 0xee078f9a, 0xe3a03001, 0xe7902104 }; + static u32 pat3[] = { 0xee076f9a, 0xe3a02001, 0xe7901104, 0xe1911f9f, 0xe3c110ff}; + + u32 addr = searchBytes(startAddr, endAddr, (u8 *)pat, sizeof(pat), 4); + if (!addr) + { + addr = searchBytes(startAddr, endAddr, (u8 *)pat2, sizeof(pat2), 4); + } + if (!addr) + { + addr = searchBytes(startAddr, endAddr, (u8 *)pat3, sizeof(pat3), 4); + } + return (findNearestSTMFD(startAddr, addr)); +} + +static const u8 patFsRead[] = { 0xC2, 0x00, 0x02, 0x08 }; +static const u8 patFsHandle[] = { 0xf9, 0x67, 0xa0, 0x08 }; +static const u8 patCartUpdate[] = { 0x42, 0x00, 0x07, 0x00 }; +static const u8 patStartApplet[] = { 0x40, 0x01, 0x15, 0x00 }; + +Result analyseHomeMenu(void) +{ + Result ret = 0; + u32 text = 0x0f000000; + u32 mapSize = MAX_MAP_SIZE; + + MemInfo meminfo; + PageInfo pageinfo; + + memset(&meminfo, 0, sizeof(meminfo)); + memset(&pageinfo, 0, sizeof(pageinfo)); + + newAppTopDebug(DEFAULT_COLOR, SKINNY, "Starting analysis..."); + + ret = svcQueryMemory(&meminfo, &pageinfo, (u32)text); + if(R_FAILED(ret)) + { + newAppTopDebug(RED, SKINNY, "svcQueryMemory failed: 0x%08x", (unsigned int)ret); + return (RESULT_ERROR); + } + + if(meminfo.size < mapSize) + mapSize = meminfo.size; + + newAppTopDebug(DEFAULT_COLOR, SKINNY, "mapSize: %08x, size: %08x", mapSize, meminfo.size); + + + ntrConfig->HomeFSReadAddr = translateAddr(findNearestSTMFD(text ,searchBytes(text, text + mapSize, (u8 *)patFsRead, sizeof(patFsRead), 4))); + newAppTopDebug(DEFAULT_COLOR, SKINNY, "HomeFSReadAddr: %08x", ntrConfig->HomeFSReadAddr); + + + u32 t = searchBytes(text, text + mapSize, (u8 *)patFsHandle, sizeof(patFsHandle), 4); + if (t > 0) + { + ntrConfig->HomeFSUHandleAddr = *(u32*)(t - 4); + } + newAppTopDebug(DEFAULT_COLOR, SKINNY,"HomeFSUHandleAddr: %08x", ntrConfig->HomeFSUHandleAddr); + + + ntrConfig->HomeCardUpdateInitAddr = translateAddr(findNearestSTMFD(text, searchBytes(text, text + mapSize, (u8 *)patCartUpdate, sizeof(patCartUpdate), 4))); + newAppTopDebug(DEFAULT_COLOR, SKINNY,"HomeCardUpdateInitAddr: %08x", ntrConfig->HomeCardUpdateInitAddr); + + + ntrConfig->HomeAptStartAppletAddr = translateAddr(findNearestSTMFD(text, searchBytes(text, text + mapSize, (u8 *)patStartApplet, sizeof(patStartApplet), 4))); + newAppTopDebug(DEFAULT_COLOR, SKINNY,"HomeAptStartAppletAddr: %08x", ntrConfig->HomeAptStartAppletAddr); + + ntrConfig->HomeMenuInjectAddr = translateAddr(locateSwapBuffer(text, text + mapSize)); + newAppTopDebug(DEFAULT_COLOR, SKINNY,"HomeMenuInjectAddr: %08x", ntrConfig->HomeMenuInjectAddr); + + newAppTopDebug(GREEN, SKINNY, "Analysis finished."); + + return (0); } +Result bnInitParamsByHomeMenu(void) +{ + u32 hProcess = 0; + u32 ret; + +again: + ret = svcOpenProcess(&hProcess, ntrConfig->HomeMenuPid); + if (ret) + { + newAppStatus(DEFAULT_COLOR, TINY | CENTER, "An error occurred"); + newAppStatus(DEFAULT_COLOR, TINY | CENTER, "Retry in 2 seconds"); + updateUI(); + svcSleepThread(2000000000); + removeAppStatus(); + removeAppStatus(); + updateUI(); + goto again; + } + + //Map .text+0(0x00100000) up to 0x40000, to vaddr 0x0f000000 in the current process. + ret = svcMapProcessMemory(hProcess, 0x0f000000, MAX_MAP_SIZE); + if (ret != 0) + { + newAppStatus(DEFAULT_COLOR, TINY | CENTER, "Mapping failed !"); + newAppStatus(DEFAULT_COLOR, TINY | CENTER, "%08X", ret); + updateUI(); + goto final; + } + ret = analyseHomeMenu(); + svcUnmapProcessMemory(hProcess, 0x0f000000, MAX_MAP_SIZE); + svcCloseHandle(hProcess); + ntrConfig->HomeMenuVersion = SYSTEM_VERSION(1, 0, 0); + return (ret); +final: + return (RESULT_ERROR); +} \ No newline at end of file diff --git a/source/main.c b/source/main.c index 5bc0994..0809c7b 100644 --- a/source/main.c +++ b/source/main.c @@ -11,6 +11,22 @@ char *g_secondary_error = NULL; char *g_third_error = NULL; bool g_exit = false; +void action_launch_title_update(void) +{ + Result res = 0; + + if(R_SUCCEEDED(res = APT_PrepareToDoApplicationJump(0, 0x0004000000164800ul, 1))) { + u8 param[0x300]; + u8 hmac[0x20]; + + res = APT_DoApplicationJump(param, sizeof(param), hmac); + } + + if(R_FAILED(res)) + { + newAppStatus(DEFAULT_COLOR, TINY, "Failed launch"); + } +} int main(void) { @@ -38,7 +54,7 @@ int main(void) u32 wifiStatus; ACU_GetWifiStatus(&wifiStatus); - + acExit(); if (wifiStatus) { amInit(); @@ -46,8 +62,12 @@ int main(void) if (launchUpdater()) { newAppStatus(DEFAULT_COLOR, CENTER | BOLD | NEWLINE, "Updated !"); + amExit(); + httpcExit(); goto waitForExit; - } + } + amExit(); + httpcExit(); } } @@ -63,12 +83,30 @@ int main(void) if (!ret) { newAppStatus(DEFAULT_COLOR, CENTER | BOLD | NEWLINE, "Success !"); + + #if EXTENDEDMODE + + newAppStatus(DEFAULT_COLOR, CENTER | TINY | SKINNY | NEWLINE, "Press Home to launch"); + newAppStatus(DEFAULT_COLOR, CENTER | TINY | SKINNY, "your game."); + updateUI(); + + g_exit = true; + while (aptMainLoop()) + { + updateUI(); + } + goto exit; + + #else + newAppStatus(DEFAULT_COLOR, CENTER | TINY | SKINNY | NEWLINE, "Returning to home"); newAppStatus(DEFAULT_COLOR, CENTER | TINY | SKINNY, "menu ..."); - updateUI(); g_exit = true; + updateUI(); svcSleepThread(100000); goto exit; + #endif + } } if (g_exit || ret) @@ -114,8 +152,6 @@ int main(void) romfsExit(); drawExit(); gfxExit(); - amExit(); - httpcExit(); if (!g_exit) PTMSYSM_RebootAsync(0); ptmSysmExit(); diff --git a/source/main.h b/source/main.h index f851af1..bcf4ee3 100644 --- a/source/main.h +++ b/source/main.h @@ -14,14 +14,29 @@ #define TIMER 3 -#if FONZD_BANNER -#define CIA_VERSION "BootNTRSelector-FONZD-Banner.cia" -#endif +#if EXTENDEDMODE + + #if FONZD_BANNER + #define CIA_VERSION "BootNTRSelector-Mode3-FONZD-Banner.cia" + #endif + + #if PABLOMK7_BANNER + #define CIA_VERSION "BootNTRSelector-Mode3-PabloMK7-Banner.cia" + #endif + +#else + + #if FONZD_BANNER + #define CIA_VERSION "BootNTRSelector-FONZD-Banner.cia" + #endif + + #if PABLOMK7_BANNER + #define CIA_VERSION "BootNTRSelector-PabloMK7-Banner.cia" + #endif -#if PABLOMK7_BANNER -#define CIA_VERSION "BootNTRSelector-PabloMK7-Banner.cia" #endif + #define check_prim(result, err) if ((result) != 0) {g_primary_error = err; \ goto error; } #define check_sec(result, err) if ((result) != 0) {g_secondary_error = err; \ @@ -96,7 +111,7 @@ typedef enum version_e { V32 = 0, V33 = 1, - V34 = 2 + V34 = 2, } version_t; /* @@ -162,6 +177,8 @@ u32 rtAlignToPageSize(u32 size); u32 rtGetPageOfAddress(u32 addr); u32 rtCheckRemoteMemoryRegionSafeForWrite(Handle hProcess, u32 addr, u32 size); u32 memfind(u8 *startPos, u32 size, const void *pattern, u32 patternSize); +u32 findNearestSTMFD(u32 base, u32 pos); +u32 searchBytes(u32 startAddr, u32 endAddr, u8* pat, int patlen, int step); /* ** firmware.c diff --git a/source/mainMenu.c b/source/mainMenu.c index 4be89eb..387997e 100644 --- a/source/mainMenu.c +++ b/source/mainMenu.c @@ -5,14 +5,34 @@ #include extern bootNtrConfig_t *bnConfig; +#if EXTENDEDMODE == 0 static button_t *V32Button; static button_t *V33Button; static button_t *V34Button; static sprite_t *desiredVersionSprite; -static sprite_t *pressExitSprite; static sprite_t *tinyButtonBGSprite; +#endif +static sprite_t *pressExitSprite; static bool userTouch = false; +#if EXTENDEDMODE + +void initMainMenu(void) +{ + newSpriteFromPNG(&pressExitSprite, "romfs:/sprites/textSprites/pressBExit.png"); + + setSpritePos(pressExitSprite, 180.0f, 217.0f); + + changeBottomFooter(pressExitSprite); +} + +void exitMainMenu(void) +{ + deleteSprite(pressExitSprite); +} + +#else + void selectVersion(u32 mode) { V32Button->disable(V32Button); @@ -38,9 +58,10 @@ void selectVersion(u32 mode) void initMainMenu(void) { sprite_t *sprite; - newSpriteFromPNG(&desiredVersionSprite, "romfs:/sprites/textSprites/touchDesiredVersion.png"); - newSpriteFromPNG(&pressExitSprite, "romfs:/sprites/textSprites/pressBExit.png"); + + newSpriteFromPNG(&desiredVersionSprite, "romfs:/sprites/textSprites/touchDesiredVersion.png"); newSpriteFromPNG(&tinyButtonBGSprite, "romfs:/sprites/tinyButtonBackground.png"); + newSpriteFromPNG(&pressExitSprite, "romfs:/sprites/textSprites/pressBExit.png"); setSpritePos(desiredVersionSprite, 34.0f, 7.0f); setSpritePos(pressExitSprite, 180.0f, 217.0f); @@ -73,6 +94,10 @@ void exitMainMenu(void) deleteSprite(pressExitSprite); } +#endif + + + static const char * versionString[] = { "3.2", @@ -100,7 +125,11 @@ int mainMenu(void) updateUI(); } keys = 0; +#if EXTENDEDMODE + while (1) +#else while (userTouch == false) +#endif { keys = hidKeysDown() | hidKeysHeld(); if (keys == (KEY_L | KEY_R | KEY_X | KEY_DUP)) goto dumpMode; diff --git a/source/memory_functions.c b/source/memory_functions.c index 3da6ba0..4e9d38e 100644 --- a/source/memory_functions.c +++ b/source/memory_functions.c @@ -1,58 +1,58 @@ #include "main.h" #include "config.h" -extern char *g_primary_error; -extern char *g_secondary_error; +extern char *g_primary_error; +extern char *g_secondary_error; extern ntrConfig_t *ntrConfig; -u32 protectRemoteMemory(Handle hProcess, u32 addr, u32 size) +u32 protectRemoteMemory(Handle hProcess, u32 addr, u32 size) { - return (svcControlProcessMemory(hProcess, addr, addr, size, 6, 7)); + return (svcControlProcessMemory(hProcess, addr, addr, size, 6, 7)); } -u32 copyRemoteMemory(Handle hDst, u32 ptrDst, Handle hSrc, u32 ptrSrc, u32 size) +u32 copyRemoteMemory(Handle hDst, u32 ptrDst, Handle hSrc, u32 ptrSrc, u32 size) { - u32 dmaConfig[20] = { 0 }; - u32 hdma = 0; - u32 state; - u32 i; - u32 result; + u32 dmaConfig[20] = { 0 }; + u32 hdma = 0; + u32 state; + u32 i; + u32 result; bool firstError = true; - if ((result = svcFlushProcessDataCache(hSrc, (void *)ptrSrc, size)) != 0) - goto error; - if ((result = svcFlushProcessDataCache(hDst, (void *)ptrDst, size)) != 0) - goto error; + if ((result = svcFlushProcessDataCache(hSrc, (void *)ptrSrc, size)) != 0) + goto error; + if ((result = svcFlushProcessDataCache(hDst, (void *)ptrDst, size)) != 0) + goto error; again: if ((result = svcStartInterProcessDma(&hdma, hDst, (void *)ptrDst, hSrc, (void *)ptrSrc, size, dmaConfig)) != 0) - goto error; - state = 0; - if (ntrConfig->InterProcessDmaFinishState == 0) - { - while (1) - { - svc_getDmaState(&state, hdma); - svcSleepThread(10000); - result = state; - svcGetDmaState(&state, hdma); - if (result == state) - break; - } - ntrConfig->InterProcessDmaFinishState = state; - } - else - { - for (i = 0; i < 1000000; i++) - { - result = svcGetDmaState(&state, hdma); - if (state == ntrConfig->InterProcessDmaFinishState) - break; - svc_sleepThread(10000); - } - if (i >= 1000000) - { - g_primary_error = READREMOTEMEMORY_TIMEOUT; - svcCloseHandle(hdma); + goto error; + state = 0; + if (ntrConfig->InterProcessDmaFinishState == 0) + { + while (1) + { + svc_getDmaState(&state, hdma); + svcSleepThread(10000); + result = state; + svcGetDmaState(&state, hdma); + if (result == state) + break; + } + ntrConfig->InterProcessDmaFinishState = state; + } + else + { + for (i = 0; i < 1000000; i++) + { + result = svcGetDmaState(&state, hdma); + if (state == ntrConfig->InterProcessDmaFinishState) + break; + svc_sleepThread(10000); + } + if (i >= 1000000) + { + g_primary_error = READREMOTEMEMORY_TIMEOUT; + svcCloseHandle(hdma); if (firstError) { newAppStatus(DEFAULT_COLOR, TINY | CENTER, "An error occurred"); @@ -65,62 +65,62 @@ u32 copyRemoteMemory(Handle hDst, u32 ptrDst, Handle hSrc, u32 ptrSrc, u32 size updateUI(); goto again; } - goto error; - } - } - svcCloseHandle(hdma); - if ((result = svcInvalidateProcessDataCache(hDst, (void *)ptrDst, size)) != 0) - goto error; - return (0); + goto error; + } + } + svcCloseHandle(hdma); + if ((result = svcInvalidateProcessDataCache(hDst, (void *)ptrDst, size)) != 0) + goto error; + return (0); error: - return (RESULT_ERROR); + return (RESULT_ERROR); } -u32 patchRemoteProcess(u32 pid, u32 addr, u8 *buf, u32 len) +u32 patchRemoteProcess(u32 pid, u32 addr, u8 *buf, u32 len) { - u32 hProcess; - u32 ret; - - ret = svc_openProcess(&hProcess, pid); - check_prim(ret, OPENPROCESS_FAILURE); - ret = protectRemoteMemory(hProcess, ((addr / 0x1000) * 0x1000), 0x1000); - check_prim(ret, PROTECTMEMORY_FAILURE); - ret = copyRemoteMemory(hProcess, addr, 0xffff8001, (u32)buf, len); - check_sec(ret, REMOTECOPY_FAILURE); - if (hProcess) - svcCloseHandle(hProcess); - return (ret); + u32 hProcess; + u32 ret; + + ret = svc_openProcess(&hProcess, pid); + check_prim(ret, OPENPROCESS_FAILURE); + ret = protectRemoteMemory(hProcess, ((addr / 0x1000) * 0x1000), 0x1000); + check_prim(ret, PROTECTMEMORY_FAILURE); + ret = copyRemoteMemory(hProcess, addr, 0xffff8001, (u32)buf, len); + check_sec(ret, REMOTECOPY_FAILURE); + if (hProcess) + svcCloseHandle(hProcess); + return (ret); error: - return (RESULT_ERROR); + return (RESULT_ERROR); } -u32 rtAlignToPageSize(u32 size) +u32 rtAlignToPageSize(u32 size) { - return (((size / 0x1000) + 1) * 0x1000); + return (((size / 0x1000) + 1) * 0x1000); } -u32 rtGetPageOfAddress(u32 addr) +u32 rtGetPageOfAddress(u32 addr) { - return ((addr / 0x1000) * 0x1000); + return ((addr / 0x1000) * 0x1000); } -u32 rtCheckRemoteMemoryRegionSafeForWrite(Handle hProcess, u32 addr, u32 size) +u32 rtCheckRemoteMemoryRegionSafeForWrite(Handle hProcess, u32 addr, u32 size) { - u32 ret; - u32 startPage; - u32 endPage; - u32 page; - - startPage = rtGetPageOfAddress(addr); - endPage = rtGetPageOfAddress(addr + size - 1); - for (page = startPage; page <= endPage; page += 0x1000) - { - ret = protectRemoteMemory(hProcess, page, 0x1000); - if (ret != 0) - return (ret); - } - return (0); + u32 ret; + u32 startPage; + u32 endPage; + u32 page; + + startPage = rtGetPageOfAddress(addr); + endPage = rtGetPageOfAddress(addr + size - 1); + for (page = startPage; page <= endPage; page += 0x1000) + { + ret = protectRemoteMemory(hProcess, page, 0x1000); + if (ret != 0) + return (ret); + } + return (0); } #define ALPHABET_LEN 256 @@ -150,4 +150,48 @@ u32 memfind(u8 *startPos, u32 size, const void *pattern, u32 patternSize) j += table[startPos[j + patternSize]]; } return (0); -} \ No newline at end of file +} + +u32 findNearestSTMFD(u32 base, u32 pos) +{ + if (pos < base) + { + return 0; + } + pos = pos - pos % 4; + u32 term = pos - 0x1000; + if (term < base) + { + term = base; + } + while (pos >= term) { + if (*(u16*)(pos + 2) == 0xe92d){ + return pos; + } + pos -= 4; + } + return 0; +} + +u32 searchBytes(u32 startAddr, u32 endAddr, u8* pat, int patlen, int step) +{ + u32 pat0 = ((u32*)pat)[0]; + + while (1) + { + if (startAddr + patlen >= endAddr) + { + return 0; + } + if (*((u32*)(startAddr)) == pat0) + { + if (memcmp((u32*) startAddr, pat, patlen) == 0) + { + return startAddr; + } + } + startAddr += step; + } + return 0; +} + diff --git a/source/ntr_launcher.c b/source/ntr_launcher.c index 127c3e2..919dda6 100644 --- a/source/ntr_launcher.c +++ b/source/ntr_launcher.c @@ -55,6 +55,7 @@ u32 loadNTRBin(void) FILE *ntr; u32 ret; char path[0x100]; + static const char *ntrVersionStrings[3] = { "ntr_3_2.bin", @@ -66,6 +67,16 @@ u32 loadNTRBin(void) strJoin(path, "/", "ntr.bin"); else strJoin(path, bnConfig->config->binariesPath + 5, ntrVersionStrings[bnConfig->versionToLaunch]); + + if (bnConfig->versionToLaunch == V34) + { + strJoin(ntrConfig->path, bnConfig->config->binariesPath + 5, ntrVersionStrings[bnConfig->versionToLaunch]); + #if EXTENDEDMODE + ntrConfig->memorymode = 3; + #else + ntrConfig->memorymode = 0; + #endif + } // Get size ntr = fopen(path, "rb"); @@ -117,6 +128,10 @@ Result bnLoadAndExecuteNTR(void) error: return (RESULT_ERROR); } +void showDbg(char *str) +{ + newAppTop(DEFAULT_COLOR, TINY | SKINNY, str); +} Result bnBootNTR(void) { @@ -144,7 +159,9 @@ Result bnBootNTR(void) // Free temp buffer linearFree(linearAddress); - +#if DEBUG + ntrConfig->ShowDbgFunc = (u32)showDbg; +#endif // Load NTR ret = bnLoadAndExecuteNTR(); check_third(ret, LOAD_FAILED); diff --git a/source/pathPatcher.c b/source/pathPatcher.c index 410c067..8a1221f 100644 --- a/source/pathPatcher.c +++ b/source/pathPatcher.c @@ -51,11 +51,19 @@ static const char *fixedName[RELOC_COUNT] = static char fixedPath[RELOC_COUNT][0x100] = { 0 }; -static const char *ntrVersionStrings[3] = +static const char *ntrVersionStrings[4] = { "ntr_3_2.bin", "ntr_3_3.bin", - "ntr_3_4.bin" + "ntr.o3ds.bin", + "ntr.n3ds.bin" +}; + +static const char *outNtrVersionStrings[3] = +{ + "ntr_3_2.bin", + "ntr_3_3.bin", + "ntr_3_4.bin", }; static void patchBinary(u8 *mem, int size) @@ -115,11 +123,17 @@ Result loadAndPatch(version_t version) char *plgPath; char inPath[0x100]; char outPath[0x100]; - u8 *mem; + u8 *mem; + bool isNew3DS = false; + + APT_CheckNew3DS(&isNew3DS); binPath = bnConfig->config->binariesPath; - plgPath = bnConfig->config->pluginPath; - strJoin(inPath, "romfs:/", ntrVersionStrings[version]); + plgPath = bnConfig->config->pluginPath; + if (version == V34 && isNew3DS) + strJoin(inPath, "romfs:/", ntrVersionStrings[version + 1]); + else + strJoin(inPath, "romfs:/", ntrVersionStrings[version]); if (!strncmp("sdmc:", binPath, 5)) binPath += 5; @@ -127,7 +141,7 @@ Result loadAndPatch(version_t version) if (version != V32) { - strJoin(outPath, binPath, ntrVersionStrings[version]); + strJoin(outPath, binPath, outNtrVersionStrings[version]); strJoin(fixedPath[BINARY], binPath, ntrVersionStrings[version]); strJoin(fixedPath[PLUGIN], plgPath, fixedName[PLUGIN]); strJoin(fixedPath[DEBUG], binPath, ntrVersionStrings[version]); diff --git a/source/updater.c b/source/updater.c index fea3862..77299ce 100644 --- a/source/updater.c +++ b/source/updater.c @@ -365,8 +365,11 @@ bool launchUpdater(void) update = false; updateData = (updateData_t *)calloc(1, sizeof(updateData_t)); if (!updateData) goto error; - +#if EXTENDEDMODE + bnConfig->config->lastUpdateTime3 = time(NULL); +#else bnConfig->config->lastUpdateTime = time(NULL); +#endif initUpdater(); newAppTop(COLOR_BLANK, NEWLINE, ""); newAppTop(COLOR_BLANK, 0, "Checking for update");