From 6335181e52b39960a2b132ce627655ed5af3c4d9 Mon Sep 17 00:00:00 2001 From: Calvin Fuchs Date: Thu, 24 Jun 2021 17:51:18 +0200 Subject: [PATCH] added archive bits fix the code is borrowed from hekate --- source/tegraexplorer/mainmenu.c | 502 +++++++++++++++++++------------- 1 file changed, 306 insertions(+), 196 deletions(-) diff --git a/source/tegraexplorer/mainmenu.c b/source/tegraexplorer/mainmenu.c index 99ba7a2..13ffe82 100644 --- a/source/tegraexplorer/mainmenu.c +++ b/source/tegraexplorer/mainmenu.c @@ -22,6 +22,8 @@ #include "../fs/fstypes.h" #include "../fs/fscopy.h" #include +#include +#include extern hekate_config h_cfg; @@ -31,17 +33,12 @@ enum { DeleteThemes, FixClingWrap, FixAIOUpdaterBoot, + FixArchiveBitA, + FixArchiveBitN, + // FixMacSpecialFolders, FixAll, MainOther, MainViewStillNoBootInfo, - // MainBrowseSd, - // MainMountSd, - // MainBrowseEmmc, - // MainBrowseEmummc, - // MainTools, - // MainPartitionSd, - // MainDumpFw, - // MainViewKeys, MainViewCredits, MainExit, MainPowerOff, @@ -57,7 +54,14 @@ MenuEntry_t mainMenuEntries[] = { [DeleteThemes] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Delete installed themes"}, [FixClingWrap] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix ClingWrap"}, [FixAIOUpdaterBoot] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix Switch-AiO-Updater update"}, + [FixArchiveBitA] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix archive bit (all folders)"}, + [FixArchiveBitN] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix archive bit (nintendo folder)"}, + // [FixMacSpecialFolders] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Remove special folders created by Mac"}, [FixAll] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Try everything"}, + [MainOther] = {.optionUnion = COLORTORGB(COLOR_GREEN) | SKIPBIT, .name = "\n-- Other --"}, + + + // [MainBrowseSd] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Browse SD"}, // [MainMountSd] = {.optionUnion = COLORTORGB(COLOR_YELLOW)}, // To mount/unmount the SD @@ -89,81 +93,257 @@ void HandleSD(){ FileExplorer("sd:/"); } -void HandleEMMC(){ - GptMenu(MMC_CONN_EMMC); -} - -void HandleEMUMMC(){ - GptMenu(MMC_CONN_EMUMMC); -} - -void ViewKeys(){ - gfx_clearscreen(); - for (int i = 0; i < 3; i++){ - gfx_printf("\nBis key 0%d: ", i); - PrintKey(dumpedKeys.bis_key[i], AES_128_KEY_SIZE * 2); - } - - gfx_printf("\nMaster key 0: "); - PrintKey(dumpedKeys.master_key, AES_128_KEY_SIZE); - gfx_printf("\nHeader key: "); - PrintKey(dumpedKeys.header_key, AES_128_KEY_SIZE * 2); - gfx_printf("\nSave mac key: "); - PrintKey(dumpedKeys.save_mac_key, AES_128_KEY_SIZE); - - u8 fuseCount = 0; - for (u32 i = 0; i < 32; i++){ - if ((fuse_read_odm(7) >> i) & 1) - fuseCount++; - } - - gfx_printf("\n\nPkg1 ID: '%s' (kb %d)\nFuse count: %d", TConf.pkg1ID, TConf.pkg1ver, fuseCount); - - hidWait(); -} - -void ViewCredits(){ - gfx_clearscreen(); - gfx_printf("\nCommon Problem Resolver v%d.%d.%d\nBy Team Neptune\n\nBased on TegraExplorer by SuchMemeManySkill,\nLockpick_RCM & Hekate, from shchmue & CTCaer\n\n\n", LP_VER_MJ, LP_VER_MN, LP_VER_BF); - hidWait(); -} extern bool sd_mounted; extern bool is_sd_inited; extern int launch_payload(char *path); -void RebootToAMS(){ - launch_payload("sd:/atmosphere/reboot_payload.bin"); -} +/////////////////////////////////////////////////////////////////////// -void RebootToHekate(){ - launch_payload("sd:/bootloader/update.bin"); -} - -void MountOrUnmountSD(){ - gfx_clearscreen(); - if (sd_mounted) - sd_unmount(); - else if (!sd_mount()) - hidWait(); -} - - -void DeleteFileSimple(char *thing){ +void _DeleteFileSimple(char *thing){ //char *thing = CombinePaths(path, entry.name); int res = f_unlink(thing); if (res) DrawError(newErrCode(res)); free(thing); } -void RenameFileSimple(char *sourcePath, char *destPath){ +void _RenameFileSimple(char *sourcePath, char *destPath){ int res = f_rename(sourcePath, destPath); if (res){ DrawError(newErrCode(res)); } } -void deleteBootFlags(){ +int _fix_attributes(char *path, u32 *total, u32 hos_folder, u32 check_first_run){ + FRESULT res; + DIR dir; + u32 dirLength = 0; + static FILINFO fno; + + if (check_first_run) + { + // Read file attributes. + res = f_stat(path, &fno); + if (res != FR_OK) + return res; + + // Check if archive bit is set. + if (fno.fattrib & AM_ARC) + { + *(u32 *)total = *(u32 *)total + 1; + f_chmod(path, 0, AM_ARC); + } + } + + // Open directory. + res = f_opendir(&dir, path); + if (res != FR_OK) + return res; + + dirLength = strlen(path); + for (;;) + { + // Clear file or folder path. + path[dirLength] = 0; + + // Read a directory item. + res = f_readdir(&dir, &fno); + + // Break on error or end of dir. + if (res != FR_OK || fno.fname[0] == 0) + break; + + // Skip official Nintendo dir if started from root. + if (!hos_folder && !strcmp(fno.fname, "Nintendo")) + continue; + + // Set new directory or file. + memcpy(&path[dirLength], "/", 1); + memcpy(&path[dirLength + 1], fno.fname, strlen(fno.fname) + 1); + + // Check if archive bit is set. + if (fno.fattrib & AM_ARC) + { + *total = *total + 1; + f_chmod(path, 0, AM_ARC); + } + + // Is it a directory? + if (fno.fattrib & AM_DIR) + { + // Set archive bit to NCA folders. + if (hos_folder && !strcmp(fno.fname + strlen(fno.fname) - 4, ".nca")) + { + *total = *total + 1; + f_chmod(path, AM_ARC, AM_ARC); + } + + // Enter the directory. + res = _fix_attributes(path, total, hos_folder, 0); + if (res != FR_OK) + break; + } + } + + f_closedir(&dir); + + return res; +} + + +void m_entry_fixArchiveBit(u32 type){ + gfx_clearscreen(); + gfx_printf("\n\n-- Fix Archive Bits\n\n"); + + char path[256]; + char label[16]; + + u32 total = 0; + if (sd_mount()) + { + switch (type) + { + case 0: + strcpy(path, "/"); + strcpy(label, "SD Card"); + break; + case 1: + default: + strcpy(path, "/Nintendo"); + strcpy(label, "Nintendo folder"); + break; + } + + gfx_printf("Traversing all %s files!\nThis may take some time...\n\n", label); + _fix_attributes(path, &total, type, type); + gfx_printf("%kTotal archive bits cleared: %d!%k", 0xFF96FF00, total, 0xFFCCCCCC); + + gfx_printf("\n\n Done, press a key to proceed."); + hidWait(); + } +} + + +void m_entry_fixAIOUpdate(){ + gfx_clearscreen(); + gfx_printf("\n\n-- Fix broken Switch-AiO-Updater update.\n\n"); + + char *aio_fs_path = CpyStr("sd:/atmosphere/fusee-secondary.bin.aio"); + char *aio_p_path = CpyStr("sd:/sept/payload.bin.aio"); + char *aio_strt_path = CpyStr("sd:/atmosphere/stratosphere.romfs.aio"); + + char *o_fs_path = CpyStr("sd:/atmosphere/fusee-secondary.bin"); + char *o_p_path = CpyStr("sd:/sept/payload.bin"); + char *o_strt_path = CpyStr("sd:/atmosphere/stratosphere.romfs"); + + if (FileExists(aio_fs_path)) { + gfx_printf("Detected aio updated fusee-secondary file -> replacing original\n\n"); + if (FileExists(o_fs_path)) { + _DeleteFileSimple(o_fs_path); + } + _RenameFileSimple(aio_fs_path, o_fs_path); + } + free(aio_fs_path); + free(o_fs_path); + + if (FileExists(aio_p_path)) { + gfx_printf("Detected aio updated paload file -> replacing original\n\n"); + if (FileExists(o_p_path)) { + _DeleteFileSimple(o_p_path); + } + _RenameFileSimple(aio_p_path, o_p_path); + } + free(aio_p_path); + free(o_p_path); + + if (FileExists(aio_strt_path)) { + gfx_printf("Detected aio updated stratosphere file -> replacing original\n\n"); + if (FileExists(o_strt_path)) { + _DeleteFileSimple(o_strt_path); + } + _RenameFileSimple(aio_strt_path, o_strt_path); + } + free(aio_strt_path); + free(o_strt_path); + + + gfx_printf("\n\n Done, press a key to proceed."); + hidWait(); +} + +void m_entry_fixClingWrap(){ + gfx_clearscreen(); + gfx_printf("\n\n-- Fixing ClingWrap.\n\n"); + char *bpath = CpyStr("sd:/_b0otloader"); + char *bopath = CpyStr("sd:/bootloader"); + char *kpath = CpyStr("sd:/atmosphere/_k1ps"); + char *kopath = CpyStr("sd:/atmosphere/kips"); + + char *ppath = CpyStr("sd:/bootloader/_patchesCW.ini"); + char *popath = CpyStr("sd:/atmosphere/patches.ini"); + + if (FileExists(bpath)) { + if (FileExists(bopath)) { + FolderDelete(bopath); + } + int res = f_rename(bpath, bopath); + if (res){ + DrawError(newErrCode(res)); + } + gfx_printf("-- Fixed Bootloader\n"); + } + + if (FileExists(kpath)) { + if (FileExists(kopath)) { + FolderDelete(kopath); + } + int res = f_rename(kpath, kopath); + if (res){ + DrawError(newErrCode(res)); + } + gfx_printf("-- Fixed kips\n"); + } + + if (FileExists(ppath)) { + if (FileExists(popath)) { + _DeleteFileSimple(popath); + } + _RenameFileSimple(ppath,popath); + gfx_printf("-- Fixed patches.ini\n"); + } + + free(bpath); + free(bopath); + free(kpath); + free(kopath); + free(ppath); + free(popath); + + gfx_printf("\n\n Done, press a key to proceed."); + hidWait(); +} + +void _deleteTheme(char* basePath, char* folderId){ + char *path = CombinePaths(basePath, folderId); + if (FileExists(path)) { + gfx_printf("-- Theme found: %s\n", path); + FolderDelete(path); + } + free(path); +} + +void m_entry_deleteInstalledThemes(){ + gfx_clearscreen(); + gfx_printf("\n\n-- Deleting installed themes.\n\n"); + _deleteTheme("sd:/atmosphere/contents", "0100000000001000"); + _deleteTheme("sd:/atmosphere/contents", "0100000000001007"); + _deleteTheme("sd:/atmosphere/contents", "0100000000001013"); + + gfx_printf("\n\n Done, press a key to proceed."); + hidWait(); +} + +void m_entry_deleteBootFlags(){ gfx_clearscreen(); gfx_printf("\n\n-- Disabling automatic sysmodule startup.\n\n"); char *storedPath = CpyStr("sd:/atmosphere/contents"); @@ -182,7 +362,7 @@ void deleteBootFlags(){ if (FileExists(flagPath)) { gfx_printf("Deleting: %s\n", flagPath); - DeleteFileSimple(flagPath); + _DeleteFileSimple(flagPath); } free(flagPath); } @@ -191,114 +371,15 @@ void deleteBootFlags(){ hidWait(); } -void deleteTheme(char* basePath, char* folderId){ - char *path = CombinePaths(basePath, folderId); - if (FileExists(path)) { - gfx_printf("-- Theme found: %s\n", path); - FolderDelete(path); - } - free(path); +void m_entry_fixMacSpecialFolders(char *path){ + // browse path + // list files & folders + // if file -> delete + // if folder !== nintendo + // if folder m_entry_fixMacSpecialFolders with new path } -void deleteInstalledThemes(){ - gfx_clearscreen(); - gfx_printf("\n\n-- Deleting installed themes.\n\n"); - deleteTheme("sd:/atmosphere/contents", "0100000000001000"); - deleteTheme("sd:/atmosphere/contents", "0100000000001007"); - deleteTheme("sd:/atmosphere/contents", "0100000000001013"); - - gfx_printf("\n\n Done, press a key to proceed."); - hidWait(); -} - -void fixClingWrap(){ - gfx_clearscreen(); - gfx_printf("\n\n-- Fixing ClingWrap.\n\n"); - char *bpath = CpyStr("sd:/_b0otloader"); - char *bopath = CpyStr("sd:/bootloader"); - char *kpath = CpyStr("sd:/atmosphere/_k1ps"); - char *kopath = CpyStr("sd:/atmosphere/kips"); - - if (FileExists(bpath)) { - if (FileExists(bopath)) { - FolderDelete(bopath); - } - int res = f_rename(bpath, bopath); - if (res){ - DrawError(newErrCode(res)); - } - gfx_printf("-- Fixed Bootloader\n"); - } - - if (FileExists(kpath)) { - if (FileExists(kopath)) { - FolderDelete(kopath); - } - int res = f_rename(bpath, kopath); - if (res){ - DrawError(newErrCode(res)); - } - gfx_printf("-- Fixed kips\n"); - } - - free(bpath); - free(bopath); - free(kpath); - free(kopath); - - gfx_printf("\n\n Done, press a key to proceed."); - hidWait(); -} - -void fixAIOUpdate(){ - gfx_clearscreen(); - gfx_printf("\n\n-- Fix broken Switch-AiO-Updater update.\n\n"); - - char *aio_fs_path = CpyStr("sd:/atmosphere/fusee-secondary.bin.aio"); - char *aio_p_path = CpyStr("sd:/sept/payload.bin.aio"); - char *aio_strt_path = CpyStr("sd:/atmosphere/stratosphere.romfs.aio"); - - char *o_fs_path = CpyStr("sd:/atmosphere/fusee-secondary.bin"); - char *o_p_path = CpyStr("sd:/sept/payload.bin"); - char *o_strt_path = CpyStr("sd:/atmosphere/stratosphere.romfs"); - - if (FileExists(aio_fs_path)) { - gfx_printf("Detected aio updated fusee-secondary file -> replacing original\n\n"); - if (FileExists(o_fs_path)) { - DeleteFileSimple(o_fs_path); - } - RenameFileSimple(aio_fs_path, o_fs_path); - } - free(aio_fs_path); - free(o_fs_path); - - if (FileExists(aio_p_path)) { - gfx_printf("Detected aio updated paload file -> replacing original\n\n"); - if (FileExists(o_p_path)) { - DeleteFileSimple(o_p_path); - } - RenameFileSimple(aio_p_path, o_p_path); - } - free(aio_p_path); - free(o_p_path); - - if (FileExists(aio_strt_path)) { - gfx_printf("Detected aio updated stratosphere file -> replacing original\n\n"); - if (FileExists(o_strt_path)) { - DeleteFileSimple(o_strt_path); - } - RenameFileSimple(aio_strt_path, o_strt_path); - } - free(aio_strt_path); - free(o_strt_path); - - - gfx_printf("\n\n Done, press a key to proceed."); - hidWait(); - -} - -void stillNoBootInfo(){ +void m_entry_stillNoBootInfo(){ gfx_clearscreen(); gfx_printf("\n\n-- My switch still does not boot.\n\n"); @@ -315,37 +396,66 @@ void stillNoBootInfo(){ hidWait(); } -void fixAll(){ +void m_entry_ViewCredits(){ gfx_clearscreen(); - deleteBootFlags(); - deleteInstalledThemes(); - fixClingWrap(); - fixAIOUpdate(); - - - stillNoBootInfo(); + gfx_printf("\nCommon Problem Resolver v%d.%d.%d\nBy Team Neptune\n\nBased on TegraExplorer by SuchMemeManySkill,\nLockpick_RCM & Hekate, from shchmue & CTCaer\n\n\n", LP_VER_MJ, LP_VER_MN, LP_VER_BF); + hidWait(); } +void m_entry_fixAll(){ + gfx_clearscreen(); + m_entry_deleteBootFlags(); + m_entry_deleteInstalledThemes(); + m_entry_fixClingWrap(); + m_entry_fixAIOUpdate(); + + + m_entry_stillNoBootInfo(); +} + + +/////////////////////////////////////////// + + +void RebootToAMS(){ + launch_payload("sd:/atmosphere/reboot_payload.bin"); +} + +void RebootToHekate(){ + launch_payload("sd:/bootloader/update.bin"); +} + +void MountOrUnmountSD(){ + gfx_clearscreen(); + if (sd_mounted) + sd_unmount(); + else if (!sd_mount()) + hidWait(); +} + + +void archBitHelperA(){ + m_entry_fixArchiveBit(0); +} +void archBitHelperN(){ + m_entry_fixArchiveBit(1); +} + + menuPaths mainMenuPaths[] = { - [DeleteBootFlags] = deleteBootFlags, - [DeleteThemes] = deleteInstalledThemes, - [FixClingWrap] = fixClingWrap, - [FixAIOUpdaterBoot] = fixAIOUpdate, - [FixAll] = fixAll, - [MainViewStillNoBootInfo] = stillNoBootInfo, - // [MainBrowseSd] = HandleSD, - // [MainMountSd] = MountOrUnmountSD, - // [MainBrowseEmmc] = HandleEMMC, - // [MainBrowseEmummc] = HandleEMUMMC, - // [MainPartitionSd] = FormatSD, - // [MainDumpFw] = DumpSysFw, - // [MainViewKeys] = ViewKeys, - // [MainRebootAMS] = RebootToAMS, + [DeleteBootFlags] = m_entry_deleteBootFlags, + [DeleteThemes] = m_entry_deleteInstalledThemes, + [FixClingWrap] = m_entry_fixClingWrap, + [FixAIOUpdaterBoot] = m_entry_fixAIOUpdate, + [FixArchiveBitA] = archBitHelperA, + [FixArchiveBitN] = archBitHelperN, + // [FixMacSpecialFolders] = m_entry_fixMacSpecialFolders, + [FixAll] = m_entry_fixAll, + [MainViewStillNoBootInfo] = m_entry_stillNoBootInfo, [MainRebootHekate] = RebootToHekate, [MainRebootRCM] = reboot_rcm, [MainPowerOff] = power_off, - [MainViewCredits] = ViewCredits, - // [MainRebootNormal] = reboot_normal + [MainViewCredits] = m_entry_ViewCredits, }; void EnterMainMenu(){