Compare commits
1 Commits
Lockpick-1
...
save-close
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
520cf179cc |
4
Makefile
4
Makefile
@@ -10,8 +10,8 @@ include $(DEVKITARM)/base_rules
|
||||
|
||||
IPL_LOAD_ADDR := 0x40008000
|
||||
LPVERSION_MAJOR := 4
|
||||
LPVERSION_MINOR := 2
|
||||
LPVERSION_BUGFX := 0
|
||||
LPVERSION_MINOR := 1
|
||||
LPVERSION_BUGFX := 1
|
||||
LPVERSION := \"$(LPVERSION_MAJOR).$(LPVERSION_MINOR).$(LPVERSION_BUGFX)\"
|
||||
|
||||
################################################################################
|
||||
|
||||
@@ -299,14 +299,14 @@ void save_free_contexts(save_ctx_t *ctx) {
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool save_flush(save_ctx_t *ctx) {
|
||||
if (!save_cached_storage_flush(ctx->core_data_ivfc_storage.data_level)) {
|
||||
EPRINTF("Failed to flush cached storage!");
|
||||
}
|
||||
if (save_remap_storage_write(&ctx->meta_remap_storage, ctx->fat_storage, ctx->header.layout.fat_offset, ctx->header.layout.fat_size) != ctx->header.layout.fat_size) {
|
||||
EPRINTF("Failed to write meta remap storage!");
|
||||
}
|
||||
|
||||
if (ctx->header.layout.version >= VERSION_DISF_5) {
|
||||
if (ctx->header.layout.version < VERSION_DISF_5) {
|
||||
if (!save_cached_storage_flush(ctx->core_data_ivfc_storage.data_level)) {
|
||||
EPRINTF("Failed to flush cached storage!");
|
||||
}
|
||||
if (save_remap_storage_write(&ctx->meta_remap_storage, ctx->fat_storage, ctx->header.layout.fat_offset, ctx->header.layout.fat_size) != ctx->header.layout.fat_size) {
|
||||
EPRINTF("Failed to write meta remap storage!");
|
||||
}
|
||||
} else {
|
||||
if (!save_cached_storage_flush(ctx->fat_ivfc_storage.data_level)) {
|
||||
EPRINTF("Failed to flush cached storage!");
|
||||
}
|
||||
|
||||
@@ -1,213 +1,69 @@
|
||||
#REQUIRE KEYS
|
||||
is=["8000000000000120","8000000000000053","8000000000000000"]
|
||||
is=["8000000000000120","8000000000000000"]
|
||||
p=println
|
||||
pr=print
|
||||
pe={pause() exit()}
|
||||
wait={t=timer()while(timer()<(t+tw)){print("Wait for",(t+tw-timer()/1000),"seconds \r")}}
|
||||
p("System wiper\n")
|
||||
op=["Exit","Wipe sysmmc"].copy()
|
||||
if (emu()){op+"Wipe emummc"}
|
||||
r=menu(op,0)clear()
|
||||
if(r==0){exit()}
|
||||
if(r==1){
|
||||
mount=mountsys
|
||||
selected_target = "sysmmc"
|
||||
}
|
||||
if(r==2){
|
||||
mount=mountemu
|
||||
selected_target = "emummc"
|
||||
}
|
||||
if(r==1){p("Selected sysmmc")mount=mountsys}
|
||||
if(r==2){p("Selected emummc")mount=mountemu}
|
||||
if(mount("SYSTEM")){p("Mount failed!")pe()}
|
||||
clear()
|
||||
|
||||
border = {
|
||||
setpixels(0,0,1279,19,border_color)
|
||||
setpixels(0,700,1279,719,border_color)
|
||||
setpixels(0,20,19,699,border_color)
|
||||
setpixels(1260,20,1279,699,border_color)
|
||||
}
|
||||
|
||||
i = 10
|
||||
x_pos = 10
|
||||
y_pos = 12
|
||||
|
||||
["WARNING!!!",
|
||||
"",
|
||||
"Do you really want to wipe your system?",
|
||||
"This will remove:",
|
||||
"- Your Save Data",
|
||||
"- Your Game Data",
|
||||
"- Your User Data",
|
||||
"",
|
||||
"Restoring an emmc backup is always preferable over wiping.",
|
||||
"Please only use this as a last resort.",
|
||||
"This script is intended to be used in aid of unbricking."
|
||||
].foreach("line")
|
||||
{
|
||||
printpos(x_pos, y_pos)
|
||||
y_pos = y_pos + 1
|
||||
print(line)
|
||||
}
|
||||
|
||||
if (!fsexists("bis:/save/"+is[1]))
|
||||
{
|
||||
[
|
||||
"",
|
||||
"DeviceSettings save (8000000000000053) is missing!!!",
|
||||
"This script cannot recover lost battery calibration data.",
|
||||
"The system will initialize with default values.",
|
||||
"These values are unsafe for lite systems!"
|
||||
].foreach("line")
|
||||
{
|
||||
printpos(x_pos, y_pos)
|
||||
y_pos = y_pos + 1
|
||||
print(line)
|
||||
}
|
||||
}
|
||||
|
||||
time = 5000
|
||||
y_pos = y_pos + 4
|
||||
|
||||
while (i > 0)
|
||||
{
|
||||
i = i - 1
|
||||
|
||||
if (i % 2 == 0){
|
||||
border_color = 0xFF0000
|
||||
}.else() {
|
||||
border_color = 0x000000
|
||||
}
|
||||
|
||||
border()
|
||||
sleep(500)
|
||||
time = time - 500
|
||||
printpos(x_pos, y_pos)
|
||||
print("Waiting for", time / 1000, "seconds")
|
||||
}
|
||||
|
||||
printpos(x_pos, y_pos)
|
||||
print("Ready to wipe", selected_target, " ")
|
||||
y_pos = y_pos + 1
|
||||
printpos(x_pos, y_pos)
|
||||
print("Press the power button to wipe, any other key to exit")
|
||||
|
||||
result = pause(0x70F000F)
|
||||
|
||||
if (!result.power)
|
||||
{
|
||||
exit()
|
||||
}
|
||||
|
||||
clear()
|
||||
color(0xFF0000)
|
||||
p("Are you sure you want to wipe everything?\nThis includes:\n- Saves\n- Game Data\n- All other data on the system\n\nUse this only as a last resort!")
|
||||
color(0xFFFF00)
|
||||
tw=10000
|
||||
wait()
|
||||
color(0x0000FF)
|
||||
p("Press power to wipe, any other key to exit")a=pause()if(!a.power){exit()}clear()
|
||||
color(0xFF0000)
|
||||
pr("Deleting system saves... ")
|
||||
f=readdir("bis:/save")
|
||||
if(f.folders.len()!=0){p("Folders in save dir???")pe()}
|
||||
f.files.foreach("x"){if(!is.contains(x)){if(delfile("bis:/save/"+x)){p("File deletion failed: ", x)pe()}}}
|
||||
pr("Done!\nSetting up indexer save...")
|
||||
|
||||
if(fsexists("bis:/save/"+is[0]))
|
||||
{
|
||||
ba0=["BYTE[]",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
|
||||
ba120=["BYTE[]",0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x80]
|
||||
ba53=["BYTE[]",0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x80]
|
||||
imen=["BYTE[]",0x49,0x4D,0x45,0x4E,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00]
|
||||
|
||||
idb=["BYTE[]",0x49,0x4D,0x4B,0x56,0x00,0x00,0x00,0x00].copy() # imkv
|
||||
|
||||
skip53 = !fsexists("bis:/save/"+is[1])
|
||||
|
||||
if(skip53)
|
||||
{
|
||||
idb.add(0x01) # 0x01 imen
|
||||
pr("053 save not found!!! Skip indexing it...")
|
||||
}.else()
|
||||
{
|
||||
idb.add(0x02) # 0x02 imens
|
||||
}
|
||||
|
||||
idb.add(0x00)
|
||||
idb.add(0x00)
|
||||
idb.add(0x00)
|
||||
|
||||
if(!skip53)
|
||||
{
|
||||
# 53 save
|
||||
s=getfilesize("bis:/save/"+is[1])
|
||||
s1=s&0xFF
|
||||
s2=(s>>8)&0xFF
|
||||
s3=(s>>16)&0xFF
|
||||
s4=(s>>24)&0xFF
|
||||
idb.addrange(imen)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba53)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba53)
|
||||
idb.add(s1)
|
||||
idb.add(s2)
|
||||
idb.add(s3)
|
||||
idb.add(s4)
|
||||
idb.add(0x00)
|
||||
idb.add(0x00)
|
||||
idb.add(0x00)
|
||||
idb.add(0x00)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
}
|
||||
|
||||
# 120 save
|
||||
s=getfilesize("bis:/save/"+is[0])
|
||||
s1=s&0xFF
|
||||
s2=(s>>8)&0xFF
|
||||
s3=(s>>16)&0xFF
|
||||
s4=(s>>24)&0xFF
|
||||
idb.addrange(imen)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba120)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba120)
|
||||
idb.add(s1)
|
||||
idb.add(s2)
|
||||
idb.add(s3)
|
||||
idb.add(s4)
|
||||
idb.add(0x00)
|
||||
idb.add(0x00)
|
||||
idb.add(0x00)
|
||||
idb.add(0x00)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
|
||||
idxs=readsave("bis:/save/"+is[2])
|
||||
if(idxs.resize("/imkvdb.arc",idb.len())){p("imkvdb resize failed")pe()}
|
||||
if(idxs.write("/imkvdb.arc",idb)){p("imkvdb write failed")pe()}
|
||||
if(idxs.resize("/lastPublishedId",ba0.len())){p("lastPublishedId resize failed")pe()}
|
||||
if(idxs.write("/lastPublishedId",ba0)){p("lastPublishedId write failed")pe()}
|
||||
if(idxs.commit()){p("Indexer save commit failed")pe()}
|
||||
idxs=0
|
||||
pr("Done!")
|
||||
}.else()
|
||||
{
|
||||
pr("120 save not found!!! Skip editing indexer save!!!")
|
||||
}
|
||||
|
||||
pr("\nDeleting user dirs...")ud=["Album","Contents","save","saveMeta","temp"]
|
||||
s=getfilesize("bis:/save/"+is[0])
|
||||
ba0=["BYTE[]",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
|
||||
ba120=["BYTE[]",0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x80]
|
||||
s1=s&0xFF
|
||||
s2=(s>>8)&0xFF
|
||||
s3=(s>>16)&0xFF
|
||||
s4=(s>>24)&0xFF
|
||||
idb=["BYTE[]",0x49,0x4D,0x4B,0x56,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x49,0x4D,0x45,0x4E,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00].copy()
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba120)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba120)
|
||||
idb.add(s1)
|
||||
idb.add(s2)
|
||||
idb.add(s3)
|
||||
idb.add(s4)
|
||||
idb.add(0x00)
|
||||
idb.add(0x00)
|
||||
idb.add(0x00)
|
||||
idb.add(0x00)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idb.addrange(ba0)
|
||||
idxs=readsave("bis:/save/"+is[1])
|
||||
if(idxs.resize("/imkvdb.arc",idb.len())){p("imkvdb resize failed")pe()}
|
||||
if(idxs.write("/imkvdb.arc",idb)){p("imkvdb write failed")pe()}
|
||||
if(idxs.resize("/lastPublishedId",ba0.len())){p("lastPublishedId resize failed")pe()}
|
||||
if(idxs.write("/lastPublishedId",ba0)){p("lastPublishedId write failed")pe()}
|
||||
if(idxs.commit()){p("Indexer save commit failed")pe()}
|
||||
idxs=0
|
||||
pr("Done!\nDeleting user dirs...")ud=["Album","Contents","save","saveMeta","temp"]
|
||||
if(mount("USER")){p("Mount failed!")pe()}
|
||||
ud.foreach("x"){pr("\n"+x,"")if(deldir("bis:/"+x)){p("Dir deletion failed")pe()}mkdir("bis:/"+x)}
|
||||
mkdir("bis:/Contents/placehld")mkdir("bis:/Contents/registered")
|
||||
|
||||
@@ -278,6 +278,7 @@ void freeVariableInternal(Variable_t* referencedTarget) {
|
||||
save_free_contexts(&referencedTarget->save->saveCtx);
|
||||
f_close(&referencedTarget->save->saveFile);
|
||||
FREE(referencedTarget->save);
|
||||
gfx_printf("Save closed\n");
|
||||
#endif // !WIN32
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -232,7 +232,7 @@ u8 nextToken(char** inPtr, void** val) {
|
||||
if (!memcmp(t.strToken, in, (t.strToken[1] == '\0') ? 1 : 2)) {
|
||||
//gfx_printf("Token: '%s'\n", t.strToken);
|
||||
ret = Token_Token;
|
||||
*val = (void*)t.token;
|
||||
*val = t.token;
|
||||
|
||||
if (t.strToken[1] != '\0')
|
||||
in++;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#include "scriptError.h"
|
||||
#include "compat.h"
|
||||
#include <stdarg.h>
|
||||
#include "../hid/hid.h"
|
||||
|
||||
s64 scriptCurrentLine;
|
||||
u8 scriptLastError = 0;
|
||||
|
||||
@@ -46,19 +46,6 @@ ClassFunction(stdIf) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Takes [int]. Returns empty.
|
||||
ClassFunction(stdSleep)
|
||||
{
|
||||
s64 value = getIntValue(args[0]);
|
||||
|
||||
if (value)
|
||||
{
|
||||
msleep(value);
|
||||
}
|
||||
|
||||
return &emptyClass;
|
||||
}
|
||||
|
||||
// Takes [function, function]. Returns empty. Works by evaling the first function and running the 2nd if true.
|
||||
ClassFunction(stdWhile) {
|
||||
Variable_t* result = eval(args[0]->function.function.operations.data, args[0]->function.function.operations.count, 1);
|
||||
@@ -579,7 +566,6 @@ ClassFunctionTableEntry_t standardFunctionDefenitions[] = {
|
||||
{"menu", stdMenuFull, 3, menuArgsStd},
|
||||
{"menu", stdMenuFull, 2, menuArgsStd},
|
||||
{"power", stdPower, 1, threeIntsStd},
|
||||
{"sleep", stdSleep, 1, threeIntsStd},
|
||||
|
||||
// System
|
||||
{"mountsys", stdMountSysmmc, 1, twoStringArgStd},
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
#include <string.h>
|
||||
#include "../fs/fscopy.h"
|
||||
#include "../utils/utils.h"
|
||||
#include <display/di.h>
|
||||
|
||||
extern sdmmc_storage_t sd_storage;
|
||||
extern bool is_sd_inited;
|
||||
|
||||
Reference in New Issue
Block a user