16 Commits

Author SHA1 Message Date
c6b6b42eda Use parallel build in CI workflow
All checks were successful
Build / Build (push) Successful in 16s
Add -j4 to make for faster compilation.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-13 21:35:43 +01:00
9cd8953f78 Move theme removal to AMS error codes section
All checks were successful
Build / Build (push) Successful in 34s
Relocated "Delete Themes" entry from the boot problem section into
the Atmosphere error codes section as "Fix 0100000000001000
(Installiertes Theme)" to better reflect that it fixes an AMS
title ID conflict.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-13 21:34:22 +01:00
45c659f1ea Updated workflow
All checks were successful
Build / Build (push) Successful in 34s
2026-02-13 21:24:35 +01:00
f82ee15f52 Updated workflow
Some checks failed
Build / Build (push) Failing after 34s
2026-02-13 21:23:32 +01:00
2987a3c88e Updated Readme
Some checks failed
Build / Build (push) Failing after 2s
2026-02-13 21:22:20 +01:00
e6676315c7 Updated workflow
Some checks failed
Build / Build (push) Failing after 3s
2026-02-13 21:21:52 +01:00
ef9c1eaf7a Fix data abort crash in Mac special files removal (listdir)
The listdir function had three memory corruption bugs causing a
data abort (Err:19) on the Switch:

1. Heap buffer overflow: CpyStr("sd:/") allocated only 5 bytes but
   listdir appends full subdirectory paths in-place via memcpy.
   Fixed by using a 1024-byte stack buffer instead.

2. Use-after-free: _DeleteFileSimple(path) freed the shared traversal
   buffer, but the loop continued using it. Fixed by inlining f_unlink
   without freeing.

3. Recursive free + missing else: free(path) at the end of listdir
   freed the buffer shared across all recursive frames, and a missing
   else caused recursion into directories that were just deleted.
   Removed the free and added an else guard.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-13 21:16:58 +01:00
763cb43983 Added AMS section and fixed inconsistencies 2026-02-07 23:00:29 +01:00
59f7dde33a Updated gitignore 2026-02-06 21:04:13 +01:00
bc086126e5 Updated Readme 2026-02-06 21:03:23 +01:00
5702202ea9 Updated Readme 2026-02-06 21:02:47 +01:00
36a08cf42f Updated Readme 2026-02-06 21:01:27 +01:00
1a7b0a1667 Added german translation and bugfixes 2026-02-06 21:00:36 +01:00
6ee7d5f892 Updated Workflow 2026-02-06 19:22:32 +01:00
6239b65472 Updated Workflow 2026-02-06 19:20:47 +01:00
29d63ffbf7 Updated Workflow 2026-02-06 19:19:03 +01:00
11 changed files with 199 additions and 246 deletions

View File

@@ -1,52 +1,30 @@
name: Release name: Build
on: on:
issue_comment: push:
types: [ created ] workflow_dispatch:
jobs: jobs:
build_and_release: build:
name: Build and release name: Build
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: devkitpro/devkita64:latest container: devkitpro/devkita64:latest
if: contains(github.event.comment.body, '/release-action')
steps: steps:
- name: Update latest libnx - name: Install dependencies
run: | run: apt-get update && apt-get install -y nodejs
git config --global --add safe.directory "*"
git clone --recurse-submodules https://github.com/zdm65477730/libnx.git
cd libnx
make install -j$(nproc)
shell: bash
- name: Checkout latest code - name: Checkout latest code
uses: actions/checkout@v5 uses: actions/checkout@v5
with: with:
ref: master
clean: true clean: true
fetch-depth: 0
fetch-tags: true
submodules: recursive submodules: recursive
- name: Setup ENV parameters
run: |
VER_FILE=Makefile
VERSION=$(awk '/^LPVERSION_MAJOR/{print $3}' $VER_FILE).$(awk '/^LPVERSION_MINOR/{print $3}' $VER_FILE).$(awk '/^LPVERSION_BUGFX/{print $3}' $VER_FILE)
echo "TAG=${VERSION}" >> "${GITHUB_ENV}"
echo "RELEASE_NAME=CommonProblemResolver ${VERSION}" >> "${GITHUB_ENV}"
shell: bash
- name: Build - name: Build
run: | run: |
export DEVKITPRO=/opt/devkitpro export DEVKITPRO=/opt/devkitpro
make all make -j4 all
shell: bash shell: bash
- name: Upload Release Asset - name: Upload artifact
uses: softprops/action-gh-release@v2.0.9 uses: actions/upload-artifact@v3
with: with:
name: ${{ env.RELEASE_NAME }} name: AllgemeinerProblemLoeser.bin
tag_name: ${{ env.TAG }} path: output/AllgemeinerProblemLoeser.bin
draft: false
prerelease: false
generate_release_notes: yes
make_latest: true
files: |
output/CommonProblemResolver.bin

13
.gitignore vendored
View File

@@ -2,3 +2,16 @@
build build
output output
research research
# macOS
.DS_Store
.AppleDouble
.LSOverride
._*
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.apDisk

View File

@@ -9,13 +9,13 @@ include $(DEVKITARM)/base_rules
################################################################################ ################################################################################
IPL_LOAD_ADDR := 0x40008000 IPL_LOAD_ADDR := 0x40008000
LPVERSION_MAJOR := 0 APLVERSION_MAJOR := 0
LPVERSION_MINOR := 3 APLVERSION_MINOR := 3
LPVERSION_BUGFX := 4 APLVERSION_BUGFX := 4
################################################################################ ################################################################################
TARGET := CommonProblemResolver TARGET := AllgemeinerProblemLoeser
BUILDDIR := build BUILDDIR := build
OUTPUTDIR := output OUTPUTDIR := output
SOURCEDIR = source SOURCEDIR = source
@@ -37,7 +37,7 @@ FFCFG_INC := '"../$(SOURCEDIR)/libs/fatfs/ffconf.h"'
################################################################################ ################################################################################
CUSTOMDEFINES := -DIPL_LOAD_ADDR=$(IPL_LOAD_ADDR) CUSTOMDEFINES := -DIPL_LOAD_ADDR=$(IPL_LOAD_ADDR)
CUSTOMDEFINES += -DLP_VER_MJ=$(LPVERSION_MAJOR) -DLP_VER_MN=$(LPVERSION_MINOR) -DLP_VER_BF=$(LPVERSION_BUGFX) CUSTOMDEFINES += -DAPL_VER_MJ=$(APLVERSION_MAJOR) -DAPL_VER_MN=$(APLVERSION_MINOR) -DAPL_VER_BF=$(APLVERSION_BUGFX)
CUSTOMDEFINES += -DGFX_INC=$(GFX_INC) -DFFCFG_INC=$(FFCFG_INC) CUSTOMDEFINES += -DGFX_INC=$(GFX_INC) -DFFCFG_INC=$(FFCFG_INC)
# 0: UART_A, 1: UART_B. # 0: UART_A, 1: UART_B.

View File

@@ -1,34 +1,41 @@
# CommonProblemResolver (CPR) # AllgemeinerProblemLoeser (APL)
Rescue your switch without a pc! Rette deine Switch ohne PC!
## Usage **Original-Projekt:** [Common Problem Resolver](https://github.com/Team-Neptune/CommonProblemResolver) von [Team Neptune](https://github.com/Team-Neptune).
1. Get your favorite payload injector
2. Inject CPR as a payload
Navigate around the menus using the joycons. ## Nutzung
- A: Select
- B: Back
- Left Joystick up/down (Dpad or joystick): navigate menus up/down
- Right Joystick up/down: fast menu navigation up/down
- Capture (Minerva only): Take a screenshot
- L3/R3 (Press joysticks in): Recalibrate centerpoint
If you do not have your joycons connected: 1. Besorge dir einen Payload-Injector deiner Wahl
2. Lade APL als Payload
Navigation in den Menues mit den Joy-Cons:
- A: Auswaehlen
- B: Zurueck
- Linker Stick hoch/runter (D-Pad oder Stick): Menue hoch/runter
- Rechter Stick hoch/runter: Schnelle Menue-Navigation
- Capture (nur Minerva): Screenshot
- L3/R3 (Sticks eindruecken): Mittelpunkt neu kalibrieren
Ohne verbundene Joy-Cons:
- Power -> A - Power -> A
- Vol+ -> Left Joystick up - Vol+ -> Linker Stick hoch
- Vol- -> Left Joystick down - Vol- -> Linker Stick runter
## Functions ## Funktionen
- Disables all sysmodules on your switch (might fix booting issues after update)
- Delete installed themes (will fix booting issues after update) - Deaktiviert automatischen Sysmodule-Start (kann Startprobleme nach Updates beheben)
- Reverts changes made by clingwrap - Loescht installierte Themes (kann Startprobleme nach Updates beheben)
- Behebt Archiv-Bit (SD-Karte)
- Entfernt Mac-Sonderordner
## Support ## Support
Join [our discord](https://discord.gg/VkaRjYN) for help. Fuer Hilfe: [unser Discord](https://discord.gg/VkaRjYN)
## Credits ## Danksagungen
This is heavily based on [TegraExplorer](https://github.com/suchmememanyskill/TegraExplorer) by suchmememanyskill, - **Deutsche Übersetzung:** [Switch Bros.](https://github.com/Switch-Bros/AllgemeinerProblemLoeser)
which itself is based on [Lockpick_RCM](https://github.com/shchmue/Lockpick_RCM), and thus also based on [Hekate](https://github.com/CTCaer/hekate) - Dieses Projekt basiert stark auf dem [Original Common Problem Resolver](https://github.com/Team-Neptune/CommonProblemResolver) von [Team Neptune](https://github.com/Team-Neptune),
sowie auf [TegraExplorer](https://github.com/suchmememanyskill/TegraExplorer) von suchmememanyskill,
[Lockpick_RCM](https://github.com/shchmue/Lockpick_RCM) und [Hekate](https://github.com/CTCaer/hekate).

View File

@@ -74,7 +74,7 @@ int _StartsWith(const char *a, const char *b)
return 0; return 0;
} }
int listdir(char *path, u32 hos_folder) int listdir(char *path, u32 hos_folder, int *deleted_count)
{ {
FRESULT res; FRESULT res;
DIR dir; DIR dir;
@@ -100,11 +100,10 @@ int listdir(char *path, u32 hos_folder)
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);
// gfx_printf("THING: %s\n", fno.fname);
// gfx_printf("Path: %s\n", dir);
// Is it a directory? // Is it a directory?
if (fno.fattrib & AM_DIR) if (fno.fattrib & AM_DIR)
{ {
@@ -119,10 +118,12 @@ int listdir(char *path, u32 hos_folder)
strcmp(fno.fname, ".TemporaryItems") == 0 strcmp(fno.fname, ".TemporaryItems") == 0
) { ) {
_FolderDelete(path); _FolderDelete(path);
if (deleted_count) (*deleted_count)++;
}
else {
// Only recurse into directories that were not deleted.
listdir(path, 0, deleted_count);
} }
// Enter the directory.
listdir(path, 0);
if (res != FR_OK) if (res != FR_OK)
break; break;
} else { } else {
@@ -135,12 +136,14 @@ int listdir(char *path, u32 hos_folder)
strcmp(fno.fname, ".TemporaryItems") == 0 || strcmp(fno.fname, ".TemporaryItems") == 0 ||
_StartsWith(fno.fname, "._") _StartsWith(fno.fname, "._")
) { ) {
_DeleteFileSimple(path); res = f_unlink(path);
if (res)
DrawError(newErrCode(res));
if (deleted_count) (*deleted_count)++;
} }
} }
} }
f_closedir(&dir); f_closedir(&dir);
free(path);
return res; return res;
} }
@@ -223,7 +226,7 @@ int _fix_attributes(char *path, u32 *total, u32 hos_folder, u32 check_first_run)
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-- Behebe Archive Bit\n\n");
char path[256]; char path[256];
char label[16]; char label[16];
@@ -235,169 +238,122 @@ void m_entry_fixArchiveBit(u32 type){
{ {
case 0: case 0:
strcpy(path, "/"); strcpy(path, "/");
strcpy(label, "SD Card"); strcpy(label, "SD-Karte");
break; break;
case 1: case 1:
default: default:
strcpy(path, "/Nintendo"); strcpy(path, "/Nintendo");
strcpy(label, "Nintendo folder"); strcpy(label, "Nintendo Ordner");
break; break;
} }
gfx_printf("Traversing all %s files!\nThis may take some time...\n\n", label); gfx_printf("Durchlaufe alle %s Dateien!\nDas kann einige Zeit dauern...\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("%kAnzahl reparierter Archiv bits: %d!%k", 0xFF96FF00, total, 0xFFCCCCCC);
gfx_printf("\n\n Done, press a key to proceed."); gfx_printf("\n\n Fertig! Druecke eine Taste um zurueckzukehren");
hidWait(); hidWait();
} }
} }
void m_entry_fixAIOUpdate(){ static void _fixAMSErrorFolder(const char *titleId, const char *label){
gfx_clearscreen(); gfx_clearscreen();
gfx_printf("\n\n-- Fix broken Switch-AiO-Updater update.\n\n"); gfx_printf("\n\n-- Fix Fehlercode %s --\n\n", label);
if (!sd_mount()) {
char *aio_fs_path = CpyStr("sd:/atmosphere/fusee-secondary.bin.aio"); gfx_printf("SD-Karte konnte nicht gemountet werden.\n");
char *aio_p_path = CpyStr("sd:/sept/payload.bin.aio"); hidWait();
char *aio_strt_path = CpyStr("sd:/atmosphere/stratosphere.romfs.aio"); return;
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); char *path = CpyStr("sd:/atmosphere/contents");
char *full = CombinePaths(path, titleId);
free(path);
if (FileExists(full)) {
gfx_printf("Entferne Ordner %s ...\n", titleId);
FolderDelete(full);
gfx_printf("Ordner erfolgreich geloescht.\n");
} else {
gfx_printf("Ordner %s nicht gefunden (evtl. bereits behoben).\n", titleId);
} }
free(aio_fs_path); free(full);
free(o_fs_path); gfx_printf("\n\n Fertig! Druecke eine Taste um zurueckzukehren");
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(); hidWait();
} }
void m_entry_fixClingWrap(){ void m_entry_fixAMSError_4200(void){
gfx_clearscreen(); _fixAMSErrorFolder("4200000000000010", "4200000000000010");
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){ void m_entry_fixAMSError_6900(void){
_fixAMSErrorFolder("690000000000000D", "690000000000000D");
}
void m_entry_fixAMSError_BD00(void){
_fixAMSErrorFolder("010000000000BD00", "010000000000BD00");
}
static int _deleteTheme(char* basePath, char* folderId){
int removed = 0;
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 gefunden: %s\n", path);
FolderDelete(path); FolderDelete(path);
removed = 1;
} }
free(path); free(path);
return removed;
} }
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-- Loesche installierte Themes.\n\n");
_deleteTheme("sd:/atmosphere/contents", "0100000000001000"); int count = 0;
_deleteTheme("sd:/atmosphere/contents", "0100000000001007"); count += _deleteTheme("sd:/atmosphere/contents", "0100000000001000");
_deleteTheme("sd:/atmosphere/contents", "0100000000001013"); count += _deleteTheme("sd:/atmosphere/contents", "0100000000001007");
count += _deleteTheme("sd:/atmosphere/contents", "0100000000001013");
gfx_printf("\n\n Done, press a key to proceed."); if (count > 0)
gfx_printf("\n%d Theme(s) geloescht.\n", count);
else
gfx_printf("\nKeine installierten Themes gefunden.\n");
gfx_printf("\n\n Fertig! Druecke eine Taste um zurueckzukehren");
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-- Automatisches starten der sysmodule deaktivieren.\n\n");
char *storedPath = CpyStr("sd:/atmosphere/contents"); char *storedPath = CpyStr("sd:/atmosphere/contents");
int readRes = 0; int readRes = 0;
int count = 0;
Vector_t fileVec = ReadFolder(storedPath, &readRes); Vector_t fileVec = ReadFolder(storedPath, &readRes);
if (readRes){ if (readRes){
clearFileVector(&fileVec); clearFileVector(&fileVec);
free(storedPath);
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 *subPath = CombinePaths(storedPath, fsEntries[i].name);
flagPath = CombinePaths(flagPath, suf); char *flagPath = CombinePaths(subPath, suf);
free(subPath);
if (FileExists(flagPath)) { if (FileExists(flagPath)) {
gfx_printf("Deleting: %s\n", flagPath); gfx_printf("Loesche: %s\n", flagPath);
_DeleteFileSimple(flagPath); _DeleteFileSimple(flagPath);
} count++;
} else {
free(flagPath); free(flagPath);
} }
} }
gfx_printf("\n\n Done, press a key to proceed."); clearFileVector(&fileVec);
free(storedPath);
}
if (count > 0)
gfx_printf("\n%d Boot-Flag(s) geloescht.\n", count);
else if (!readRes)
gfx_printf("\nKeine Boot-Flags gefunden.\n");
gfx_printf("\n\n Fertig! Druecke eine Taste um zurueckzukehren");
hidWait(); hidWait();
} }
@@ -405,38 +361,39 @@ void m_entry_deleteBootFlags(){
void m_entry_fixMacSpecialFolders(){ void m_entry_fixMacSpecialFolders(){
gfx_clearscreen(); gfx_clearscreen();
gfx_printf("\n\n-- Fix mac folders (this can take some time, please wait.)\n\n"); gfx_printf("\n\n-- Mac-Ordner reparieren (dies kann ein wenig dauern, bitte warten.)\n\n");
listdir("/", 0); int deleted = 0;
gfx_printf("\n\rDone, press a key to proceed."); char path[1024];
strcpy(path, "sd:/");
listdir(path, 0, &deleted);
if (deleted > 0)
gfx_printf("\n%d Mac-Datei(en)/Ordner entfernt.\n", deleted);
else
gfx_printf("\nKeine Mac-Sonderdateien oder -ordner gefunden.\n");
gfx_printf("\n\n Fertig! Druecke eine Taste um zurueckzukehren");
hidWait(); hidWait();
// browse path
// list files & folders
// if file -> delete
// if folder !== nintendo
// 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-- Meine Switch startet immer noch nicht.\n\n");
gfx_printf("%kDo you have a gamecard inserted?\n", COLOR_WHITE); gfx_printf("%kSteckt eine Spiel-Cardrige im Slot?\n", COLOR_WHITE);
gfx_printf("Try taking it out and reboot.\n\n"); gfx_printf("Entferne sie und starte neu.\n\n");
gfx_printf("%kDid you recently update Atmosphere/DeepSea?\n", COLOR_WHITE); gfx_printf("%kHast du vor kurzem Atmosphere/OmniNX aktualisiert?\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("Stecke die SD-Karte in deinen PC, hol das neue Paket vom NiklasCFW Discord-Server und entpacke die .zip Datei auf deine SD-Karte und überschreibe alle Dateien.\nDanach kannst du den OmniNX-Installer-Payload ausfuehren.\n\n");
gfx_printf("%kDid you just buy a new SD-card?\n", COLOR_WHITE); gfx_printf("%kHast du eine neue SD-Karte gekauft?\n", COLOR_WHITE);
gfx_printf("Make sure its not a fake card.\n\n"); gfx_printf("Vergewissere dich das es keine fake/SanDisk Karte ist.\n\n");
gfx_printf("\n\n Done, press a key to proceed."); gfx_printf("\n\n Druecke eine Taste um zurueckzukehren");
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("\nAllgemeinerProblemLoeser %d.%d.%d\nVon Team Neptune - (NiklasCFW Fork - Uebersetzt von Switch Bros.)\n\nBasierend auf TegraExplorer von SuchMemeManySkill,\nLockpick_RCM & Hekate, von shchmue & CTCaer\n\n\n", APL_VER_MJ, APL_VER_MN, APL_VER_BF);
hidWait(); hidWait();
} }
@@ -444,9 +401,6 @@ 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_fixAIOUpdate();
m_entry_stillNoBootInfo(); m_entry_stillNoBootInfo();
} }

View File

@@ -2,8 +2,9 @@
#include <utils/util.h> #include <utils/util.h>
void m_entry_fixArchiveBit(u32 type); void m_entry_fixArchiveBit(u32 type);
void m_entry_fixAIOUpdate(); void m_entry_fixAMSError_4200(void);
void m_entry_fixClingWrap(); void m_entry_fixAMSError_6900(void);
void m_entry_fixAMSError_BD00(void);
void m_entry_deleteInstalledThemes(); void m_entry_deleteInstalledThemes();
void m_entry_deleteBootFlags(); void m_entry_deleteBootFlags();
void m_entry_ViewCredits(); void m_entry_ViewCredits();

View File

@@ -13,7 +13,7 @@ void gfx_printTopInfo() {
bq24193_get_property(BQ24193_ChargeStatus, &current_charge_status); bq24193_get_property(BQ24193_ChargeStatus, &current_charge_status);
SETCOLOR(COLOR_DEFAULT, COLOR_WHITE); SETCOLOR(COLOR_DEFAULT, COLOR_WHITE);
gfx_con_setpos(0, 0); gfx_con_setpos(0, 0);
gfx_printf("CPR %d.%d.%d | Battery: %d%% %c\n", LP_VER_MJ, LP_VER_MN, LP_VER_BF, battery >> 8, ((current_charge_status) ? 129 : 32)); gfx_printf("APL %d.%d.%d | Battery: %d%% %c\n", APL_VER_MJ, APL_VER_MN, APL_VER_BF, battery >> 8, ((current_charge_status) ? 129 : 32));
RESETCOLOR; RESETCOLOR;
} }

View File

@@ -7,11 +7,13 @@
#define COLOR_GREY 0xFF888888 #define COLOR_GREY 0xFF888888
#define COLOR_DARKGREY 0xFF333333 #define COLOR_DARKGREY 0xFF333333
#define COLOR_ORANGE 0xFFFFA500 #define COLOR_ORANGE 0xFFFFA500
#define COLOR_GREEN 0xFF008000 #define COLOR_GREEN 0xFF00FF00
#define COLOR_VIOLET 0xFFEE82EE #define COLOR_VIOLET 0xFFEE82EE
#define COLOR_PURPLE 0xFF7C49EF
#define COLOR_BLUE 0xFF0000FF #define COLOR_BLUE 0xFF0000FF
#define COLOR_CYAN 0xFF00CCFF
#define COLOR_RED 0xFF0000FF #define COLOR_RED 0xFF0000FF
#define COLOR_YELLOW 0xFFFF0000 #define COLOR_YELLOW 0xFFFFFF00
#define COLORTORGB(color) (color & 0x00FFFFFF) #define COLORTORGB(color) (color & 0x00FFFFFF)
#define SETCOLOR(fg, bg) gfx_con_setcol(fg, 1, bg) #define SETCOLOR(fg, bg) gfx_con_setcol(fg, 1, bg)

View File

@@ -242,9 +242,9 @@ scriptFunction(funcWait){
scriptFunction(funcGetVer){ scriptFunction(funcGetVer){
int *arr = malloc(3 * sizeof(int)); int *arr = malloc(3 * sizeof(int));
arr[0] = LP_VER_MJ; arr[0] = APL_VER_MJ;
arr[1] = LP_VER_MN; arr[1] = APL_VER_MN;
arr[2] = LP_VER_BF; arr[2] = APL_VER_BF;
Vector_t res = vecFromArray(arr, 3, sizeof(int)); Vector_t res = vecFromArray(arr, 3, sizeof(int));
return newVar(IntArrayType, 1, .vectorType = res); return newVar(IntArrayType, 1, .vectorType = res);
} }

View File

@@ -25,19 +25,21 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "../cpr/cpr.h" #include "../apl/apl.h"
extern hekate_config h_cfg; extern hekate_config h_cfg;
enum { enum {
MainExplore = 0, MainExplore = 0,
DeleteBootFlags, DeleteBootFlags,
DeleteThemes,
FixClingWrap,
FixAIOUpdaterBoot,
FixArchiveBitA, FixArchiveBitA,
FixArchiveBitN, FixArchiveBitN,
// FixAll, // FixAll,
MainAMS,
DeleteThemes,
FixAMS_4200,
FixAMS_6900,
FixAMS_BD00,
MainConvenience, MainConvenience,
FixMacSpecialFolders, FixMacSpecialFolders,
MainOther, MainOther,
@@ -48,32 +50,33 @@ enum {
MainRebootRCM, MainRebootRCM,
// MainRebootNormal, // MainRebootNormal,
MainRebootHekate, MainRebootHekate,
MainRebootAMS,
}; };
MenuEntry_t mainMenuEntries[] = { MenuEntry_t mainMenuEntries[] = {
[MainExplore] = {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "-- Bootfixes --"}, [MainExplore] = {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "-- Behebe Start Probleme --"},
[DeleteBootFlags] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Disable automatic sysmodule startup"}, [DeleteBootFlags] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Automatisches starten der sysmodule deaktivieren"},
[DeleteThemes] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Delete installed themes"}, [FixArchiveBitA] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Behebe Archive Bit (alle Ordner ausser Nintendo)"},
[FixClingWrap] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix ClingWrap"}, [FixArchiveBitN] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Behebe Archive Bit (Nintendo Ordner)"},
[FixAIOUpdaterBoot] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix Switch-AiO-Updater update"},
[FixArchiveBitA] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix archive bit (all folders except nintendo)"},
[FixArchiveBitN] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fix archive bit (nintendo folder)"},
// [FixAll] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Try everything"}, // [FixAll] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Try everything"},
[MainConvenience] = {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "\n-- Convenience --"}, [MainAMS] = {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "\n-- Atmosphere Fehlercodes --"},
[FixMacSpecialFolders] = {.optionUnion = COLORTORGB(COLOR_ORANGE), .name = "Remove special folders created by Mac"}, [DeleteThemes] = {.optionUnion = COLORTORGB(COLOR_CYAN), .name = "Fix 0100000000001000 (Installiertes Theme)"},
[FixAMS_4200] = {.optionUnion = COLORTORGB(COLOR_CYAN), .name = "Fix 4200000000000010 (ldn_mitm)"},
[FixAMS_6900] = {.optionUnion = COLORTORGB(COLOR_CYAN), .name = "Fix 690000000000000D (sys-con)"},
[FixAMS_BD00] = {.optionUnion = COLORTORGB(COLOR_CYAN), .name = "Fix 010000000000BD00 (MissionControl)"},
[MainOther] = {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "\n-- Other --"}, [MainConvenience] = {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "\n-- Bequemlichkeit --"},
[MainViewStillNoBootInfo] = {.optionUnion = COLORTORGB(COLOR_YELLOW), .name = "My switch still does not boot"}, [FixMacSpecialFolders] = {.optionUnion = COLORTORGB(COLOR_ORANGE), .name = "Entferne spezielle MacOS Dateien"},
[MainViewCredits] = {.optionUnion = COLORTORGB(COLOR_YELLOW), .name = "Credits"},
[MainExit] = {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "\n-- Exit --"}, [MainOther] = {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "\n-- Sonstiges --"},
[MainPowerOff] = {.optionUnion = COLORTORGB(COLOR_VIOLET), .name = "Power off"}, [MainViewStillNoBootInfo] = {.optionUnion = COLORTORGB(COLOR_YELLOW), .name = "Meine Switch startet nicht mehr"},
[MainRebootRCM] = {.optionUnion = COLORTORGB(COLOR_VIOLET), .name = "Reboot to RCM"}, [MainViewCredits] = {.optionUnion = COLORTORGB(COLOR_YELLOW), .name = "Ueber"},
// [MainRebootNormal] = {.optionUnion = COLORTORGB(COLOR_VIOLET), .name = "Reboot normally"},
[MainRebootHekate] = {.optionUnion = COLORTORGB(COLOR_VIOLET), .name = "Reboot to bootloader/update.bin"}, [MainExit] = {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "\n-- Beenden --"},
[MainRebootAMS] = {.optionUnion = COLORTORGB(COLOR_VIOLET), .name = "Reboot to atmosphere/reboot_payload.bin"} [MainPowerOff] = {.optionUnion = COLORTORGB(COLOR_PURPLE), .name = "Ausschalten"},
[MainRebootRCM] = {.optionUnion = COLORTORGB(COLOR_PURPLE), .name = "Neustart in RCM-Modus"},
// [MainRebootNormal] = {.optionUnion = COLORTORGB(COLOR_VIOLET), .name = "Normaler Neustart"},
[MainRebootHekate] = {.optionUnion = COLORTORGB(COLOR_PURPLE), .name = "Neustart in hekate"}
// [MainBrowseSd] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Browse SD"}, // [MainBrowseSd] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Browse SD"},
@@ -102,10 +105,6 @@ void HandleSD(){
extern bool is_sd_inited; extern bool is_sd_inited;
extern int launch_payload(char *path); extern int launch_payload(char *path);
void RebootToAMS(){
launch_payload("sd:/atmosphere/reboot_payload.bin");
}
void RebootToHekate(){ void RebootToHekate(){
launch_payload("sd:/bootloader/update.bin"); launch_payload("sd:/bootloader/update.bin");
} }
@@ -130,17 +129,17 @@ void archBitHelperN(){
menuPaths mainMenuPaths[] = { menuPaths mainMenuPaths[] = {
[DeleteBootFlags] = m_entry_deleteBootFlags, [DeleteBootFlags] = m_entry_deleteBootFlags,
[DeleteThemes] = m_entry_deleteInstalledThemes, [DeleteThemes] = m_entry_deleteInstalledThemes,
[FixClingWrap] = m_entry_fixClingWrap,
[FixAIOUpdaterBoot] = m_entry_fixAIOUpdate,
[FixArchiveBitA] = archBitHelperA, [FixArchiveBitA] = archBitHelperA,
[FixArchiveBitN] = archBitHelperN, [FixArchiveBitN] = archBitHelperN,
[FixAMS_4200] = m_entry_fixAMSError_4200,
[FixAMS_6900] = m_entry_fixAMSError_6900,
[FixAMS_BD00] = m_entry_fixAMSError_BD00,
[FixMacSpecialFolders] = m_entry_fixMacSpecialFolders, [FixMacSpecialFolders] = m_entry_fixMacSpecialFolders,
// [FixAll] = m_entry_fixAll, // [FixAll] = m_entry_fixAll,
[MainViewStillNoBootInfo] = m_entry_stillNoBootInfo, [MainViewStillNoBootInfo] = m_entry_stillNoBootInfo,
[MainRebootHekate] = RebootToHekate, [MainRebootHekate] = RebootToHekate,
[MainRebootRCM] = reboot_rcm, [MainRebootRCM] = reboot_rcm,
[MainPowerOff] = power_off, [MainPowerOff] = power_off,
[MainRebootAMS] = RebootToAMS,
[MainViewCredits] = m_entry_ViewCredits, [MainViewCredits] = m_entry_ViewCredits,
}; };
@@ -151,7 +150,6 @@ void EnterMainMenu(){
sd_unmount(); sd_unmount();
// // -- Exit -- // // -- Exit --
mainMenuEntries[MainRebootAMS].hide = (!sd_get_card_mounted() || !FileExists("sd:/atmosphere/reboot_payload.bin"));
mainMenuEntries[MainRebootHekate].hide = (!sd_get_card_mounted() || !FileExists("sd:/bootloader/update.bin")); mainMenuEntries[MainRebootHekate].hide = (!sd_get_card_mounted() || !FileExists("sd:/bootloader/update.bin"));
mainMenuEntries[MainRebootRCM].hide = h_cfg.t210b01; mainMenuEntries[MainRebootRCM].hide = h_cfg.t210b01;

View File

@@ -325,11 +325,11 @@ void TakeScreenshot(){
return; return;
char *name, *path; char *name, *path;
const char basepath[] = "sd:/tegraexplorer/screenshots"; const char basepath[] = "sd:/APL/screenshots";
name = malloc(40); name = malloc(40);
s_printf(name, "Screenshot_%08X.bmp", get_tmr_us()); s_printf(name, "Screenshot_%08X.bmp", get_tmr_us());
f_mkdir("sd:/tegraexplorer"); f_mkdir("sd:/APL");
f_mkdir(basepath); f_mkdir(basepath);
path = CombinePaths(basepath, name); path = CombinePaths(basepath, name);
free(name); free(name);