Can now dump original SecureInfo_X + more wipe functions

The following options were added to the Advanced wipe menu:

- Wipe pending titles.
- Wipe demo launch infos.

- Cleaned up redundant statements as well.

- Data folder is now 3DSRecoveryTool
This commit is contained in:
Joel16 2018-02-17 19:00:07 -06:00
parent 95e5ad5614
commit 5e208b25ab
2 changed files with 125 additions and 285 deletions

View File

@ -1,147 +0,0 @@
// Author: Christian Vallentin <mail@vallentinsource.com>
// Website: http://vallentinsource.com
// Repository: https://github.com/MrVallentin/LoadBMP
//
// Date Created: January 03, 2014
// Last Modified: August 13, 2016
//
// Version: 1.1.0
// Copyright (c) 2014-2016 Christian Vallentin <mail@vallentinsource.com>
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not
// be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
// Errors
#define LOADBMP_NO_ERROR 0
#define LOADBMP_OUT_OF_MEMORY 1
#define LOADBMP_FILE_NOT_FOUND 2
#define LOADBMP_FILE_OPERATION 3
#define LOADBMP_INVALID_FILE_FORMAT 4
#define LOADBMP_INVALID_SIGNATURE 5
#define LOADBMP_INVALID_BITS_PER_PIXEL 6
# define LOADBMP_API
LOADBMP_API unsigned int loadbmp_decode_file(
const char *filename, unsigned char **imageData, unsigned int *width, unsigned int *height);
// Disable Microsoft Visual C++ compiler security warnings for fopen, strcpy, etc being unsafe
#if defined(_MSC_VER) && (_MSC_VER >= 1310)
# pragma warning(disable: 4996)
#endif
#include <stdlib.h> /* malloc(), free() */
#include <string.h> /* memset(), memcpy() */
#include <stdio.h> /* fopen(), fwrite(), fread(), fclose() */
LOADBMP_API unsigned int loadbmp_decode_file(
const char *filename, unsigned char **imageData, unsigned int *width, unsigned int *height)
{
FILE *f = fopen(filename, "rb");
if (!f)
return LOADBMP_FILE_NOT_FOUND;
unsigned char bmp_file_header[14];
unsigned char bmp_info_header[40];
unsigned char bmp_pad[3];
unsigned int w, h;
unsigned char *data = NULL;
unsigned int x, y, i, padding;
memset(bmp_file_header, 0, sizeof(bmp_file_header));
memset(bmp_info_header, 0, sizeof(bmp_info_header));
if (fread(bmp_file_header, sizeof(bmp_file_header), 1, f) == 0)
{
fclose(f);
return LOADBMP_INVALID_FILE_FORMAT;
}
if (fread(bmp_info_header, sizeof(bmp_info_header), 1, f) == 0)
{
fclose(f);
return LOADBMP_INVALID_FILE_FORMAT;
}
if ((bmp_file_header[0] != 'B') || (bmp_file_header[1] != 'M'))
{
fclose(f);
return LOADBMP_INVALID_SIGNATURE;
}
if ((bmp_info_header[14] != 24) && (bmp_info_header[14] != 32))
{
fclose(f);
return LOADBMP_INVALID_BITS_PER_PIXEL;
}
w = (bmp_info_header[4] + (bmp_info_header[5] << 8) + (bmp_info_header[6] << 16) + (bmp_info_header[7] << 24));
h = (bmp_info_header[8] + (bmp_info_header[9] << 8) + (bmp_info_header[10] << 16) + (bmp_info_header[11] << 24));
if ((w > 0) && (h > 0))
{
data = (unsigned char*)malloc(w * h * 4);
if (!data)
{
fclose(f);
return LOADBMP_OUT_OF_MEMORY;
}
for (y = (h - 1); y != -1; y--)
{
for (x = 0; x < w; x++)
{
i = (x + y * w) * 4;
if (fread(data + i, 3, 1, f) == 0)
{
free(data);
fclose(f);
return LOADBMP_INVALID_FILE_FORMAT;
}
data[i + 3] = data[i + 2];
data[i + 2] = data[i + 1];
data[i + 1] = data[i];
data[i] = 255;
}
padding = ((4 - (w * 3) % 4) % 4);
if (fread(bmp_pad, 1, padding, f) != padding)
{
free(data);
fclose(f);
return LOADBMP_INVALID_FILE_FORMAT;
}
}
}
(*width) = w;
(*height) = h;
(*imageData) = data;
fclose(f);
return LOADBMP_NO_ERROR;
}

View File

@ -49,10 +49,10 @@ void Init_Services(void)
if (Utils_IsN3DS()) if (Utils_IsN3DS())
osSetSpeedupEnable(true); osSetSpeedupEnable(true);
FS_RecursiveMakeDir(sdmcArchive, "/3ds/3ds_rec_tool/dumps"); FS_RecursiveMakeDir(sdmcArchive, "/3ds/3DSRecoveryTool/dumps");
FS_RecursiveMakeDir(sdmcArchive, "/3ds/3ds_rec_tool/backups/nand/ro/sys"); FS_RecursiveMakeDir(sdmcArchive, "/3ds/3DSRecoveryTool/backups/nand/ro/sys");
FS_RecursiveMakeDir(sdmcArchive, "/3ds/3ds_rec_tool/backups/nand/rw/sys"); FS_RecursiveMakeDir(sdmcArchive, "/3ds/3DSRecoveryTool/backups/nand/rw/sys");
FS_RecursiveMakeDir(sdmcArchive, "/3ds/3ds_rec_tool/backups/nand/private"); FS_RecursiveMakeDir(sdmcArchive, "/3ds/3DSRecoveryTool/backups/nand/private");
Utils_LoadConfig(); Utils_LoadConfig();
} }
@ -94,11 +94,7 @@ void Menu_Main(void);
void Menu_Backup(void) void Menu_Backup(void)
{ {
int selection = 1; int selection = 0, max_items = 4;
int selector_y = 25;
int selector_image_y = 0;
int max_items = 5;
Result res = 0; Result res = 0;
@ -114,13 +110,11 @@ void Menu_Backup(void)
pp2d_draw_rectangle(0, 16, 400, 40, RGBA8(39, 50, 56, 255)); pp2d_draw_rectangle(0, 16, 400, 40, RGBA8(39, 50, 56, 255));
pp2d_draw_rectangle(0, 55, 400, 185, darkTheme? BG_COLOUR_DARK : BG_COLOUR_LIGHT); pp2d_draw_rectangle(0, 55, 400, 185, darkTheme? BG_COLOUR_DARK : BG_COLOUR_LIGHT);
selector_image_y = selector_y + (DISTANCE_Y * selection);
StatusBar_DisplayBar(); StatusBar_DisplayBar();
pp2d_draw_text(10, 27, 0.5f, 0.5f, RGBA8(240, 242, 242, 255), "Backup"); pp2d_draw_text(10, 27, 0.5f, 0.5f, RGBA8(240, 242, 242, 255), "Backup");
pp2d_draw_rectangle(0, selector_image_y, 400, 30, darkTheme? SELECTOR_COLOUR_DARK : SELECTOR_COLOUR_LIGHT); pp2d_draw_rectangle(0, 55 + (DISTANCE_Y * selection), 400, 30, darkTheme? SELECTOR_COLOUR_DARK : SELECTOR_COLOUR_LIGHT);
pp2d_draw_text(10, 65, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Back"); pp2d_draw_text(10, 65, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Back");
pp2d_draw_text(10, 95, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Backup NAND LocalFriendCodeSeed"); pp2d_draw_text(10, 95, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Backup NAND LocalFriendCodeSeed");
@ -150,53 +144,48 @@ void Menu_Backup(void)
selection--; selection--;
if (selection > max_items) if (selection > max_items)
selection = 1; selection = 0;
if (selection < 1) if (selection < 0)
selection = max_items; selection = max_items;
if (kDown & KEY_A) if (kDown & KEY_A)
{ {
switch(selection) switch(selection)
{ {
case 1: case 0:
Menu_Main(); Menu_Main();
break; break;
case 2: case 1:
if (FS_FileExists(nandArchive, "/rw/sys/LocalFriendCodeSeed_B")) if (FS_FileExists(nandArchive, "/rw/sys/LocalFriendCodeSeed_B"))
res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/rw/sys/LocalFriendCodeSeed_B", "/3ds/3ds_rec_tool/backups/nand/rw/sys/LocalFriendCodeSeed_B"); res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/rw/sys/LocalFriendCodeSeed_B", "/3ds/3DSRecoveryTool/backups/nand/rw/sys/LocalFriendCodeSeed_B");
else if (FS_FileExists(nandArchive, "/rw/sys/LocalFriendCodeSeed_A")) else if (FS_FileExists(nandArchive, "/rw/sys/LocalFriendCodeSeed_A"))
res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/rw/sys/LocalFriendCodeSeed_A", "/3ds/3ds_rec_tool/backups/nand/rw/sys/LocalFriendCodeSeed_A"); res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/rw/sys/LocalFriendCodeSeed_A", "/3ds/3DSRecoveryTool/backups/nand/rw/sys/LocalFriendCodeSeed_A");
snprintf(func, 20, "LocalFriendCodeSeed"); snprintf(func, 20, "LocalFriendCodeSeed");
selection = 1;
isSelected = true;
break; break;
case 3: case 2:
if (FS_FileExists(nandArchive, "/rw/sys/SecureInfo_C")) if (FS_FileExists(nandArchive, "/rw/sys/SecureInfo_C"))
res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/rw/sys/SecureInfo_C", "/3ds/3ds_rec_tool/backups/nand/rw/sys/SecureInfo_C"); res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/rw/sys/SecureInfo_C", "/3ds/3DSRecoveryTool/backups/nand/rw/sys/SecureInfo_C");
if (FS_FileExists(nandArchive, "/rw/sys/SecureInfo_A")) if (FS_FileExists(nandArchive, "/rw/sys/SecureInfo_A"))
res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/rw/sys/SecureInfo_A", "/3ds/3ds_rec_tool/backups/nand/rw/sys/SecureInfo_A"); res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/rw/sys/SecureInfo_A", "/3ds/3DSRecoveryTool/backups/nand/rw/sys/SecureInfo_A");
else if (FS_FileExists(nandArchive, "/rw/sys/SecureInfo_B")) else if (FS_FileExists(nandArchive, "/rw/sys/SecureInfo_B"))
res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/rw/sys/SecureInfo_B", "/3ds/3ds_rec_tool/backups/nand/rw/sys/SecureInfo_B"); res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/rw/sys/SecureInfo_B", "/3ds/3DSRecoveryTool/backups/nand/rw/sys/SecureInfo_B");
snprintf(func, 11, "SecureInfo"); snprintf(func, 11, "SecureInfo");
selection = 1; break;
isSelected = true; case 3:
res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/private/movable.sed", "/3ds/3DSRecoveryTool/backups/nand/private/movable.sed");
snprintf(func, 12, "movable.sed");
break; break;
case 4: case 4:
res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/private/movable.sed", "/3ds/3ds_rec_tool/backups/nand/private/movable.sed"); res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/ro/sys/HWCAL0.dat", "/3ds/3DSRecoveryTool/backups/nand/ro/sys/HWCAL0.dat");
snprintf(func, 12, "movable.sed"); res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/ro/sys/HWCAL1.dat", "/3ds/3DSRecoveryTool/backups/nand/ro/sys/HWCAL1.dat");
selection = 1;
isSelected = true;
break;
case 5:
res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/ro/sys/HWCAL0.dat", "/3ds/3ds_rec_tool/backups/nand/ro/sys/HWCAL0.dat");
res = FS_Copy_File(nandArchive, sdmcArchive, ARCHIVE_NAND_CTR_FS, ARCHIVE_SDMC, "/ro/sys/HWCAL1.dat", "/3ds/3ds_rec_tool/backups/nand/ro/sys/HWCAL1.dat");
snprintf(func, 6, "HWCAL"); snprintf(func, 6, "HWCAL");
selection = 1;
isSelected = true;
break; break;
} }
isSelected = true;
selection = 0;
} }
else if (kDown & KEY_B) else if (kDown & KEY_B)
@ -206,11 +195,7 @@ void Menu_Backup(void)
void Menu_Restore(void) void Menu_Restore(void)
{ {
int selection = 1; int selection = 0, max_items = 4;
int selector_y = 25;
int selector_image_y = 0;
int max_items = 5;
Result res = 0; Result res = 0;
@ -226,13 +211,11 @@ void Menu_Restore(void)
pp2d_draw_rectangle(0, 16, 400, 40, RGBA8(39, 50, 56, 255)); pp2d_draw_rectangle(0, 16, 400, 40, RGBA8(39, 50, 56, 255));
pp2d_draw_rectangle(0, 55, 400, 185, darkTheme? BG_COLOUR_DARK : BG_COLOUR_LIGHT); pp2d_draw_rectangle(0, 55, 400, 185, darkTheme? BG_COLOUR_DARK : BG_COLOUR_LIGHT);
selector_image_y = selector_y + (DISTANCE_Y * selection);
StatusBar_DisplayBar(); StatusBar_DisplayBar();
pp2d_draw_text(10, 27, 0.5f, 0.5f, RGBA8(240, 242, 242, 255), "Restore"); pp2d_draw_text(10, 27, 0.5f, 0.5f, RGBA8(240, 242, 242, 255), "Restore");
pp2d_draw_rectangle(0, selector_image_y, 400, 30, darkTheme? SELECTOR_COLOUR_DARK : SELECTOR_COLOUR_LIGHT); pp2d_draw_rectangle(0, 55 + (DISTANCE_Y * selection), 400, 30, darkTheme? SELECTOR_COLOUR_DARK : SELECTOR_COLOUR_LIGHT);
pp2d_draw_text(10, 65, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Back"); pp2d_draw_text(10, 65, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Back");
pp2d_draw_text(10, 95, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Restore original LocalFriendCodeSeed"); pp2d_draw_text(10, 95, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Restore original LocalFriendCodeSeed");
@ -262,51 +245,46 @@ void Menu_Restore(void)
selection--; selection--;
if (selection > max_items) if (selection > max_items)
selection = 1; selection = 0;
if (selection < 1) if (selection < 0)
selection = max_items; selection = max_items;
if (kDown & KEY_A) if (kDown & KEY_A)
{ {
switch(selection) switch(selection)
{ {
case 1: case 0:
Menu_Main(); Menu_Main();
break; break;
case 2: case 1:
res = CFGI_RestoreLocalFriendCodeSeed(); res = CFGI_RestoreLocalFriendCodeSeed();
snprintf(func, 20, "LocalFriendCodeSeed"); snprintf(func, 20, "LocalFriendCodeSeed");
selection = 1;
isSelected = true;
break; break;
case 3: case 2:
res = CFGI_RestoreSecureInfo(); res = CFGI_RestoreSecureInfo();
snprintf(func, 11, "SecureInfo"); snprintf(func, 11, "SecureInfo");
selection = 1; case 3:
isSelected = true; if (FS_FileExists(sdmcArchive, "/3ds/3DSRecoveryTool/backups/nand/rw/sys/LocalFriendCodeSeed_B"))
case 4: res = FS_Copy_File(sdmcArchive, nandArchive, ARCHIVE_SDMC, ARCHIVE_NAND_CTR_FS, "/3ds/3DSRecoveryTool/backups/nand/rw/sys/LocalFriendCodeSeed_B", "/rw/sys/LocalFriendCodeSeed_B");
if (FS_FileExists(sdmcArchive, "/3ds/3ds_rec_tool/backups/nand/rw/sys/LocalFriendCodeSeed_B")) else if (FS_FileExists(sdmcArchive, "/3ds/3DSRecoveryTool/backups/nand/rw/sys/LocalFriendCodeSeed_A"))
res = FS_Copy_File(sdmcArchive, nandArchive, ARCHIVE_SDMC, ARCHIVE_NAND_CTR_FS, "/3ds/3ds_rec_tool/backups/nand/rw/sys/LocalFriendCodeSeed_B", "/rw/sys/LocalFriendCodeSeed_B"); res = FS_Copy_File(sdmcArchive, nandArchive, ARCHIVE_SDMC, ARCHIVE_NAND_CTR_FS, "/3ds/3DSRecoveryTool/backups/nand/rw/sys/LocalFriendCodeSeed_A", "/rw/sys/LocalFriendCodeSeed_A");
else if (FS_FileExists(sdmcArchive, "/3ds/3ds_rec_tool/backups/nand/rw/sys/LocalFriendCodeSeed_A"))
res = FS_Copy_File(sdmcArchive, nandArchive, ARCHIVE_SDMC, ARCHIVE_NAND_CTR_FS, "/3ds/3ds_rec_tool/backups/nand/rw/sys/LocalFriendCodeSeed_A", "/rw/sys/LocalFriendCodeSeed_A");
snprintf(func, 20, "LocalFriendCodeSeed"); snprintf(func, 20, "LocalFriendCodeSeed");
selection = 1;
isSelected = true;
break; break;
case 5: case 4:
if (FS_FileExists(sdmcArchive, "/3ds/3ds_rec_tool/backups/nand/rw/sys/SecureInfo_C")) if (FS_FileExists(sdmcArchive, "/3ds/3DSRecoveryTool/backups/nand/rw/sys/SecureInfo_C"))
res = FS_Copy_File(sdmcArchive, nandArchive, ARCHIVE_SDMC, ARCHIVE_NAND_CTR_FS, "/3ds/3ds_rec_tool/backups/nand/rw/sys/SecureInfo_C", "/rw/sys/SecureInfo_C"); res = FS_Copy_File(sdmcArchive, nandArchive, ARCHIVE_SDMC, ARCHIVE_NAND_CTR_FS, "/3ds/3DSRecoveryTool/backups/nand/rw/sys/SecureInfo_C", "/rw/sys/SecureInfo_C");
if (FS_FileExists(sdmcArchive, "/3ds/3ds_rec_tool/backups/nand/rw/sys/SecureInfo_A")) if (FS_FileExists(sdmcArchive, "/3ds/3DSRecoveryTool/backups/nand/rw/sys/SecureInfo_A"))
res = FS_Copy_File(sdmcArchive, nandArchive, ARCHIVE_SDMC, ARCHIVE_NAND_CTR_FS, "/3ds/3ds_rec_tool/backups/nand/rw/sys/SecureInfo_A", "/rw/sys/SecureInfo_A"); res = FS_Copy_File(sdmcArchive, nandArchive, ARCHIVE_SDMC, ARCHIVE_NAND_CTR_FS, "/3ds/3DSRecoveryTool/backups/nand/rw/sys/SecureInfo_A", "/rw/sys/SecureInfo_A");
else if (FS_FileExists(sdmcArchive, "/3ds/3ds_rec_tool/backups/nand/rw/sys/SecureInfo_B")) else if (FS_FileExists(sdmcArchive, "/3ds/3DSRecoveryTool/backups/nand/rw/sys/SecureInfo_B"))
res = FS_Copy_File(sdmcArchive, nandArchive, ARCHIVE_SDMC, ARCHIVE_NAND_CTR_FS, "/3ds/3ds_rec_tool/backups/nand/rw/sys/SecureInfo_B", "/rw/sys/SecureInfo_B"); res = FS_Copy_File(sdmcArchive, nandArchive, ARCHIVE_SDMC, ARCHIVE_NAND_CTR_FS, "/3ds/3DSRecoveryTool/backups/nand/rw/sys/SecureInfo_B", "/rw/sys/SecureInfo_B");
snprintf(func, 11, "SecureInfo"); snprintf(func, 11, "SecureInfo");
selection = 1;
isSelected = true;
break; break;
} }
isSelected = true;
selection = 0;
} }
else if (kDown & KEY_B) else if (kDown & KEY_B)
@ -316,8 +294,7 @@ void Menu_Restore(void)
void Menu_Advanced_Wipe(void) void Menu_Advanced_Wipe(void)
{ {
int selection = 0; int selection = 0, max_items = 10;
int max_items = 8;
Result res = 0; Result res = 0;
@ -330,6 +307,8 @@ void Menu_Advanced_Wipe(void)
"Back", "Back",
"Wipe all temporary and expired titles", "Wipe all temporary and expired titles",
"Wipe all TWL titles", "Wipe all TWL titles",
"Wipe all pending titles",
"Wipe all demo launch infos",
"Wipe config", "Wipe config",
"Wipe parental controls", "Wipe parental controls",
"Wipe all data (NAND)", "Wipe all data (NAND)",
@ -411,8 +390,6 @@ void Menu_Advanced_Wipe(void)
res = AM_DeleteAllTemporaryTitles(); res = AM_DeleteAllTemporaryTitles();
res = AM_DeleteAllExpiredTitles(MEDIATYPE_SD); res = AM_DeleteAllExpiredTitles(MEDIATYPE_SD);
snprintf(func, 27, "temporary & expired titles"); snprintf(func, 27, "temporary & expired titles");
selection = 1;
isSelected = true;
} }
break; break;
case 2: case 2:
@ -420,56 +397,62 @@ void Menu_Advanced_Wipe(void)
{ {
res = AM_DeleteAllTwlTitles(); res = AM_DeleteAllTwlTitles();
snprintf(func, 11, "TWL titles"); snprintf(func, 11, "TWL titles");
selection = 1;
isSelected = true;
} }
break; break;
case 3: case 3:
if (R_SUCCEEDED(Dialog_Draw("You will lose all pending tiles.", "Do you wish to continue?")))
{
res = AM_DeleteAllPendingTitles(MEDIATYPE_NAND);
res = AM_DeleteAllPendingTitles(MEDIATYPE_SD);
snprintf(func, 14, "pending tiles");
}
break;
case 4:
if (R_SUCCEEDED(Dialog_Draw("You will lose all demo launch infos.", "Do you wish to continue?")))
{
res = AM_DeleteAllDemoLaunchInfos();
snprintf(func, 18, "demo launch infos");
}
break;
case 5:
if (R_SUCCEEDED(Dialog_Draw("You will lose all data in Settings.", "Do you wish to continue?"))) if (R_SUCCEEDED(Dialog_Draw("You will lose all data in Settings.", "Do you wish to continue?")))
{ {
res = CFGI_FormatConfig(); res = CFGI_FormatConfig();
snprintf(func, 7, "config"); snprintf(func, 7, "config");
selection = 1;
isSelected = true;
} }
break; break;
case 4: case 6:
if (R_SUCCEEDED(Dialog_Draw("This will disable parental controls.", "Do you wish to continue?"))) if (R_SUCCEEDED(Dialog_Draw("This will disable parental controls.", "Do you wish to continue?")))
{ {
res = CFGI_ClearParentalControls(); res = CFGI_ClearParentalControls();
snprintf(func, 18, "parental controls"); snprintf(func, 18, "parental controls");
selection = 1;
isSelected = true;
} }
break; break;
case 5: case 7:
if (R_SUCCEEDED(Dialog_Draw("You will lose ALL data.", "Do you wish to continue?"))) if (R_SUCCEEDED(Dialog_Draw("You will lose ALL data.", "Do you wish to continue?")))
{ {
res = FSUSER_DeleteAllExtSaveDataOnNand(); res = FSUSER_DeleteAllExtSaveDataOnNand();
res = FSUSER_InitializeCtrFileSystem(); res = FSUSER_InitializeCtrFileSystem();
snprintf(func, 9, "all data"); snprintf(func, 9, "all data");
selection = 1;
isSelected = true;
} }
break; break;
case 6: case 8:
if (R_SUCCEEDED(Dialog_Draw("You will ALL data in your SD.", "Do you wish to continue?"))) if (R_SUCCEEDED(Dialog_Draw("You will lose ALL data in your SD.", "Do you wish to continue?")))
{ {
res = FSUSER_DeleteSdmcRoot(); res = FSUSER_DeleteSdmcRoot();
snprintf(func, 5, "SDMC"); snprintf(func, 5, "SDMC");
selection = 1;
isSelected = true;
} }
break; break;
case 7: case 9:
if (R_SUCCEEDED(Dialog_Draw("You will lose ALL ext savedata in nand.", "Do you wish to continue?"))) if (R_SUCCEEDED(Dialog_Draw("You will lose ALL ext savedata in nand.", "Do you wish to continue?")))
{ {
res = FSUSER_DeleteAllExtSaveDataOnNand(); res = FSUSER_DeleteAllExtSaveDataOnNand();
snprintf(func, 18, "NAND ext savedata"); snprintf(func, 18, "NAND ext savedata");
selection = 1;
isSelected = true;
} }
} }
isSelected = true;
selection = 0;
} }
else if (kDown & KEY_B) else if (kDown & KEY_B)
@ -479,21 +462,19 @@ void Menu_Advanced_Wipe(void)
void Menu_Misc(void) void Menu_Misc(void)
{ {
int selection = 1; int selection = 0, max_items = 5;
int selector_y = 25;
int selector_image_y = 0;
int max_items = 5;
Result res = 0; Result res = 0;
char func[33]; char func[33];
bool isSelected = false; bool isSelected = false;
u8 data[0x110]; FILE *fp = NULL;
FILE * fp; u8 lfcs_data[0x110], sig_data[0x100], secureinfo_data[0x11];
CFGI_GetLocalFriendCodeSeedData(data);
CFGI_GetSecureInfoSignature(sig_data);
CFGI_GetSecureInfoData(secureinfo_data);
while (aptMainLoop()) while (aptMainLoop())
{ {
@ -503,21 +484,20 @@ void Menu_Misc(void)
pp2d_draw_rectangle(0, 16, 400, 40, RGBA8(39, 50, 56, 255)); pp2d_draw_rectangle(0, 16, 400, 40, RGBA8(39, 50, 56, 255));
pp2d_draw_rectangle(0, 55, 400, 185, darkTheme? BG_COLOUR_DARK : BG_COLOUR_LIGHT); pp2d_draw_rectangle(0, 55, 400, 185, darkTheme? BG_COLOUR_DARK : BG_COLOUR_LIGHT);
selector_image_y = selector_y + (DISTANCE_Y * selection);
StatusBar_DisplayBar(); StatusBar_DisplayBar();
pp2d_draw_text(10, 27, 0.5f, 0.5f, RGBA8(240, 242, 242, 255), "Miscellaneous"); pp2d_draw_text(10, 27, 0.5f, 0.5f, RGBA8(240, 242, 242, 255), "Miscellaneous");
pp2d_draw_rectangle(0, selector_image_y, 400, 30, darkTheme? SELECTOR_COLOUR_DARK : SELECTOR_COLOUR_LIGHT); pp2d_draw_rectangle(0, 55 + (DISTANCE_Y * selection), 400, 30, darkTheme? SELECTOR_COLOUR_DARK : SELECTOR_COLOUR_LIGHT);
pp2d_draw_text(10, 65, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Back"); pp2d_draw_text(10, 65, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Back");
pp2d_draw_text(10, 95, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Dump original LocalFriendCodeSeed data"); pp2d_draw_text(10, 95, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Dump original LocalFriendCodeSeed data");
pp2d_draw_text(10, 125, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Verify LocalFriendCodeSeed sig"); pp2d_draw_text(10, 125, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Dump original SecureInfo data");
pp2d_draw_text(10, 155, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Verify SecureInfo sig"); pp2d_draw_text(10, 155, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Verify LocalFriendCodeSeed sig");
pp2d_draw_text(10, 185, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Dark theme"); pp2d_draw_text(10, 185, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Verify SecureInfo sig");
pp2d_draw_text(10, 215, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Dark theme");
darkTheme? pp2d_draw_texture(TEXTURE_TOGGLE_ON, 350, 175) : pp2d_draw_texture(TEXTURE_TOGGLE_OFF, 350, 175); darkTheme? pp2d_draw_texture(TEXTURE_TOGGLE_ON, 350, 205) : pp2d_draw_texture(TEXTURE_TOGGLE_OFF, 350, 205);
pp2d_end_draw(); pp2d_end_draw();
@ -541,45 +521,58 @@ void Menu_Misc(void)
selection--; selection--;
if (selection > max_items) if (selection > max_items)
selection = 1; selection = 0;
if (selection < 1) if (selection < 0)
selection = max_items; selection = max_items;
if (kDown & KEY_A) if (kDown & KEY_A)
{ {
switch(selection) switch(selection)
{ {
case 1: case 0:
Menu_Main(); Menu_Main();
break; break;
case 2: case 1:
CFGI_GetLocalFriendCodeSeedData(lfcs_data);
if (FS_FileExists(nandArchive, "/rw/sys/LocalFriendCodeSeed_B")) if (FS_FileExists(nandArchive, "/rw/sys/LocalFriendCodeSeed_B"))
{ fp = fopen ("/3ds/3DSRecoveryTool/dumps/LocalFriendCodeSeed_B", "wb");
fp = fopen ("/3ds/3ds_rec_tool/dumps/LocalFriendCodeSeed_B", "wb");
res = fwrite(data, 1, 0x110, fp);
fclose(fp);
}
else if (FS_FileExists(nandArchive, "/rw/sys/LocalFriendCodeSeed_A")) else if (FS_FileExists(nandArchive, "/rw/sys/LocalFriendCodeSeed_A"))
{ fp = fopen ("/3ds/3DSRecoveryTool/dumps/LocalFriendCodeSeed_A", "wb");
fp = fopen ("/3ds/3ds_rec_tool/dumps/LocalFriendCodeSeed_A", "wb");
res = fwrite(data, 1, 0x110, fp); res = fwrite(lfcs_data, 1, 0x110, fp);
fclose(fp); fclose(fp);
}
snprintf(func, 25, "LocalFriendCodeSeed dump"); snprintf(func, 25, "LocalFriendCodeSeed dump");
selection = 1; selection = 0;
isSelected = true;
break;
case 2:
if (FS_FileExists(nandArchive, "/rw/sys/SecureInfo_C"))
fp = fopen ("/3ds/3DSRecoveryTool/dumps/SecureInfo_C", "wb");
else if (FS_FileExists(nandArchive, "/rw/sys/SecureInfo_A"))
fp = fopen ("/3ds/3DSRecoveryTool/dumps/SecureInfo_A", "wb");
else if (FS_FileExists(nandArchive, "/rw/sys/SecureInfo_B"))
fp = fopen ("/3ds/3DSRecoveryTool/dumps/SecureInfo_B", "wb");
res = fwrite(sig_data, 1, 0x100, fp);
res = fwrite(secureinfo_data, 1, 0x11, fp);
fclose(fp);
snprintf(func, 25, "SecureInfo dump");
selection = 0;
isSelected = true; isSelected = true;
break; break;
case 3: case 3:
res = CFGI_VerifySigLocalFriendCodeSeed(); res = CFGI_VerifySigLocalFriendCodeSeed();
snprintf(func, 33, "LocalFriendCodeSeed verification"); snprintf(func, 33, "LocalFriendCodeSeed verification");
selection = 1; selection = 0;
isSelected = true; isSelected = true;
break; break;
case 4: case 4:
res = CFGI_VerifySigSecureInfo(); res = CFGI_VerifySigSecureInfo();
snprintf(func, 24, "SecureInfo verification"); snprintf(func, 24, "SecureInfo verification");
selection = 1; selection = 0;
isSelected = true; isSelected = true;
break; break;
case 5: case 5:
@ -599,11 +592,7 @@ void Menu_Misc(void)
void Menu_Main(void) void Menu_Main(void)
{ {
int selection = 1; int selection = 0, max_items = 4;
int selector_y = 25;
int selector_image_y = 0;
int max_items = 5;
pp2d_set_screen_color(GFX_TOP, 0x000000FF); pp2d_set_screen_color(GFX_TOP, 0x000000FF);
pp2d_set_screen_color(GFX_BOTTOM, 0x000000FF); pp2d_set_screen_color(GFX_BOTTOM, 0x000000FF);
@ -616,13 +605,11 @@ void Menu_Main(void)
pp2d_draw_rectangle(0, 16, 400, 40, RGBA8(39, 50, 56, 255)); pp2d_draw_rectangle(0, 16, 400, 40, RGBA8(39, 50, 56, 255));
pp2d_draw_rectangle(0, 55, 400, 185, darkTheme? BG_COLOUR_DARK : BG_COLOUR_LIGHT); pp2d_draw_rectangle(0, 55, 400, 185, darkTheme? BG_COLOUR_DARK : BG_COLOUR_LIGHT);
selector_image_y = selector_y + (DISTANCE_Y * selection);
StatusBar_DisplayBar(); StatusBar_DisplayBar();
pp2d_draw_text(10, 27, 0.5f, 0.5f, RGBA8(240, 242, 242, 255), "3DS Recovery Tool"); pp2d_draw_text(10, 27, 0.5f, 0.5f, RGBA8(240, 242, 242, 255), "3DS Recovery Tool");
pp2d_draw_rectangle(0, selector_image_y, 400, 30, darkTheme? SELECTOR_COLOUR_DARK : SELECTOR_COLOUR_LIGHT); pp2d_draw_rectangle(0, 55 + (DISTANCE_Y * selection), 400, 30, darkTheme? SELECTOR_COLOUR_DARK : SELECTOR_COLOUR_LIGHT);
pp2d_draw_text(10, 65, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Back-up"); pp2d_draw_text(10, 65, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Back-up");
pp2d_draw_text(10, 95, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Restore"); pp2d_draw_text(10, 95, 0.45f, 0.45f, darkTheme? TEXT_COLOUR_DARK : TEXT_COLOUR_LIGHT, "Restore");
@ -652,27 +639,27 @@ void Menu_Main(void)
selection--; selection--;
if (selection > max_items) if (selection > max_items)
selection = 1; selection = 0;
if (selection < 1) if (selection < 0)
selection = max_items; selection = max_items;
if (kDown & KEY_A) if (kDown & KEY_A)
{ {
switch(selection) switch(selection)
{ {
case 1: case 0:
Menu_Backup(); Menu_Backup();
break; break;
case 2: case 1:
Menu_Restore(); Menu_Restore();
break; break;
case 3: case 2:
Menu_Advanced_Wipe(); Menu_Advanced_Wipe();
break; break;
case 4: case 3:
Menu_Misc(); Menu_Misc();
break; break;
case 5: case 4:
longjmp(exitJmp, 1); longjmp(exitJmp, 1);
break; break;
} }