mirror of
https://github.com/suchmememanyskill/TegraExplorer.git
synced 2024-11-22 20:06:43 +00:00
add crude firmware dumping script
This commit is contained in:
parent
d7ebd9fdbe
commit
3ab95dfd64
6 changed files with 202 additions and 10 deletions
77
scripts/FirmwareDump.te
Normal file
77
scripts/FirmwareDump.te
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
if (mountsys("SYSTEM")){
|
||||||
|
print("SYSTEM MOUNT FAIL")
|
||||||
|
exit()
|
||||||
|
}
|
||||||
|
|
||||||
|
a = readsave("bis:/save/8000000000000120")
|
||||||
|
b = a.readFile("/meta/imkvdb.arc")
|
||||||
|
print(b.len(), "\n")
|
||||||
|
|
||||||
|
c = ["BYTE[]", 0x09, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]
|
||||||
|
|
||||||
|
i = 1
|
||||||
|
#while (i + c.len() < b.len()){
|
||||||
|
# if (b.slice(i, 8).project() == c) {\
|
||||||
|
|
||||||
|
fuck = b.find(c)
|
||||||
|
if (fuck < 0) {
|
||||||
|
print("Not found")
|
||||||
|
exit()
|
||||||
|
}
|
||||||
|
|
||||||
|
i = fuck
|
||||||
|
|
||||||
|
d = b.slice(i + 8, 4).project()
|
||||||
|
ver = (d[3] << 24) | (d[2] << 16) | (d[1] << 8) | (d[0])
|
||||||
|
rev = (ver & ((1 << 16) - 1))
|
||||||
|
pat = ((ver >> 16) & ((1 << 4) - 1))
|
||||||
|
min = ((ver >> 20) & ((1 << 6) - 1))
|
||||||
|
maj = ((ver >> 26) & ((1 << 6) - 1))
|
||||||
|
print("")
|
||||||
|
println(ver.str(), " ", maj.str(), ".", min.str(), ".", pat.str(), ".", rev.str())
|
||||||
|
|
||||||
|
|
||||||
|
# i = i + 1
|
||||||
|
#}
|
||||||
|
|
||||||
|
|
||||||
|
mkdir("sd:/tegraexplorer")
|
||||||
|
mkdir("sd:/tegraexplorer/Firmware")
|
||||||
|
baseSdPath = "sd:/tegraexplorer/Firmware/" + maj.str() + "." + min.str() + "." + pat.str()
|
||||||
|
mkdir(baseSdPath)
|
||||||
|
|
||||||
|
contents = readdir("bis:/Contents/registered")
|
||||||
|
if (contents.result != 0){
|
||||||
|
println("Fail reading dir")
|
||||||
|
exit()
|
||||||
|
}
|
||||||
|
|
||||||
|
contents.files.foreach("x") {
|
||||||
|
fullPath = "bis:/Contents/registered/" + x
|
||||||
|
name = x
|
||||||
|
if (ncatype(fullPath) == 1){
|
||||||
|
name = name - 4 + ".cnmt.nca"
|
||||||
|
}
|
||||||
|
print("\r", x)
|
||||||
|
fullSdPath = baseSdPath + "/" + name
|
||||||
|
if (filecopy(fullPath, fullSdPath)){
|
||||||
|
println("\nErr during copy")
|
||||||
|
exit()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contents.folders.foreach("x") {
|
||||||
|
fullPath = "bis:/Contents/registered/" + x + "/00"
|
||||||
|
name = x
|
||||||
|
if (ncatype(fullPath) == 1){
|
||||||
|
name = name - 4 + ".cnmt.nca"
|
||||||
|
}
|
||||||
|
print("\r", x)
|
||||||
|
fullSdPath = baseSdPath + "/" + name
|
||||||
|
if (filecopy(fullPath, fullSdPath)){
|
||||||
|
println("\nErr during copy")
|
||||||
|
exit()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print("end")
|
|
@ -5,8 +5,18 @@
|
||||||
a="Hello world!\n"
|
a="Hello world!\n"
|
||||||
a.print()
|
a.print()
|
||||||
|
|
||||||
i=0
|
#i=0
|
||||||
while (i<10){
|
#while (i<10){
|
||||||
println(i)
|
# println(i)
|
||||||
i=i+1
|
# i=i+1
|
||||||
|
#}
|
||||||
|
|
||||||
|
a = readdir("sd:/tegraexplorer")
|
||||||
|
println(a.result)
|
||||||
|
println(a.files.len())
|
||||||
|
println(a.folders.len())
|
||||||
|
println(a.fileSizes.len())
|
||||||
|
|
||||||
|
a.files.foreach("b") {
|
||||||
|
println(b)
|
||||||
}
|
}
|
|
@ -255,8 +255,6 @@ Variable_t* callMemberFunctionDirect(Variable_t* var, char* memberName, Variable
|
||||||
void freeVariableInternal(Variable_t* referencedTarget) {
|
void freeVariableInternal(Variable_t* referencedTarget) {
|
||||||
switch (referencedTarget->variableType) {
|
switch (referencedTarget->variableType) {
|
||||||
case StringClass:
|
case StringClass:
|
||||||
if (referencedTarget->string.free)
|
|
||||||
gfx_printf("FREE STRING GETTING FREED AAA");
|
|
||||||
FREE(referencedTarget->string.value);
|
FREE(referencedTarget->string.value);
|
||||||
break;
|
break;
|
||||||
case StringArrayClass:
|
case StringArrayClass:
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
#include "intClass.h"
|
#include "intClass.h"
|
||||||
|
#include "StringClass.h"
|
||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <utils/sprintf.h>
|
||||||
|
|
||||||
IntClass_t createIntClass(s64 in) {
|
IntClass_t createIntClass(s64 in) {
|
||||||
IntClass_t a = { in };
|
IntClass_t a = { in };
|
||||||
|
@ -20,6 +22,12 @@ ClassFunction(printIntVariable) {
|
||||||
return &emptyClass;
|
return &emptyClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClassFunction(intToStr) {
|
||||||
|
char buff[64] = {0};
|
||||||
|
s_printf(buff, "%d", getIntValue(caller));
|
||||||
|
return newStringVariablePtr(CpyStr(buff), 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
#define IntOpFunction(name, op) ClassFunction(name) { s64 i1 = getIntValue(caller); s64 i2 = getIntValue(*args); return newIntVariablePtr((i1 op i2)); }
|
#define IntOpFunction(name, op) ClassFunction(name) { s64 i1 = getIntValue(caller); s64 i2 = getIntValue(*args); return newIntVariablePtr((i1 op i2)); }
|
||||||
|
|
||||||
IntOpFunction(addInt, +)
|
IntOpFunction(addInt, +)
|
||||||
|
@ -52,6 +60,7 @@ u8 oneIntArgInt[] = { IntClass };
|
||||||
ClassFunctionTableEntry_t intFunctions[] = {
|
ClassFunctionTableEntry_t intFunctions[] = {
|
||||||
{"print", printIntVariable, 0, 0},
|
{"print", printIntVariable, 0, 0},
|
||||||
{"not", notInt, 0, 0},
|
{"not", notInt, 0, 0},
|
||||||
|
{"str", intToStr, 0, 0},
|
||||||
IntOpFunctionEntry("+", addInt),
|
IntOpFunctionEntry("+", addInt),
|
||||||
IntOpFunctionEntry("-", minusInt),
|
IntOpFunctionEntry("-", minusInt),
|
||||||
IntOpFunctionEntry("*", multInt),
|
IntOpFunctionEntry("*", multInt),
|
||||||
|
|
|
@ -11,6 +11,10 @@
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
#include "../storage/mountmanager.h"
|
#include "../storage/mountmanager.h"
|
||||||
#include "../keys/keys.h"
|
#include "../keys/keys.h"
|
||||||
|
#include "../fs/readers/folderReader.h"
|
||||||
|
#include "../fs/fscopy.h"
|
||||||
|
#include <mem/heap.h>
|
||||||
|
#include "../keys/nca.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ClassFunction(stdIf) {
|
ClassFunction(stdIf) {
|
||||||
|
@ -122,6 +126,79 @@ ClassFunction(stdSetPixel) {
|
||||||
gfx_set_pixel_horz(args[0]->integer.value, args[1]->integer.value, color);
|
gfx_set_pixel_horz(args[0]->integer.value, args[1]->integer.value, color);
|
||||||
return &emptyClass;
|
return &emptyClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClassFunction(stdReadDir){
|
||||||
|
Vector_t dict = newVec(sizeof(Dict_t), 4);
|
||||||
|
Variable_t* resPtr = newIntVariablePtr(0);
|
||||||
|
Dict_t temp = {.name = CpyStr("result"), .var = resPtr};
|
||||||
|
vecAdd(&dict, temp);
|
||||||
|
|
||||||
|
Variable_t fileNamesArray = {.variableType = StringArrayClass, .solvedArray.vector = newVec(sizeof(char*), 0)};
|
||||||
|
Variable_t dirNamesArray = {.variableType = StringArrayClass, .solvedArray.vector = newVec(sizeof(char*), 0)};
|
||||||
|
Variable_t fileSizeArray = {.variableType = IntArrayClass, .solvedArray.vector = newVec(sizeof(s64), 0)};
|
||||||
|
|
||||||
|
DIR dir;
|
||||||
|
if ((resPtr->integer.value = f_opendir(&dir, args[0]->string.value))){
|
||||||
|
Variable_t ret = {.variableType = DictionaryClass, .dictionary.vector = dict};
|
||||||
|
return copyVariableToPtr(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILINFO fno;
|
||||||
|
while (!(resPtr->integer.value = f_readdir(&dir, &fno)) && fno.fname[0]){
|
||||||
|
char *name = CpyStr(fno.fname);
|
||||||
|
if (fno.fattrib & AM_DIR){
|
||||||
|
vecAdd(&dirNamesArray.solvedArray.vector, name);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vecAdd(&fileNamesArray.solvedArray.vector, name);
|
||||||
|
s64 size = fno.fsize;
|
||||||
|
vecAdd(&fileSizeArray.solvedArray.vector, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f_closedir(&dir);
|
||||||
|
|
||||||
|
temp.name = CpyStr("files");
|
||||||
|
temp.var = copyVariableToPtr(fileNamesArray);
|
||||||
|
vecAdd(&dict, temp);
|
||||||
|
|
||||||
|
temp.name = CpyStr("folders");
|
||||||
|
temp.var = copyVariableToPtr(dirNamesArray);
|
||||||
|
vecAdd(&dict, temp);
|
||||||
|
|
||||||
|
temp.name = CpyStr("fileSizes");
|
||||||
|
temp.var = copyVariableToPtr(fileSizeArray);
|
||||||
|
vecAdd(&dict, temp);
|
||||||
|
|
||||||
|
Variable_t ret = {.variableType = DictionaryClass, .dictionary.vector = dict};
|
||||||
|
return copyVariableToPtr(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassFunction(stdFileCopy){
|
||||||
|
ErrCode_t e = FileCopy(args[0]->string.value, args[1]->string.value, 0);
|
||||||
|
return newIntVariablePtr(e.err);
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassFunction(stdMkdir){
|
||||||
|
return newIntVariablePtr(f_mkdir(args[0]->string.value));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Broken????
|
||||||
|
ClassFunction(stdGetMemUsage){
|
||||||
|
heap_monitor_t mon;
|
||||||
|
heap_monitor(&mon, false);
|
||||||
|
Dict_t a = {.name = CpyStr("used"), .var = newIntVariablePtr((s64)mon.used)};
|
||||||
|
Dict_t b = {.name = CpyStr("total"), .var = newIntVariablePtr((s64)mon.total)};
|
||||||
|
Variable_t ret = {.variableType = DictionaryClass, .dictionary.vector = newVec(sizeof(Dict_t), 2)};
|
||||||
|
vecAdd(&ret, a);
|
||||||
|
vecAdd(&ret, b);
|
||||||
|
return copyVariableToPtr(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassFunction(stdGetNcaType){
|
||||||
|
int type = GetNcaType(args[0]->string.value);
|
||||||
|
return newIntVariablePtr(type);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
ClassFunction(stdMountSysmmc){
|
ClassFunction(stdMountSysmmc){
|
||||||
return newIntVariablePtr(0);
|
return newIntVariablePtr(0);
|
||||||
|
@ -132,12 +209,29 @@ ClassFunction(stdMountSave){
|
||||||
ClassFunction(stdSetPixel) {
|
ClassFunction(stdSetPixel) {
|
||||||
return newIntVariablePtr(0);
|
return newIntVariablePtr(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClassFunction(stdReadDir){
|
||||||
|
return newIntVariablePtr(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassFunction(stdFileCopy){
|
||||||
|
return newIntVariablePtr(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassFunction(stdMkdir){
|
||||||
|
return newIntVariablePtr(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassFunction(stdGetMemUsage) {
|
||||||
|
return newIntVariablePtr(0);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
u8 oneIntoneFunction[] = { IntClass, FunctionClass };
|
u8 oneIntoneFunction[] = { IntClass, FunctionClass };
|
||||||
u8 doubleFunctionClass[] = { FunctionClass, FunctionClass };
|
u8 doubleFunctionClass[] = { FunctionClass, FunctionClass };
|
||||||
u8 oneStringArgStd[] = {StringClass};
|
u8 oneStringArgStd[] = {StringClass};
|
||||||
u8 threeIntsStd[] = { IntClass, IntClass, IntClass };
|
u8 threeIntsStd[] = { IntClass, IntClass, IntClass };
|
||||||
|
u8 twoStringArgStd[] = {StringClass, StringClass};
|
||||||
|
|
||||||
ClassFunctionTableEntry_t standardFunctionDefenitions[] = {
|
ClassFunctionTableEntry_t standardFunctionDefenitions[] = {
|
||||||
{"if", stdIf, 2, oneIntoneFunction},
|
{"if", stdIf, 2, oneIntoneFunction},
|
||||||
|
@ -150,6 +244,11 @@ ClassFunctionTableEntry_t standardFunctionDefenitions[] = {
|
||||||
{"break", stdBreak, 0, 0},
|
{"break", stdBreak, 0, 0},
|
||||||
{"dict", stdDict, 0, 0},
|
{"dict", stdDict, 0, 0},
|
||||||
{"setpixel", stdSetPixel, 3, threeIntsStd},
|
{"setpixel", stdSetPixel, 3, threeIntsStd},
|
||||||
|
{"readdir", stdReadDir, 1, oneStringArgStd},
|
||||||
|
{"filecopy", stdFileCopy, 2, twoStringArgStd},
|
||||||
|
{"mkdir", stdMkdir, 1, oneStringArgStd},
|
||||||
|
{"memory", stdGetMemUsage, 0, 0},
|
||||||
|
{"ncatype", stdGetNcaType, 1, oneStringArgStd},
|
||||||
};
|
};
|
||||||
|
|
||||||
ClassFunctionTableEntry_t* searchStdLib(char* funcName) {
|
ClassFunctionTableEntry_t* searchStdLib(char* funcName) {
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#include <mem/heap.h>
|
#include <mem/heap.h>
|
||||||
#include "../fs/menus/filemenu.h"
|
#include "../fs/menus/filemenu.h"
|
||||||
|
|
||||||
//#define INCLUDE_BUILTIN_SCRIPTS 1
|
#define INCLUDE_BUILTIN_SCRIPTS 1
|
||||||
|
|
||||||
#ifdef INCLUDE_BUILTIN_SCRIPTS
|
#ifdef INCLUDE_BUILTIN_SCRIPTS
|
||||||
#include "../script/builtin.h"
|
#include "../script/builtin.h"
|
||||||
|
@ -121,11 +121,10 @@ void ViewCredits(){
|
||||||
if (hidRead()->r)
|
if (hidRead()->r)
|
||||||
gfx_printf("%k\"I'm not even sure if it works\" - meme", COLOR_ORANGE);
|
gfx_printf("%k\"I'm not even sure if it works\" - meme", COLOR_ORANGE);
|
||||||
|
|
||||||
/* Leaving this here for my debugging needs :)
|
|
||||||
heap_monitor_t a = {0};
|
heap_monitor_t a = {0};
|
||||||
heap_monitor(&a, false);
|
heap_monitor(&a, false);
|
||||||
gfx_printf("\nUsed: %d\nTotal: %d\n", a.used, a.total);
|
gfx_printf("\nUsed: %d\nTotal: %d\n", a.used, a.total);
|
||||||
*/
|
|
||||||
|
|
||||||
hidWait();
|
hidWait();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue