From 17828273a5a9450658fc36555cf7892ded7e65b2 Mon Sep 17 00:00:00 2001 From: TuxSH Date: Sun, 18 Jun 2017 22:31:21 +0200 Subject: [PATCH] Revamp config format, add saving of Rosalina opt. (menu combo & 3dsx title ID) --- Makefile | 4 +- k11_extension/include/config.h | 6 +- k11_extension/include/globals.h | 9 +- k11_extension/source/main.c | 1 - k11_extension/source/svc/GetSystemInfo.c | 25 +++- source/config.c | 21 ++-- source/config.h | 10 +- source/main.c | 2 +- source/patches.c | 15 ++- source/types.h | 4 +- sysmodules/loader/source/patcher.c | 15 ++- sysmodules/loader/source/patcher.h | 6 +- .../rosalina/include/menus/miscellaneous.h | 1 + sysmodules/rosalina/source/gdb/xfer.c | 2 +- sysmodules/rosalina/source/main.c | 17 ++- sysmodules/rosalina/source/menu.c | 4 +- sysmodules/rosalina/source/menus.c | 4 +- .../rosalina/source/menus/miscellaneous.c | 107 +++++++++++++++--- 18 files changed, 188 insertions(+), 65 deletions(-) diff --git a/Makefile b/Makefile index 3e52b2c..06d4e6e 100644 --- a/Makefile +++ b/Makefile @@ -105,7 +105,7 @@ $(dir_out)/boot.firm: $(dir_build)/modules.bin $(dir_build)/arm11.elf $(dir_buil $(dir_build)/modules.bin: $(modules) @mkdir -p "$(@D)" cat $^ > $@ - + $(dir_build)/arm11.elf: $(dir_arm11) @mkdir -p "$(@D)" @$(MAKE) -C $< @@ -144,7 +144,7 @@ $(dir_build)/memory.o $(dir_build)/strings.o: CFLAGS += -O3 $(dir_build)/config.o: CFLAGS += -DCONFIG_TITLE="\"$(name) $(revision) configuration\"" $(dir_build)/patches.o: CFLAGS += -DVERSION_MAJOR="$(version_major)" -DVERSION_MINOR="$(version_minor)"\ -DVERSION_BUILD="$(version_build)" -DISRELEASE="$(is_release)" -DCOMMIT_HASH="0x$(commit)" -$(dir_build)/firm.o: $(dir_build)/modules.bin +$(dir_build)/firm.o: $(dir_build)/modules.bin $(dir_build)/firm.o: CFLAGS += -DLUMA_SECTION0_SIZE="$(shell du -b $(dir_build)/modules.bin | cut -f1)" $(dir_build)/bundled.h: $(bundled) diff --git a/k11_extension/include/config.h b/k11_extension/include/config.h index fef12b6..1374e48 100644 --- a/k11_extension/include/config.h +++ b/k11_extension/include/config.h @@ -5,9 +5,9 @@ #define MAKE_BRANCH(src,dst) (0xEA000000 | ((u32)((((u8 *)(dst) - (u8 *)(src)) >> 2) - 2) & 0xFFFFFF)) #define MAKE_BRANCH_LINK(src,dst) (0xEB000000 | ((u32)((((u8 *)(dst) - (u8 *)(src)) >> 2) - 2) & 0xFFFFFF)) -#define CONFIG(a) (((cfwInfo.config >> (a + 17)) & 1) != 0) -#define MULTICONFIG(a) ((cfwInfo.config >> (a * 2 + 7)) & 3) -#define BOOTCONFIG(a, b) ((cfwInfo.config >> a) & b) +#define CONFIG(a) (((cfwInfo.config >> (a)) & 1) != 0) +#define MULTICONFIG(a) ((cfwInfo.multiConfig >> (2 * (a))) & 3) +#define BOOTCONFIG(a, b) ((cfwInfo.bootConfig >> (a)) & (b)) #define BOOTCFG_NAND BOOTCONFIG(0, 7) #define BOOTCFG_FIRM BOOTCONFIG(3, 7) diff --git a/k11_extension/include/globals.h b/k11_extension/include/globals.h index 8ee6b59..063ab0c 100644 --- a/k11_extension/include/globals.h +++ b/k11_extension/include/globals.h @@ -113,7 +113,7 @@ extern void (*initFPU)(void); extern void (*mcuReboot)(void); extern void (*coreBarrier)(void); -typedef struct PACKED CfwInfo +typedef struct CfwInfo { char magic[4]; @@ -124,10 +124,13 @@ typedef struct PACKED CfwInfo u32 commitHash; - u32 config; + u16 configFormatVersionMajor, configFormatVersionMinor; + u32 config, multiConfig, bootConfig; + u64 hbldr3dsxTitleId; + u32 rosalinaMenuCombo; } CfwInfo; extern CfwInfo cfwInfo; extern vu32 rosalinaState; -extern bool hasStartedRosalinaNetworkFuncsOnce; +extern bool hasStartedRosalinaNetworkFuncsOnce; diff --git a/k11_extension/source/main.c b/k11_extension/source/main.c index cbd5eda..bb7262c 100644 --- a/k11_extension/source/main.c +++ b/k11_extension/source/main.c @@ -278,5 +278,4 @@ void main(FcramLayout *layout, KCoreContext *ctxs) rosalinaState = 0; hasStartedRosalinaNetworkFuncsOnce = false; - //wat(0xAA, criticalSectionLock); } diff --git a/k11_extension/source/svc/GetSystemInfo.c b/k11_extension/source/svc/GetSystemInfo.c index a090bb5..3f6a7be 100644 --- a/k11_extension/source/svc/GetSystemInfo.c +++ b/k11_extension/source/svc/GetSystemInfo.c @@ -46,18 +46,35 @@ Result GetSystemInfoHook(s64 *out, s32 type, s32 param) *out = cfwInfo.commitHash; break; case 2: + *out = (cfwInfo.configFormatVersionMajor << 16) | cfwInfo.configFormatVersionMinor; + break; + case 3: *out = cfwInfo.config; break; - case 3: // isRelease + case 4: + *out = cfwInfo.multiConfig; + break; + case 5: + *out = cfwInfo.bootConfig; + break; + + case 0x100: + *out = (s64)cfwInfo.hbldr3dsxTitleId; + break; + case 0x101: + *out = cfwInfo.rosalinaMenuCombo; + break; + + case 0x200: // isRelease *out = cfwInfo.flags & 1; break; - case 4: // isN3DS + case 0x201: // isN3DS *out = (cfwInfo.flags >> 4) & 1; break; - case 5: // isSafeMode + case 0x202: // isSafeMode *out = (cfwInfo.flags >> 5) & 1; break; - case 6: // isSdMode + case 0x203: // isSdMode *out = (cfwInfo.flags >> 6) & 1; break; default: diff --git a/source/config.c b/source/config.c index 7149d71..34cfc4f 100644 --- a/source/config.c +++ b/source/config.c @@ -35,7 +35,7 @@ CfgData configData; ConfigurationStatus needConfig; -static u32 oldConfig; +static CfgData oldConfig; bool readConfig(void) { @@ -46,13 +46,13 @@ bool readConfig(void) configData.formatVersionMajor != CONFIG_VERSIONMAJOR || configData.formatVersionMinor != CONFIG_VERSIONMINOR) { - configData.config = 0; + memset(&configData, 0, sizeof(CfgData)); ret = false; } else ret = true; - oldConfig = configData.config; + oldConfig = configData; return ret; } @@ -61,8 +61,8 @@ void writeConfig(bool isConfigOptions) { /* If the configuration is different from previously, overwrite it. Just the no-forcing flag being set is not enough */ - if(needConfig != CREATE_CONFIGURATION && ((isConfigOptions && (configData.config & 0xFFFFFF00) == (oldConfig & 0xFFFFFF00)) || - (!isConfigOptions && (configData.config & 0xBF) == (oldConfig & 0xFF)))) return; + if(needConfig != CREATE_CONFIGURATION && ((isConfigOptions && configData.config == oldConfig.config && configData.multiConfig == oldConfig.multiConfig) || + (!isConfigOptions && (configData.bootConfig & ~0x40) == oldConfig.bootConfig))) return; if(needConfig == CREATE_CONFIGURATION) { @@ -383,14 +383,15 @@ void configMenu(bool oldPinStatus, u32 oldPinMode) else if(singleOptions[singleSelected].enabled) drawCharacter(true, 10 + SPACING_X, singleOptions[singleSelected].posY, COLOR_RED, selected); } - //Preserve the last-used boot options (first 9 bits) - configData.config &= 0x7F; - + //Preserve the last-used boot options //Parse and write the new configuration + configData.multiConfig = 0; for(u32 i = 0; i < multiOptionsAmount; i++) - configData.config |= multiOptions[i].enabled << (i * 2 + 7); + configData.multiConfig |= multiOptions[i].enabled << (i * 2); + + configData.config = 0; for(u32 i = 0; i < singleOptionsAmount; i++) - configData.config |= (singleOptions[i].enabled ? 1 : 0) << (i + 17); + configData.config |= (singleOptions[i].enabled ? 1 : 0) << i; u32 newPinMode = MULTICONFIG(PIN); diff --git a/source/config.h b/source/config.h index 83a1709..3257df3 100644 --- a/source/config.h +++ b/source/config.h @@ -28,13 +28,13 @@ #include "types.h" -#define CONFIG(a) (((configData.config >> (a + 17)) & 1) != 0) -#define MULTICONFIG(a) ((configData.config >> (a * 2 + 7)) & 3) -#define BOOTCONFIG(a, b) ((configData.config >> a) & b) +#define CONFIG(a) (((configData.config >> (a)) & 1) != 0) +#define MULTICONFIG(a) ((configData.multiConfig >> (2 * (a))) & 3) +#define BOOTCONFIG(a, b) ((configData.bootConfig >> (a)) & (b)) #define CONFIG_FILE "config.bin" -#define CONFIG_VERSIONMAJOR 1 -#define CONFIG_VERSIONMINOR 13 +#define CONFIG_VERSIONMAJOR 2 +#define CONFIG_VERSIONMINOR 0 #define BOOTCFG_NAND BOOTCONFIG(0, 7) #define BOOTCFG_FIRM BOOTCONFIG(3, 7) diff --git a/source/main.c b/source/main.c index 02ea145..b2d7b7a 100644 --- a/source/main.c +++ b/source/main.c @@ -279,7 +279,7 @@ boot: if(!isFirmlaunch) { - configData.config = (configData.config & 0xFFFFFF80) | ((u32)isNoForceFlagSet << 6) | ((u32)firmSource << 3) | (u32)nandType; + configData.bootConfig = ((u32)isNoForceFlagSet << 6) | ((u32)firmSource << 3) | (u32)nandType; writeConfig(false); } diff --git a/source/patches.c b/source/patches.c index 2d5ad87..55d3f55 100644 --- a/source/patches.c +++ b/source/patches.c @@ -122,8 +122,11 @@ u32 installK11Extension(u8 *pos, u32 size, bool isSafeMode, u32 baseK11VA, u32 * u32 commitHash; - u32 config; - } __attribute__((packed)) info; + u16 configFormatVersionMajor, configFormatVersionMinor; + u32 config, multiConfig, bootConfig; + u64 hbldr3dsxTitleId; + u32 rosalinaMenuCombo; + } info; }; static const u8 patternHook1[] = {0x02, 0xC2, 0xA0, 0xE3, 0xFF}; //MMU setup hook @@ -136,7 +139,7 @@ u32 installK11Extension(u8 *pos, u32 size, bool isSafeMode, u32 baseK11VA, u32 * u32 *hookVeneers = (u32 *)*freeK11Space; u32 relocBase = 0xFFFF0000 + (*freeK11Space - (u8 *)arm11ExceptionsPage); - + hookVeneers[0] = 0xE51FF004; //ldr pc, [pc, #-8+4] hookVeneers[1] = 0x18000004; hookVeneers[2] = 0xE51FF004; @@ -185,7 +188,13 @@ u32 installK11Extension(u8 *pos, u32 size, bool isSafeMode, u32 baseK11VA, u32 * struct CfwInfo *info = &p->info; memcpy(&info->magic, "LUMA", 4); info->commitHash = COMMIT_HASH; + info->configFormatVersionMajor = configData.formatVersionMajor; + info->configFormatVersionMinor = configData.formatVersionMinor; info->config = configData.config; + info->multiConfig = configData.multiConfig; + info->bootConfig = configData.bootConfig; + info->hbldr3dsxTitleId = configData.hbldr3dsxTitleId; + info->rosalinaMenuCombo = configData.rosalinaMenuCombo; info->versionMajor = VERSION_MAJOR; info->versionMinor = VERSION_MINOR; info->versionBuild = VERSION_BUILD; diff --git a/source/types.h b/source/types.h index 5374c6c..ed10cb8 100644 --- a/source/types.h +++ b/source/types.h @@ -66,7 +66,9 @@ typedef struct __attribute__((packed)) char magic[4]; u16 formatVersionMajor, formatVersionMinor; - u32 config; + u32 config, multiConfig, bootConfig; + u64 hbldr3dsxTitleId; + u32 rosalinaMenuCombo; } CfgData; typedef struct __attribute__((packed)) diff --git a/sysmodules/loader/source/patcher.c b/sysmodules/loader/source/patcher.c index ae5d2f7..c64b6a8 100644 --- a/sysmodules/loader/source/patcher.c +++ b/sysmodules/loader/source/patcher.c @@ -6,7 +6,7 @@ #include "ifile.h" #include "../build/bundled.h" -static u32 config; +static u32 config, multiConfig, bootConfig; static bool isN3DS, isSafeMode, isSdMode; static u32 patchMemory(u8 *start, u32 size, const void *pattern, u32 patSize, s32 offset, const void *replace, u32 repSize, u32 count) @@ -80,13 +80,18 @@ static inline void loadCFWInfo(void) if(infoLoaded) return; - if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 2))) svcBreak(USERBREAK_ASSERT); + if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 3))) svcBreak(USERBREAK_ASSERT); config = (u32)out; if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 4))) svcBreak(USERBREAK_ASSERT); - isN3DS = (bool)out; + multiConfig = (u32)out; if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 5))) svcBreak(USERBREAK_ASSERT); + bootConfig = (u32)out; + + if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 0x201))) svcBreak(USERBREAK_ASSERT); + isN3DS = (bool)out; + if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 0x202))) svcBreak(USERBREAK_ASSERT); isSafeMode = (bool)out; - if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 6))) svcBreak(USERBREAK_ASSERT); + if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 0x203))) svcBreak(USERBREAK_ASSERT); isSdMode = (bool)out; IFile file; @@ -502,7 +507,7 @@ static inline bool patchLayeredFs(u64 progId, u8 *code, u32 size, u32 textSize, "patch:", "ext:", "rom:" }; - u32 updateRomFsIndex; + u32 updateRomFsIndex; //Locate update RomFSes for(updateRomFsIndex = 0; updateRomFsIndex < sizeof(updateRomFsMounts) / sizeof(char *) - 1; updateRomFsIndex++) diff --git a/sysmodules/loader/source/patcher.h b/sysmodules/loader/source/patcher.h index 8246eaf..cb90c74 100644 --- a/sysmodules/loader/source/patcher.h +++ b/sysmodules/loader/source/patcher.h @@ -5,9 +5,9 @@ #define MAKE_BRANCH(src,dst) (0xEA000000 | ((u32)((((u8 *)(dst) - (u8 *)(src)) >> 2) - 2) & 0xFFFFFF)) #define MAKE_BRANCH_LINK(src,dst) (0xEB000000 | ((u32)((((u8 *)(dst) - (u8 *)(src)) >> 2) - 2) & 0xFFFFFF)) -#define CONFIG(a) (((config >> (a + 17)) & 1) != 0) -#define MULTICONFIG(a) ((config >> (a * 2 + 7)) & 3) -#define BOOTCONFIG(a, b) ((config >> a) & b) +#define CONFIG(a) (((config >> (a)) & 1) != 0) +#define MULTICONFIG(a) ((multiConfig >> (2 * (a))) & 3) +#define BOOTCONFIG(a, b) ((bootConfig >> (a)) & (b)) #define BOOTCFG_NAND BOOTCONFIG(0, 7) #define BOOTCFG_FIRM BOOTCONFIG(3, 7) diff --git a/sysmodules/rosalina/include/menus/miscellaneous.h b/sysmodules/rosalina/include/menus/miscellaneous.h index 2601d6c..f5bebb6 100644 --- a/sysmodules/rosalina/include/menus/miscellaneous.h +++ b/sysmodules/rosalina/include/menus/miscellaneous.h @@ -33,6 +33,7 @@ extern Menu miscellaneousMenu; void MiscellaneousMenu_SwitchBoot3dsxTargetTitle(void); void MiscellaneousMenu_ChangeMenuCombo(void); +void MiscellaneousMenu_SaveSettings(void); void MiscellaneousMenu_InputRedirection(void); void MiscellaneousMenu_PowerOff(void); void MiscellaneousMenu_Reboot(void); diff --git a/sysmodules/rosalina/source/gdb/xfer.c b/sysmodules/rosalina/source/gdb/xfer.c index fb5caa1..3eaf92a 100644 --- a/sysmodules/rosalina/source/gdb/xfer.c +++ b/sysmodules/rosalina/source/gdb/xfer.c @@ -78,7 +78,7 @@ GDB_DECLARE_XFER_OSDATA_HANDLER(CfwVersion) svcGetSystemInfo(&out, 0x10000, 1); commitHash = (u32)out; - svcGetSystemInfo(&out, 0x10000, 3); + svcGetSystemInfo(&out, 0x10000, 0x200); isRelease = (bool)out; if(GET_VERSION_REVISION(version) == 0) diff --git a/sysmodules/rosalina/source/main.c b/sysmodules/rosalina/source/main.c index e7fe6d8..12350e4 100644 --- a/sysmodules/rosalina/source/main.c +++ b/sysmodules/rosalina/source/main.c @@ -34,6 +34,7 @@ #include "utils.h" #include "MyThread.h" #include "menus/process_patches.h" +#include "menus/miscellaneous.h" // this is called before main bool isN3DS; @@ -43,9 +44,6 @@ void __appInit() fsregInit(); fsSysInit(); - - s64 dummy; - isN3DS = svcGetSystemInfo(&dummy, 0x10001, 0) == 0; } // this is called after main exits @@ -74,8 +72,19 @@ void __ctru_exit() void initSystem() { - HBLDR_3DSX_TID = HBLDR_DEFAULT_3DSX_TID; __libc_init_array(); + + s64 out; + isN3DS = svcGetSystemInfo(&out, 0x10001, 0) == 0; + + svcGetSystemInfo(&out, 0x10000, 0x100); + HBLDR_3DSX_TID = out == 0 ? HBLDR_DEFAULT_3DSX_TID : (u64)out; + + svcGetSystemInfo(&out, 0x10000, 0x101); + menuCombo = out == 0 ? DEFAULT_MENU_COMBO : (u32)out; + + miscellaneousMenu.items[0].title = HBLDR_3DSX_TID == HBLDR_DEFAULT_3DSX_TID ? "Switch the hb. title to the current app." : + "Switch the hb. title to hblauncher_loader"; __sync_init(); __appInit(); } diff --git a/sysmodules/rosalina/source/menu.c b/sysmodules/rosalina/source/menu.c index 5cfc61a..ce3e4df 100644 --- a/sysmodules/rosalina/source/menu.c +++ b/sysmodules/rosalina/source/menu.c @@ -156,7 +156,7 @@ MyThread *menuCreateThread(void) } extern bool isN3DS; -u32 menuCombo = DEFAULT_MENU_COMBO; +u32 menuCombo; void menuThreadMain(void) { @@ -224,7 +224,7 @@ static void menuDraw(Menu *menu, u32 selected) svcGetSystemInfo(&out, 0x10000, 1); commitHash = (u32)out; - svcGetSystemInfo(&out, 0x10000, 3); + svcGetSystemInfo(&out, 0x10000, 0x200); isRelease = (bool)out; if(GET_VERSION_REVISION(version) == 0) diff --git a/sysmodules/rosalina/source/menus.c b/sysmodules/rosalina/source/menus.c index fe0f613..e37b3e1 100644 --- a/sysmodules/rosalina/source/menus.c +++ b/sysmodules/rosalina/source/menus.c @@ -101,8 +101,8 @@ void RosalinaMenu_TakeScreenshot(void) FS_ArchiveID archiveId; s64 out; bool isSdMode; - - if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 6))) svcBreak(USERBREAK_ASSERT); + + if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 0x203))) svcBreak(USERBREAK_ASSERT); isSdMode = (bool)out; archiveId = isSdMode ? ARCHIVE_SDMC : ARCHIVE_NAND_RW; diff --git a/sysmodules/rosalina/source/menus/miscellaneous.c b/sysmodules/rosalina/source/menus/miscellaneous.c index 8ed5c88..56a0446 100644 --- a/sysmodules/rosalina/source/menus/miscellaneous.c +++ b/sysmodules/rosalina/source/menus/miscellaneous.c @@ -33,13 +33,15 @@ #include "fmt.h" #include "utils.h" // for makeARMBranch #include "minisoc.h" +#include "ifile.h" Menu miscellaneousMenu = { "Miscellaneous options menu", - .nbItems = 5, + .nbItems = 6, { { "Switch the hb. title to the current app.", METHOD, .method = &MiscellaneousMenu_SwitchBoot3dsxTargetTitle }, { "Change the menu combo", METHOD, .method = MiscellaneousMenu_ChangeMenuCombo }, + { "Save settings", METHOD, .method = &MiscellaneousMenu_SaveSettings }, { "Start InputRedirection", METHOD, .method = &MiscellaneousMenu_InputRedirection }, { "Power off", METHOD, .method = &MiscellaneousMenu_PowerOff }, { "Reboot", METHOD, .method = &MiscellaneousMenu_Reboot }, @@ -158,7 +160,7 @@ void MiscellaneousMenu_ChangeMenuCombo(void) posY = Draw_DrawFormattedString(10, 30, COLOR_WHITE, "The current menu combo is: %s", comboStrOrig); posY = Draw_DrawFormattedString(10, posY + SPACING_Y, COLOR_WHITE, "Please enter the new combo: %s", comboStr) + SPACING_Y; - + posY = Draw_DrawString(10, posY + SPACING_Y, COLOR_WHITE, "Successfully changed the menu combo."); Draw_FlushFramebuffer(); @@ -167,6 +169,72 @@ void MiscellaneousMenu_ChangeMenuCombo(void) while(!(waitInput() & BUTTON_B) && !terminationRequest); } +void MiscellaneousMenu_SaveSettings(void) +{ + Result res; + + IFile file; + u64 total; + + struct PACKED + { + char magic[4]; + u16 formatVersionMajor, formatVersionMinor; + + u32 config, multiConfig, bootConfig; + u64 hbldr3dsxTitleId; + u32 rosalinaMenuCombo; + } configData; + + u32 formatVersion; + u32 config, multiConfig, bootConfig; + s64 out; + bool isSdMode; + if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 2))) svcBreak(USERBREAK_ASSERT); + formatVersion = (u32)out; + if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 3))) svcBreak(USERBREAK_ASSERT); + config = (u32)out; + if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 4))) svcBreak(USERBREAK_ASSERT); + multiConfig = (u32)out; + if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 5))) svcBreak(USERBREAK_ASSERT); + bootConfig = (u32)out; + if(R_FAILED(svcGetSystemInfo(&out, 0x10000, 0x203))) svcBreak(USERBREAK_ASSERT); + isSdMode = (bool)out; + + memcpy(configData.magic, "CONF", 4); + configData.formatVersionMajor = (u16)(formatVersion >> 16); + configData.formatVersionMinor = (u16)formatVersion; + configData.config = config; + configData.multiConfig = multiConfig; + configData.bootConfig = bootConfig; + configData.hbldr3dsxTitleId = HBLDR_3DSX_TID; + configData.rosalinaMenuCombo = menuCombo; + + FS_ArchiveID archiveId = isSdMode ? ARCHIVE_SDMC : ARCHIVE_NAND_RW; + res = IFile_Open(&file, archiveId, fsMakePath(PATH_EMPTY, ""), fsMakePath(PATH_ASCII, "/luma/config.bin"), FS_OPEN_CREATE | FS_OPEN_WRITE); + + if(R_SUCCEEDED(res)) + res = IFile_Write(&file, &total, &configData, sizeof(configData), 0); + + Draw_Lock(); + Draw_ClearFramebuffer(); + Draw_FlushFramebuffer(); + Draw_Unlock(); + + do + { + Draw_Lock(); + Draw_DrawString(10, 10, COLOR_TITLE, "Process patches menu"); + if(R_SUCCEEDED(res)) + Draw_DrawString(10, 30, COLOR_WHITE, "Operation succeeded."); + else + Draw_DrawFormattedString(10, 30, COLOR_WHITE, "Operation failed (0x%08x).", res); + Draw_FlushFramebuffer(); + Draw_Unlock(); + } + while(!(waitInput() & BUTTON_B) && !terminationRequest); +} + void MiscellaneousMenu_InputRedirection(void) { static MyThread *inputRedirectionThread = NULL; @@ -207,6 +275,11 @@ void MiscellaneousMenu_InputRedirection(void) } } + Draw_Lock(); + Draw_ClearFramebuffer(); + Draw_FlushFramebuffer(); + Draw_Unlock(); + do { Draw_Lock(); @@ -262,40 +335,46 @@ void MiscellaneousMenu_InputRedirection(void) while(!(waitInput() & BUTTON_B) && !terminationRequest); } -void MiscellaneousMenu_Reboot() +void MiscellaneousMenu_Reboot(void) { Draw_Lock(); - Draw_DrawString(10, 10, COLOR_TITLE, "Miscellaneous options menu"); - Draw_DrawString(10, 30, COLOR_WHITE, "Press A to reboot, press B to go back."); + Draw_ClearFramebuffer(); Draw_FlushFramebuffer(); Draw_Unlock(); do { + Draw_Lock(); + Draw_DrawString(10, 10, COLOR_TITLE, "Miscellaneous options menu"); + Draw_DrawString(10, 30, COLOR_WHITE, "Press A to reboot, press B to go back."); + Draw_FlushFramebuffer(); + Draw_Unlock(); + u32 pressed = waitInputWithTimeout(1000); if(pressed & BUTTON_A) - { svcKernelSetState(7); - } else if(pressed & BUTTON_B) - { return; - } } while(!terminationRequest); } -void MiscellaneousMenu_PowerOff() // Soft shutdown. +void MiscellaneousMenu_PowerOff(void) // Soft shutdown. { Draw_Lock(); - Draw_DrawString(10, 10, COLOR_TITLE, "Miscellaneous options menu"); - Draw_DrawString(10, 30, COLOR_WHITE, "Press A to power off, press B to go back."); + Draw_ClearFramebuffer(); Draw_FlushFramebuffer(); Draw_Unlock(); do { + Draw_Lock(); + Draw_DrawString(10, 10, COLOR_TITLE, "Miscellaneous options menu"); + Draw_DrawString(10, 30, COLOR_WHITE, "Press A to power off, press B to go back."); + Draw_FlushFramebuffer(); + Draw_Unlock(); + u32 pressed = waitInputWithTimeout(1000); if(pressed & BUTTON_A) @@ -304,9 +383,7 @@ void MiscellaneousMenu_PowerOff() // Soft shutdown. srvPublishToSubscriber(0x203, 0); } else if(pressed & BUTTON_B) - { return; - } } while(!terminationRequest); -} \ No newline at end of file +}