diff --git a/source/tegraexplorer/emmc/emmcdumpbis.c b/source/tegraexplorer/emmc/emmcdumpbis.c index 563d174..c11f157 100644 --- a/source/tegraexplorer/emmc/emmcdumpbis.c +++ b/source/tegraexplorer/emmc/emmcdumpbis.c @@ -122,7 +122,7 @@ int dump_emmc_parts(u16 parts, u8 mmctype){ utils_copystring(fsutil_getnextloc(basepath, pkg2names[i]), &path); gfx_printf("Dumping %s\n", pkg2names[i]); - dump_emmc_specific(pkg2names[i], path); + emmcDumpSpecific(pkg2names[i], path); free(path); } } @@ -132,7 +132,36 @@ int dump_emmc_parts(u16 parts, u8 mmctype){ return 0; } -int dump_emmc_specific(char *part, char *path){ +int emmcDumpBoot(char *basePath){ + emmc_part_t bootPart; + const u32 BOOT_PART_SIZE = storage.ext_csd.boot_mult << 17; + char *path; + memset(&bootPart, 0, sizeof(emmc_part_t)); + + bootPart.lba_start = 0; + bootPart.lba_end = (BOOT_PART_SIZE / NX_EMMC_BLOCKSIZE) - 1; + + for (int i = 0; i < 2; i++){ + strcpy(bootPart.name, "BOOT"); + bootPart.name[4] = (u8)('0' + i); + bootPart.name[5] = 0; + + emummc_storage_set_mmc_partition(&storage, i + 1); + utils_copystring(fsutil_getnextloc(basePath, bootPart.name), &path); + + if (!existsCheck(path)) + continue; + + gfx_printf("Dumping %s\n", bootPart.name); + + dump_emmc_part(path, &storage, &bootPart); + free(path); + } + emummc_storage_set_mmc_partition(&storage, 0); + return 0; +} + +int emmcDumpSpecific(char *part, char *path){ if (!existsCheck(path)) return 0; diff --git a/source/tegraexplorer/emmc/emmcmenu.c b/source/tegraexplorer/emmc/emmcmenu.c index e5357cf..2fdf955 100644 --- a/source/tegraexplorer/emmc/emmcmenu.c +++ b/source/tegraexplorer/emmc/emmcmenu.c @@ -103,6 +103,8 @@ int fillMmcMenu(short mmcType){ } int handleEntries(short mmcType, menu_entry part){ + int res = 0; + if (part.property & ISDIR){ if (!mount_mmc(part.name, part.storage)) fileexplorer("emmc:/", 1); @@ -116,20 +118,22 @@ int handleEntries(short mmcType, menu_entry part){ if ((menu_make(mmcmenu_filemenu, 4, "-- RAW PARTITION --")) < 3) return 0; + f_mkdir("sd:/tegraexplorer"); + f_mkdir("sd:/tegraexplorer/partition_dumps"); + + gfx_clearscreen(); + if (part.property & isBOOT){ - dump_emmc_parts(PART_BOOT, (u8)mmcType); + res = emmcDumpBoot("sd:/tegraexplorer/partition_dumps"); } else { - f_mkdir("sd:/tegraexplorer"); - f_mkdir("sd:/tegraexplorer/partition_dumps"); - - gfx_clearscreen(); gfx_printf("Dumping %s...\n", part.name); + res = emmcDumpSpecific(part.name, fsutil_getnextloc("sd:/tegraexplorer/partition_dumps", part.name)); + } - if (!dump_emmc_specific(part.name, fsutil_getnextloc("sd:/tegraexplorer/partition_dumps", part.name))){ - gfx_printf("\nDone!"); - btn_wait(); - } + if (!res){ + gfx_printf("\nDone!"); + btn_wait(); } } @@ -182,7 +186,6 @@ int mmcFlashFile(char *path, short mmcType){ if (part != NULL){ return restore_emmc_part(path, &storage, part); } - clipboardhelper = 0; return 1; } @@ -194,6 +197,7 @@ int makeMmcMenu(short mmcType){ selection = menu_make(mmcMenuEntries, count, (mmcType == SYSMMC) ? "-- SYSMMC --" : "-- EMUMMC --"); switch(selection){ + case -1: case 0: return 0; case 1: @@ -203,10 +207,11 @@ int makeMmcMenu(short mmcType){ gfx_printf("\nDone!"); btn_wait(); } + clipboardhelper = 0; } else gfx_errDisplay("mmcMenu", ERR_EMPTY_CLIPBOARD, 0); - break; //stubbed + break; default: handleEntries(mmcType, mmcMenuEntries[selection]); break; diff --git a/source/tegraexplorer/emmc/emmcmenu.h b/source/tegraexplorer/emmc/emmcmenu.h index 7f4e131..b5830f7 100644 --- a/source/tegraexplorer/emmc/emmcmenu.h +++ b/source/tegraexplorer/emmc/emmcmenu.h @@ -1,3 +1,4 @@ #pragma once -int makeMmcMenu(short mmcType); \ No newline at end of file +int makeMmcMenu(short mmcType); +int mmcFlashFile(char *path, short mmcType); \ No newline at end of file diff --git a/source/tegraexplorer/emmc/emmcoperations.h b/source/tegraexplorer/emmc/emmcoperations.h index a616860..97c49e5 100644 --- a/source/tegraexplorer/emmc/emmcoperations.h +++ b/source/tegraexplorer/emmc/emmcoperations.h @@ -4,5 +4,6 @@ int dump_emmc_parts(u16 parts, u8 mmctype); int restore_bis_using_file(char *path, u8 mmctype); -int dump_emmc_specific(char *part, char *path); -int restore_emmc_part(char *path, sdmmc_storage_t *mmcstorage, emmc_part_t *part); \ No newline at end of file +int emmcDumpSpecific(char *part, char *path); +int restore_emmc_part(char *path, sdmmc_storage_t *mmcstorage, emmc_part_t *part); +int emmcDumpBoot(char *basePath); \ No newline at end of file diff --git a/source/tegraexplorer/script/functions.c b/source/tegraexplorer/script/functions.c index 0efd63a..2b584e8 100644 --- a/source/tegraexplorer/script/functions.c +++ b/source/tegraexplorer/script/functions.c @@ -19,11 +19,14 @@ #include "../fs/fsutils.h" #include "../../utils/sprintf.h" #include "../fs/fsactions.h" +#include "../emmc/emmcoperations.h" +#include "../emmc/emmcmenu.h" extern FIL scriptin; extern char **argv; extern u32 argc; extern int forceExit; +extern short currentlyMounted; int parseIntInput(char *in, int *out){ if (in[0] == '@'){ @@ -462,6 +465,34 @@ int part_fs_combinePath(){ return 0; } +int part_mmc_dumpPart(){ + char *left, *right; + + if (parseStringInput(argv[0], &left)) + return -1; + if (parseStringInput(argv[1], &right)) + return -1; + + if (!strcmp(left, "BOOT")){ + return emmcDumpBoot(right); + } + else { + return emmcDumpSpecific(left, right); + } +} + +int part_mmc_restorePart(){ + char *path; + + if (parseStringInput(argv[0], &path)) + return -1; + + if (currentlyMounted < 0) + return -1; + + return mmcFlashFile(path, currentlyMounted); +} + str_fnc_struct functions[] = { {"printf", part_printf, 1}, {"printInt", part_print_int, 1}, @@ -490,6 +521,8 @@ str_fnc_struct functions[] = { {"fs_combinePath", part_fs_combinePath, 3}, {"mmc_connect", part_ConnectMMC, 1}, {"mmc_mount", part_MountMMC, 1}, + {"mmc_dumpPart", part_mmc_dumpPart, 2}, + {"mmc_restorePart", part_mmc_restorePart, 1}, {"pause", part_Pause, 0}, {"wait", part_Wait, 1}, {"exit", part_Exit, 0},