put everything into a new CPR file
This commit is contained in:
2
Makefile
2
Makefile
@@ -11,7 +11,7 @@ include $(DEVKITARM)/base_rules
|
|||||||
IPL_LOAD_ADDR := 0x40003000
|
IPL_LOAD_ADDR := 0x40003000
|
||||||
LPVERSION_MAJOR := 0
|
LPVERSION_MAJOR := 0
|
||||||
LPVERSION_MINOR := 3
|
LPVERSION_MINOR := 3
|
||||||
LPVERSION_BUGFX := 1
|
LPVERSION_BUGFX := 2
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
|
|||||||
329
source/cpr/cpr.c
Normal file
329
source/cpr/cpr.c
Normal file
@@ -0,0 +1,329 @@
|
|||||||
|
// #include <utils/util.h>
|
||||||
|
// #include "tools.h"
|
||||||
|
#include <storage/nx_sd.h>
|
||||||
|
#include "../fs/readers/folderReader.h"
|
||||||
|
#include "../fs/fstypes.h"
|
||||||
|
#include "../fs/fscopy.h"
|
||||||
|
#include <utils/sprintf.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "../gfx/gfx.h"
|
||||||
|
#include "../gfx/gfxutils.h"
|
||||||
|
#include "../gfx/menu.h"
|
||||||
|
#include "../hid/hid.h"
|
||||||
|
// #include "utils.h"
|
||||||
|
#include "../utils/utils.h"
|
||||||
|
#include "../fs/fsutils.h"
|
||||||
|
|
||||||
|
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){
|
||||||
|
int res = f_rename(sourcePath, destPath);
|
||||||
|
if (res){
|
||||||
|
DrawError(newErrCode(res));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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");
|
||||||
|
int readRes = 0;
|
||||||
|
Vector_t fileVec = ReadFolder(storedPath, &readRes);
|
||||||
|
if (readRes){
|
||||||
|
clearFileVector(&fileVec);
|
||||||
|
DrawError(newErrCode(readRes));
|
||||||
|
} else {
|
||||||
|
vecDefArray(FSEntry_t*, fsEntries, fileVec);
|
||||||
|
for (int i = 0; i < fileVec.count; i++){
|
||||||
|
|
||||||
|
char *suf = "/flags/boot2.flag";
|
||||||
|
char *flagPath = CombinePaths(storedPath, fsEntries[i].name);
|
||||||
|
flagPath = CombinePaths(flagPath, suf);
|
||||||
|
|
||||||
|
if (FileExists(flagPath)) {
|
||||||
|
gfx_printf("Deleting: %s\n", flagPath);
|
||||||
|
_DeleteFileSimple(flagPath);
|
||||||
|
}
|
||||||
|
free(flagPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gfx_printf("\n\n Done, press a key to proceed.");
|
||||||
|
hidWait();
|
||||||
|
}
|
||||||
|
|
||||||
|
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 m_entry_stillNoBootInfo(){
|
||||||
|
gfx_clearscreen();
|
||||||
|
gfx_printf("\n\n-- My switch still does not boot.\n\n");
|
||||||
|
|
||||||
|
gfx_printf("%kDo you have a gamecard inserted?\n", COLOR_WHITE);
|
||||||
|
gfx_printf("Try taking it out and reboot.\n\n");
|
||||||
|
|
||||||
|
gfx_printf("%kDid you recently update Atmosphere/DeepSea?\n", COLOR_WHITE);
|
||||||
|
gfx_printf("Insert your sdcard into a computer, delete 'atmosphere', 'bootloader' & 'sept', download your preffered CFW and put the files back on your switch.\n\n");
|
||||||
|
|
||||||
|
gfx_printf("%kDid you just buy a new SD-card?\n", COLOR_WHITE);
|
||||||
|
gfx_printf("Make sure its not a fake card.\n\n");
|
||||||
|
|
||||||
|
gfx_printf("\n\n Done, press a key to proceed.");
|
||||||
|
hidWait();
|
||||||
|
}
|
||||||
|
|
||||||
|
void m_entry_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();
|
||||||
|
}
|
||||||
|
|
||||||
|
void m_entry_fixAll(){
|
||||||
|
gfx_clearscreen();
|
||||||
|
m_entry_deleteBootFlags();
|
||||||
|
m_entry_deleteInstalledThemes();
|
||||||
|
m_entry_fixClingWrap();
|
||||||
|
m_entry_fixAIOUpdate();
|
||||||
|
|
||||||
|
|
||||||
|
m_entry_stillNoBootInfo();
|
||||||
|
}
|
||||||
12
source/cpr/cpr.h
Normal file
12
source/cpr/cpr.h
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <utils/util.h>
|
||||||
|
|
||||||
|
void m_entry_fixArchiveBit(u32 type);
|
||||||
|
void m_entry_fixAIOUpdate();
|
||||||
|
void m_entry_fixClingWrap();
|
||||||
|
void m_entry_deleteInstalledThemes();
|
||||||
|
void m_entry_deleteBootFlags();
|
||||||
|
void m_entry_ViewCredits();
|
||||||
|
void m_entry_fixAll();
|
||||||
|
void m_entry_stillNoBootInfo();
|
||||||
|
void m_entry_fixMacSpecialFolders();
|
||||||
@@ -25,6 +25,8 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "../cpr/cpr.h"
|
||||||
|
|
||||||
extern hekate_config h_cfg;
|
extern hekate_config h_cfg;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@@ -54,7 +56,7 @@ MenuEntry_t mainMenuEntries[] = {
|
|||||||
[DeleteThemes] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Delete installed themes"},
|
[DeleteThemes] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Delete installed themes"},
|
||||||
[FixClingWrap] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix ClingWrap"},
|
[FixClingWrap] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix ClingWrap"},
|
||||||
[FixAIOUpdaterBoot] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix Switch-AiO-Updater update"},
|
[FixAIOUpdaterBoot] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix Switch-AiO-Updater update"},
|
||||||
[FixArchiveBitA] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix archive bit (all folders)"},
|
[FixArchiveBitA] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix archive bit (all folders except nintendo)"},
|
||||||
[FixArchiveBitN] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix archive bit (nintendo folder)"},
|
[FixArchiveBitN] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix archive bit (nintendo folder)"},
|
||||||
// [FixMacSpecialFolders] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Remove special folders created by Mac"},
|
// [FixMacSpecialFolders] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Remove special folders created by Mac"},
|
||||||
[FixAll] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Try everything"},
|
[FixAll] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Try everything"},
|
||||||
@@ -100,318 +102,318 @@ extern int launch_payload(char *path);
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void _DeleteFileSimple(char *thing){
|
// void _DeleteFileSimple(char *thing){
|
||||||
//char *thing = CombinePaths(path, entry.name);
|
// //char *thing = CombinePaths(path, entry.name);
|
||||||
int res = f_unlink(thing);
|
// int res = f_unlink(thing);
|
||||||
if (res)
|
// if (res)
|
||||||
DrawError(newErrCode(res));
|
// DrawError(newErrCode(res));
|
||||||
free(thing);
|
// free(thing);
|
||||||
}
|
// }
|
||||||
void _RenameFileSimple(char *sourcePath, char *destPath){
|
// void _RenameFileSimple(char *sourcePath, char *destPath){
|
||||||
int res = f_rename(sourcePath, destPath);
|
// int res = f_rename(sourcePath, destPath);
|
||||||
if (res){
|
// if (res){
|
||||||
DrawError(newErrCode(res));
|
// DrawError(newErrCode(res));
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
int _fix_attributes(char *path, u32 *total, u32 hos_folder, u32 check_first_run){
|
// int _fix_attributes(char *path, u32 *total, u32 hos_folder, u32 check_first_run){
|
||||||
FRESULT res;
|
// FRESULT res;
|
||||||
DIR dir;
|
// DIR dir;
|
||||||
u32 dirLength = 0;
|
// u32 dirLength = 0;
|
||||||
static FILINFO fno;
|
// static FILINFO fno;
|
||||||
|
|
||||||
if (check_first_run)
|
// if (check_first_run)
|
||||||
{
|
// {
|
||||||
// Read file attributes.
|
// // Read file attributes.
|
||||||
res = f_stat(path, &fno);
|
// res = f_stat(path, &fno);
|
||||||
if (res != FR_OK)
|
// if (res != FR_OK)
|
||||||
return res;
|
// return res;
|
||||||
|
|
||||||
// Check if archive bit is set.
|
// // Check if archive bit is set.
|
||||||
if (fno.fattrib & AM_ARC)
|
// if (fno.fattrib & AM_ARC)
|
||||||
{
|
// {
|
||||||
*(u32 *)total = *(u32 *)total + 1;
|
// *(u32 *)total = *(u32 *)total + 1;
|
||||||
f_chmod(path, 0, AM_ARC);
|
// f_chmod(path, 0, AM_ARC);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Open directory.
|
// // Open directory.
|
||||||
res = f_opendir(&dir, path);
|
// res = f_opendir(&dir, path);
|
||||||
if (res != FR_OK)
|
// if (res != FR_OK)
|
||||||
return res;
|
// return res;
|
||||||
|
|
||||||
dirLength = strlen(path);
|
// dirLength = strlen(path);
|
||||||
for (;;)
|
// for (;;)
|
||||||
{
|
// {
|
||||||
// Clear file or folder path.
|
// // Clear file or folder path.
|
||||||
path[dirLength] = 0;
|
// path[dirLength] = 0;
|
||||||
|
|
||||||
// Read a directory item.
|
// // Read a directory item.
|
||||||
res = f_readdir(&dir, &fno);
|
// res = f_readdir(&dir, &fno);
|
||||||
|
|
||||||
// Break on error or end of dir.
|
// // Break on error or end of dir.
|
||||||
if (res != FR_OK || fno.fname[0] == 0)
|
// if (res != FR_OK || fno.fname[0] == 0)
|
||||||
break;
|
// break;
|
||||||
|
|
||||||
// Skip official Nintendo dir if started from root.
|
// // Skip official Nintendo dir if started from root.
|
||||||
if (!hos_folder && !strcmp(fno.fname, "Nintendo"))
|
// if (!hos_folder && !strcmp(fno.fname, "Nintendo"))
|
||||||
continue;
|
// continue;
|
||||||
|
|
||||||
// Set new directory or file.
|
// // Set new directory or file.
|
||||||
memcpy(&path[dirLength], "/", 1);
|
// memcpy(&path[dirLength], "/", 1);
|
||||||
memcpy(&path[dirLength + 1], fno.fname, strlen(fno.fname) + 1);
|
// memcpy(&path[dirLength + 1], fno.fname, strlen(fno.fname) + 1);
|
||||||
|
|
||||||
// Check if archive bit is set.
|
// // Check if archive bit is set.
|
||||||
if (fno.fattrib & AM_ARC)
|
// if (fno.fattrib & AM_ARC)
|
||||||
{
|
// {
|
||||||
*total = *total + 1;
|
// *total = *total + 1;
|
||||||
f_chmod(path, 0, AM_ARC);
|
// f_chmod(path, 0, AM_ARC);
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Is it a directory?
|
// // Is it a directory?
|
||||||
if (fno.fattrib & AM_DIR)
|
// if (fno.fattrib & AM_DIR)
|
||||||
{
|
// {
|
||||||
// Set archive bit to NCA folders.
|
// // Set archive bit to NCA folders.
|
||||||
if (hos_folder && !strcmp(fno.fname + strlen(fno.fname) - 4, ".nca"))
|
// if (hos_folder && !strcmp(fno.fname + strlen(fno.fname) - 4, ".nca"))
|
||||||
{
|
// {
|
||||||
*total = *total + 1;
|
// *total = *total + 1;
|
||||||
f_chmod(path, AM_ARC, AM_ARC);
|
// f_chmod(path, AM_ARC, AM_ARC);
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Enter the directory.
|
// // Enter the directory.
|
||||||
res = _fix_attributes(path, total, hos_folder, 0);
|
// res = _fix_attributes(path, total, hos_folder, 0);
|
||||||
if (res != FR_OK)
|
// if (res != FR_OK)
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
f_closedir(&dir);
|
// f_closedir(&dir);
|
||||||
|
|
||||||
return res;
|
// return res;
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
void m_entry_fixArchiveBit(u32 type){
|
// void m_entry_fixArchiveBit(u32 type){
|
||||||
gfx_clearscreen();
|
// gfx_clearscreen();
|
||||||
gfx_printf("\n\n-- Fix Archive Bits\n\n");
|
// gfx_printf("\n\n-- Fix Archive Bits\n\n");
|
||||||
|
|
||||||
char path[256];
|
// char path[256];
|
||||||
char label[16];
|
// char label[16];
|
||||||
|
|
||||||
u32 total = 0;
|
// u32 total = 0;
|
||||||
if (sd_mount())
|
// if (sd_mount())
|
||||||
{
|
// {
|
||||||
switch (type)
|
// switch (type)
|
||||||
{
|
// {
|
||||||
case 0:
|
// case 0:
|
||||||
strcpy(path, "/");
|
// strcpy(path, "/");
|
||||||
strcpy(label, "SD Card");
|
// strcpy(label, "SD Card");
|
||||||
break;
|
// break;
|
||||||
case 1:
|
// case 1:
|
||||||
default:
|
// default:
|
||||||
strcpy(path, "/Nintendo");
|
// strcpy(path, "/Nintendo");
|
||||||
strcpy(label, "Nintendo folder");
|
// strcpy(label, "Nintendo folder");
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
|
|
||||||
gfx_printf("Traversing all %s files!\nThis may take some time...\n\n", label);
|
// gfx_printf("Traversing all %s files!\nThis may take some time...\n\n", label);
|
||||||
_fix_attributes(path, &total, type, type);
|
// _fix_attributes(path, &total, type, type);
|
||||||
gfx_printf("%kTotal archive bits cleared: %d!%k", 0xFF96FF00, total, 0xFFCCCCCC);
|
// gfx_printf("%kTotal archive bits cleared: %d!%k", 0xFF96FF00, total, 0xFFCCCCCC);
|
||||||
|
|
||||||
gfx_printf("\n\n Done, press a key to proceed.");
|
// gfx_printf("\n\n Done, press a key to proceed.");
|
||||||
hidWait();
|
// hidWait();
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
void m_entry_fixAIOUpdate(){
|
// void m_entry_fixAIOUpdate(){
|
||||||
gfx_clearscreen();
|
// gfx_clearscreen();
|
||||||
gfx_printf("\n\n-- Fix broken Switch-AiO-Updater update.\n\n");
|
// 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_fs_path = CpyStr("sd:/atmosphere/fusee-secondary.bin.aio");
|
||||||
char *aio_p_path = CpyStr("sd:/sept/payload.bin.aio");
|
// char *aio_p_path = CpyStr("sd:/sept/payload.bin.aio");
|
||||||
char *aio_strt_path = CpyStr("sd:/atmosphere/stratosphere.romfs.aio");
|
// char *aio_strt_path = CpyStr("sd:/atmosphere/stratosphere.romfs.aio");
|
||||||
|
|
||||||
char *o_fs_path = CpyStr("sd:/atmosphere/fusee-secondary.bin");
|
// char *o_fs_path = CpyStr("sd:/atmosphere/fusee-secondary.bin");
|
||||||
char *o_p_path = CpyStr("sd:/sept/payload.bin");
|
// char *o_p_path = CpyStr("sd:/sept/payload.bin");
|
||||||
char *o_strt_path = CpyStr("sd:/atmosphere/stratosphere.romfs");
|
// char *o_strt_path = CpyStr("sd:/atmosphere/stratosphere.romfs");
|
||||||
|
|
||||||
if (FileExists(aio_fs_path)) {
|
// if (FileExists(aio_fs_path)) {
|
||||||
gfx_printf("Detected aio updated fusee-secondary file -> replacing original\n\n");
|
// gfx_printf("Detected aio updated fusee-secondary file -> replacing original\n\n");
|
||||||
if (FileExists(o_fs_path)) {
|
// if (FileExists(o_fs_path)) {
|
||||||
_DeleteFileSimple(o_fs_path);
|
// _DeleteFileSimple(o_fs_path);
|
||||||
}
|
// }
|
||||||
_RenameFileSimple(aio_fs_path, o_fs_path);
|
// _RenameFileSimple(aio_fs_path, o_fs_path);
|
||||||
}
|
// }
|
||||||
free(aio_fs_path);
|
// free(aio_fs_path);
|
||||||
free(o_fs_path);
|
// free(o_fs_path);
|
||||||
|
|
||||||
if (FileExists(aio_p_path)) {
|
// if (FileExists(aio_p_path)) {
|
||||||
gfx_printf("Detected aio updated paload file -> replacing original\n\n");
|
// gfx_printf("Detected aio updated paload file -> replacing original\n\n");
|
||||||
if (FileExists(o_p_path)) {
|
// if (FileExists(o_p_path)) {
|
||||||
_DeleteFileSimple(o_p_path);
|
// _DeleteFileSimple(o_p_path);
|
||||||
}
|
// }
|
||||||
_RenameFileSimple(aio_p_path, o_p_path);
|
// _RenameFileSimple(aio_p_path, o_p_path);
|
||||||
}
|
// }
|
||||||
free(aio_p_path);
|
// free(aio_p_path);
|
||||||
free(o_p_path);
|
// free(o_p_path);
|
||||||
|
|
||||||
if (FileExists(aio_strt_path)) {
|
// if (FileExists(aio_strt_path)) {
|
||||||
gfx_printf("Detected aio updated stratosphere file -> replacing original\n\n");
|
// gfx_printf("Detected aio updated stratosphere file -> replacing original\n\n");
|
||||||
if (FileExists(o_strt_path)) {
|
// if (FileExists(o_strt_path)) {
|
||||||
_DeleteFileSimple(o_strt_path);
|
// _DeleteFileSimple(o_strt_path);
|
||||||
}
|
// }
|
||||||
_RenameFileSimple(aio_strt_path, o_strt_path);
|
// _RenameFileSimple(aio_strt_path, o_strt_path);
|
||||||
}
|
// }
|
||||||
free(aio_strt_path);
|
// free(aio_strt_path);
|
||||||
free(o_strt_path);
|
// free(o_strt_path);
|
||||||
|
|
||||||
|
|
||||||
gfx_printf("\n\n Done, press a key to proceed.");
|
// gfx_printf("\n\n Done, press a key to proceed.");
|
||||||
hidWait();
|
// hidWait();
|
||||||
}
|
// }
|
||||||
|
|
||||||
void m_entry_fixClingWrap(){
|
// void m_entry_fixClingWrap(){
|
||||||
gfx_clearscreen();
|
// gfx_clearscreen();
|
||||||
gfx_printf("\n\n-- Fixing ClingWrap.\n\n");
|
// gfx_printf("\n\n-- Fixing ClingWrap.\n\n");
|
||||||
char *bpath = CpyStr("sd:/_b0otloader");
|
// char *bpath = CpyStr("sd:/_b0otloader");
|
||||||
char *bopath = CpyStr("sd:/bootloader");
|
// char *bopath = CpyStr("sd:/bootloader");
|
||||||
char *kpath = CpyStr("sd:/atmosphere/_k1ps");
|
// char *kpath = CpyStr("sd:/atmosphere/_k1ps");
|
||||||
char *kopath = CpyStr("sd:/atmosphere/kips");
|
// char *kopath = CpyStr("sd:/atmosphere/kips");
|
||||||
|
|
||||||
char *ppath = CpyStr("sd:/bootloader/_patchesCW.ini");
|
// char *ppath = CpyStr("sd:/bootloader/_patchesCW.ini");
|
||||||
char *popath = CpyStr("sd:/atmosphere/patches.ini");
|
// char *popath = CpyStr("sd:/atmosphere/patches.ini");
|
||||||
|
|
||||||
if (FileExists(bpath)) {
|
// if (FileExists(bpath)) {
|
||||||
if (FileExists(bopath)) {
|
// if (FileExists(bopath)) {
|
||||||
FolderDelete(bopath);
|
// FolderDelete(bopath);
|
||||||
}
|
// }
|
||||||
int res = f_rename(bpath, bopath);
|
// int res = f_rename(bpath, bopath);
|
||||||
if (res){
|
// if (res){
|
||||||
DrawError(newErrCode(res));
|
// DrawError(newErrCode(res));
|
||||||
}
|
// }
|
||||||
gfx_printf("-- Fixed Bootloader\n");
|
// gfx_printf("-- Fixed Bootloader\n");
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (FileExists(kpath)) {
|
// if (FileExists(kpath)) {
|
||||||
if (FileExists(kopath)) {
|
// if (FileExists(kopath)) {
|
||||||
FolderDelete(kopath);
|
// FolderDelete(kopath);
|
||||||
}
|
// }
|
||||||
int res = f_rename(kpath, kopath);
|
// int res = f_rename(kpath, kopath);
|
||||||
if (res){
|
// if (res){
|
||||||
DrawError(newErrCode(res));
|
// DrawError(newErrCode(res));
|
||||||
}
|
// }
|
||||||
gfx_printf("-- Fixed kips\n");
|
// gfx_printf("-- Fixed kips\n");
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (FileExists(ppath)) {
|
// if (FileExists(ppath)) {
|
||||||
if (FileExists(popath)) {
|
// if (FileExists(popath)) {
|
||||||
_DeleteFileSimple(popath);
|
// _DeleteFileSimple(popath);
|
||||||
}
|
// }
|
||||||
_RenameFileSimple(ppath,popath);
|
// _RenameFileSimple(ppath,popath);
|
||||||
gfx_printf("-- Fixed patches.ini\n");
|
// gfx_printf("-- Fixed patches.ini\n");
|
||||||
}
|
// }
|
||||||
|
|
||||||
free(bpath);
|
// free(bpath);
|
||||||
free(bopath);
|
// free(bopath);
|
||||||
free(kpath);
|
// free(kpath);
|
||||||
free(kopath);
|
// free(kopath);
|
||||||
free(ppath);
|
// free(ppath);
|
||||||
free(popath);
|
// free(popath);
|
||||||
|
|
||||||
gfx_printf("\n\n Done, press a key to proceed.");
|
// gfx_printf("\n\n Done, press a key to proceed.");
|
||||||
hidWait();
|
// hidWait();
|
||||||
}
|
// }
|
||||||
|
|
||||||
void _deleteTheme(char* basePath, char* folderId){
|
// void _deleteTheme(char* basePath, char* folderId){
|
||||||
char *path = CombinePaths(basePath, folderId);
|
// char *path = CombinePaths(basePath, folderId);
|
||||||
if (FileExists(path)) {
|
// if (FileExists(path)) {
|
||||||
gfx_printf("-- Theme found: %s\n", path);
|
// gfx_printf("-- Theme found: %s\n", path);
|
||||||
FolderDelete(path);
|
// FolderDelete(path);
|
||||||
}
|
// }
|
||||||
free(path);
|
// free(path);
|
||||||
}
|
// }
|
||||||
|
|
||||||
void m_entry_deleteInstalledThemes(){
|
// void m_entry_deleteInstalledThemes(){
|
||||||
gfx_clearscreen();
|
// gfx_clearscreen();
|
||||||
gfx_printf("\n\n-- Deleting installed themes.\n\n");
|
// gfx_printf("\n\n-- Deleting installed themes.\n\n");
|
||||||
_deleteTheme("sd:/atmosphere/contents", "0100000000001000");
|
// _deleteTheme("sd:/atmosphere/contents", "0100000000001000");
|
||||||
_deleteTheme("sd:/atmosphere/contents", "0100000000001007");
|
// _deleteTheme("sd:/atmosphere/contents", "0100000000001007");
|
||||||
_deleteTheme("sd:/atmosphere/contents", "0100000000001013");
|
// _deleteTheme("sd:/atmosphere/contents", "0100000000001013");
|
||||||
|
|
||||||
gfx_printf("\n\n Done, press a key to proceed.");
|
// gfx_printf("\n\n Done, press a key to proceed.");
|
||||||
hidWait();
|
// hidWait();
|
||||||
}
|
// }
|
||||||
|
|
||||||
void m_entry_deleteBootFlags(){
|
// void m_entry_deleteBootFlags(){
|
||||||
gfx_clearscreen();
|
// gfx_clearscreen();
|
||||||
gfx_printf("\n\n-- Disabling automatic sysmodule startup.\n\n");
|
// gfx_printf("\n\n-- Disabling automatic sysmodule startup.\n\n");
|
||||||
char *storedPath = CpyStr("sd:/atmosphere/contents");
|
// char *storedPath = CpyStr("sd:/atmosphere/contents");
|
||||||
int readRes = 0;
|
// int readRes = 0;
|
||||||
Vector_t fileVec = ReadFolder(storedPath, &readRes);
|
// Vector_t fileVec = ReadFolder(storedPath, &readRes);
|
||||||
if (readRes){
|
// if (readRes){
|
||||||
clearFileVector(&fileVec);
|
// clearFileVector(&fileVec);
|
||||||
DrawError(newErrCode(readRes));
|
// DrawError(newErrCode(readRes));
|
||||||
} else {
|
// } else {
|
||||||
vecDefArray(FSEntry_t*, fsEntries, fileVec);
|
// vecDefArray(FSEntry_t*, fsEntries, fileVec);
|
||||||
for (int i = 0; i < fileVec.count; i++){
|
// for (int i = 0; i < fileVec.count; i++){
|
||||||
|
|
||||||
char *suf = "/flags/boot2.flag";
|
// char *suf = "/flags/boot2.flag";
|
||||||
char *flagPath = CombinePaths(storedPath, fsEntries[i].name);
|
// char *flagPath = CombinePaths(storedPath, fsEntries[i].name);
|
||||||
flagPath = CombinePaths(flagPath, suf);
|
// flagPath = CombinePaths(flagPath, suf);
|
||||||
|
|
||||||
if (FileExists(flagPath)) {
|
// if (FileExists(flagPath)) {
|
||||||
gfx_printf("Deleting: %s\n", flagPath);
|
// gfx_printf("Deleting: %s\n", flagPath);
|
||||||
_DeleteFileSimple(flagPath);
|
// _DeleteFileSimple(flagPath);
|
||||||
}
|
// }
|
||||||
free(flagPath);
|
// free(flagPath);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
gfx_printf("\n\n Done, press a key to proceed.");
|
// gfx_printf("\n\n Done, press a key to proceed.");
|
||||||
hidWait();
|
// hidWait();
|
||||||
}
|
// }
|
||||||
|
|
||||||
void m_entry_fixMacSpecialFolders(char *path){
|
// void m_entry_fixMacSpecialFolders(char *path){
|
||||||
// browse path
|
// // browse path
|
||||||
// list files & folders
|
// // list files & folders
|
||||||
// if file -> delete
|
// // if file -> delete
|
||||||
// if folder !== nintendo
|
// // if folder !== nintendo
|
||||||
// if folder m_entry_fixMacSpecialFolders with new path
|
// // if folder m_entry_fixMacSpecialFolders with new path
|
||||||
}
|
// }
|
||||||
|
|
||||||
void m_entry_stillNoBootInfo(){
|
// void m_entry_stillNoBootInfo(){
|
||||||
gfx_clearscreen();
|
// gfx_clearscreen();
|
||||||
gfx_printf("\n\n-- My switch still does not boot.\n\n");
|
// gfx_printf("\n\n-- My switch still does not boot.\n\n");
|
||||||
|
|
||||||
gfx_printf("%kDo you have a gamecard inserted?\n", COLOR_WHITE);
|
// gfx_printf("%kDo you have a gamecard inserted?\n", COLOR_WHITE);
|
||||||
gfx_printf("Try taking it out and reboot.\n\n");
|
// gfx_printf("Try taking it out and reboot.\n\n");
|
||||||
|
|
||||||
gfx_printf("%kDid you recently update Atmosphere/DeepSea?\n", COLOR_WHITE);
|
// gfx_printf("%kDid you recently update Atmosphere/DeepSea?\n", COLOR_WHITE);
|
||||||
gfx_printf("Insert your sdcard into a computer, delete 'atmosphere', 'bootloader' & 'sept', download your preffered CFW and put the files back on your switch.\n\n");
|
// gfx_printf("Insert your sdcard into a computer, delete 'atmosphere', 'bootloader' & 'sept', download your preffered CFW and put the files back on your switch.\n\n");
|
||||||
|
|
||||||
gfx_printf("%kDid you just buy a new SD-card?\n", COLOR_WHITE);
|
// gfx_printf("%kDid you just buy a new SD-card?\n", COLOR_WHITE);
|
||||||
gfx_printf("Make sure its not a fake card.\n\n");
|
// gfx_printf("Make sure its not a fake card.\n\n");
|
||||||
|
|
||||||
gfx_printf("\n\n Done, press a key to proceed.");
|
// gfx_printf("\n\n Done, press a key to proceed.");
|
||||||
hidWait();
|
// hidWait();
|
||||||
}
|
// }
|
||||||
|
|
||||||
void m_entry_ViewCredits(){
|
// void m_entry_ViewCredits(){
|
||||||
gfx_clearscreen();
|
// 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);
|
// 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();
|
// hidWait();
|
||||||
}
|
// }
|
||||||
|
|
||||||
void m_entry_fixAll(){
|
// void m_entry_fixAll(){
|
||||||
gfx_clearscreen();
|
// gfx_clearscreen();
|
||||||
m_entry_deleteBootFlags();
|
// m_entry_deleteBootFlags();
|
||||||
m_entry_deleteInstalledThemes();
|
// m_entry_deleteInstalledThemes();
|
||||||
m_entry_fixClingWrap();
|
// m_entry_fixClingWrap();
|
||||||
m_entry_fixAIOUpdate();
|
// m_entry_fixAIOUpdate();
|
||||||
|
|
||||||
|
|
||||||
m_entry_stillNoBootInfo();
|
// m_entry_stillNoBootInfo();
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
|
|||||||
Reference in New Issue
Block a user