From d1b8a89510fa8885c26274b7c0ebbeca74e4aa2e Mon Sep 17 00:00:00 2001 From: d0k3 Date: Mon, 14 Aug 2017 13:10:16 +0200 Subject: [PATCH] Added a "Payloads..." menu to HOME menu ... this also moves the "Scripts..." menu one level up and fixes a minor bug. --- source/common/common.h | 3 ++- source/godmode.c | 54 +++++++++++++++++++++++++++++------------- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/source/common/common.h b/source/common/common.h index 830456d..f9d7bf1 100644 --- a/source/common/common.h +++ b/source/common/common.h @@ -40,11 +40,12 @@ #endif // GodMode9 version -#define VERSION "1.3.1" +#define VERSION "1.3.2" // input / output paths #define SUPPORT_PATHS "0:/gm9/support", "0:", "0:/files9" // legacy paths #define SCRIPT_PATH "0:/gm9/scripts" +#define PAYLOAD_PATH "0:/gm9/payloads" #define OUTPUT_PATH "0:/gm9/out" // buffer area defines (in use by godmode.c) diff --git a/source/godmode.c b/source/godmode.c index 4002f5a..c4a6c0e 100644 --- a/source/godmode.c +++ b/source/godmode.c @@ -1437,7 +1437,7 @@ u32 FileHandlerMenu(char* current_path, u32* cursor, u32* scroll, DirStruct* cur } else if (!user_select) bootpath = ""; } if ((*bootpath == '0') || (*bootpath == '1')) - snprintf(fixpath, 256, "%s%s", (*bootpath == '0') ? "sdmc" : "nand", curr_entry->path + 1); + snprintf(fixpath, 256, "%s%s", (*bootpath == '0') ? "sdmc" : "nand", bootpath + 1); else strncpy(fixpath, bootpath, 256); // actually boot the FIRM (if we got a proper fixpath) if (*fixpath) { @@ -1473,7 +1473,6 @@ u32 HomeMoreMenu(char* current_path, DirStruct* current_dir, DirStruct* clipboar int bsupport = ++n_opt; int hsrestore = ((CheckHealthAndSafetyInject("1:") == 0) || (CheckHealthAndSafetyInject("4:") == 0)) ? (int) ++n_opt : -1; int clock = ++n_opt; - int scripts = (PathExist(SCRIPT_PATH)) ? (int) ++n_opt : -1; if (sdformat > 0) optionstr[sdformat - 1] = "SD format menu"; if (bonus > 0) optionstr[bonus - 1] = "Bonus drive setup"; @@ -1481,7 +1480,6 @@ u32 HomeMoreMenu(char* current_path, DirStruct* current_dir, DirStruct* clipboar if (bsupport > 0) optionstr[bsupport - 1] = "Build support files"; if (hsrestore > 0) optionstr[hsrestore - 1] = "Restore H&S"; if (clock > 0) optionstr[clock - 1] = "Set RTC date&time"; - if (scripts > 0) optionstr[scripts - 1] = "Scripts..."; int user_select = ShowSelectPrompt(n_opt, optionstr, promptstr); if (user_select == sdformat) { // format SD card @@ -1573,12 +1571,6 @@ u32 HomeMoreMenu(char* current_path, DirStruct* current_dir, DirStruct* clipboar timestr); } return 0; - } else if (user_select == scripts) { // scripts menu - char script[256]; - if (FileSelector(script, "HOME scripts... menu.\nSelect action:", SCRIPT_PATH, "*.gm9", true, false)) { - ExecuteGM9Script(script); - return 0; - } } else return 1; return HomeMoreMenu(current_path, current_dir, clipboard); @@ -1977,16 +1969,46 @@ u32 GodMode() { exit_mode = (switched || (pad_state & BUTTON_LEFT)) ? GODMODE_EXIT_POWEROFF : GODMODE_EXIT_REBOOT; break; } else if (pad_state & (BUTTON_HOME|BUTTON_POWER)) { // Home menu - const char* optionstr[] = { "Poweroff system", "Reboot system", "More..." }; + const char* optionstr[8]; const char* buttonstr = (pad_state & BUTTON_HOME) ? "HOME" : "POWER"; - u32 n_opt = 3; - u32 user_select = 0; - while (((user_select = ShowSelectPrompt(n_opt, optionstr, "%s button pressed.\nSelect action:", buttonstr)) == 3) && - (HomeMoreMenu(current_path, current_dir, clipboard) == 1)); // more... menu - if (user_select == 1) { + u32 n_opt = 0; + int poweroff = ++n_opt; + int reboot = ++n_opt; + int scripts = (PathExist(SCRIPT_PATH)) ? (int) ++n_opt : -1; + int payloads = (PathExist(PAYLOAD_PATH)) ? (int) ++n_opt : -1; + int more = ++n_opt; + if (poweroff > 0) optionstr[poweroff - 1] = "Poweroff system"; + if (reboot > 0) optionstr[reboot - 1] = "Reboot system"; + if (scripts > 0) optionstr[scripts - 1] = "Scripts..."; + if (payloads > 0) optionstr[payloads - 1] = "Payloads..."; + if (more > 0) optionstr[more - 1] = "More..."; + + int user_select = 0; + while ((user_select = ShowSelectPrompt(n_opt, optionstr, "%s button pressed.\nSelect action:", buttonstr)) && + (user_select != poweroff) && (user_select != reboot)) { + char loadpath[256]; + if ((user_select == more) && (HomeMoreMenu(current_path, current_dir, clipboard) == 0)) break; // more... menu + else if ((user_select == scripts) && (FileSelector(loadpath, "HOME scripts... menu.\nSelect script:", SCRIPT_PATH, "*.gm9", true, false))) { + ExecuteGM9Script(loadpath); + break; + } else if ((user_select == payloads) && (FileSelector(loadpath, "HOME payloads... menu.\nSelect payload:", PAYLOAD_PATH, "*.firm", true, false))) { + size_t firm_size = FileGetData(loadpath, TEMP_BUFFER, TEMP_BUFFER_SIZE, 0); + if (firm_size && (firm_size < TEMP_BUFFER_SIZE) && + (ValidateFirm(TEMP_BUFFER, firm_size) == 0)) { + char fixpath[256] = { 0 }; + if ((*loadpath == '0') || (*loadpath == '1')) + snprintf(fixpath, 256, "%s%s", (*loadpath == '0') ? "sdmc" : "nand", loadpath + 1); + else strncpy(fixpath, loadpath, 256); + BootFirm((FirmHeader*)(void*)TEMP_BUFFER, fixpath); + while(1); + } + } + } + + if (user_select == poweroff) { exit_mode = GODMODE_EXIT_POWEROFF; break; - } else if (user_select == 2) { + } else if (user_select == reboot) { exit_mode = GODMODE_EXIT_REBOOT; break; }