From 1078e0aecc522ac6ecba77b78c02c55c5854c6e6 Mon Sep 17 00:00:00 2001 From: JoseAaronLopezGarcia Date: Mon, 10 Jul 2023 22:33:00 +0200 Subject: [PATCH] fixed file browser --- common/include/globals.h | 2 +- core/compat/vitapops/main.c | 19 +++-- core/compat/vitapops/popcorn.c | 6 +- core/compat/vitapops/syspatch.c | 76 +++++++++++++++----- core/popcorn/main.c | 1 + extras/menus/arkMenu/src/browser.cpp | 5 +- extras/menus/arkMenu/src/browser_entries.cpp | 4 +- extras/menus/arkMenu/src/common.cpp | 2 +- extras/menus/provsh/main.c | 40 ++++++++++- loader/live/kernel/psxloader/main.c | 3 + 10 files changed, 119 insertions(+), 39 deletions(-) diff --git a/common/include/globals.h b/common/include/globals.h index 9deadfea3..bf1ffc517 100644 --- a/common/include/globals.h +++ b/common/include/globals.h @@ -56,7 +56,7 @@ #define ARK_MAJOR_VERSION 4 #define ARK_MINOR_VERSION 20 #define ARK_MICRO_VERSION 60 -#define ARK_REVISION 6 +#define ARK_REVISION 7 #define MAX_FLASH0_SIZE 0x32000 /* diff --git a/core/compat/vitapops/main.c b/core/compat/vitapops/main.c index 4d58a5e34..184965fa7 100644 --- a/core/compat/vitapops/main.c +++ b/core/compat/vitapops/main.c @@ -22,6 +22,8 @@ STMOD_HANDLER previous = NULL; ARKConfig* ark_config = NULL; extern void ARKVitaPopsOnModuleStart(SceModule2* mod); +extern int (*prev_start)(int modid, SceSize argsize, void * argp, int * modstatus, SceKernelSMOption * opt); +extern int StartModuleHandler(int modid, SceSize argsize, void * argp, int * modstatus, SceKernelSMOption * opt); // Flush Instruction and Data Cache void flushCache() @@ -53,13 +55,12 @@ static void processArkConfig(){ // Boot Time Entry Point int module_start(SceSize args, void * argp) { - /* + #ifdef DEBUG _sw(0x44000000, 0xBC800100); setScreenHandler(©PSPVram); initVitaPopsVram(); - colorDebug(0xFF); - _sw(0,0); - */ + colorDebug(0xFF00); + #endif // set rebootex for VitaPOPS sctrlHENSetRebootexOverride(rebootbuffer_vitapops); @@ -69,19 +70,15 @@ int module_start(SceSize args, void * argp) // set screen handler for color debugging setScreenHandler(&pops_vram_handler); #endif - - /* - _sw(0x44000000, 0xBC800100); - setScreenHandler(©PSPVram); - initVitaPopsVram(); - colorDebug(0xFF00); - */ // copy configuration processArkConfig(); // Register Module Start Handler previous = sctrlHENSetStartModuleHandler(ARKVitaPopsOnModuleStart); + + // Register custom start module + prev_start = sctrlSetStartModuleExtra(StartModuleHandler); // Return Success return 0; diff --git a/core/compat/vitapops/popcorn.c b/core/compat/vitapops/popcorn.c index 130383191..5cf711927 100644 --- a/core/compat/vitapops/popcorn.c +++ b/core/compat/vitapops/popcorn.c @@ -250,10 +250,8 @@ int patchPopsMan(SceModule2 *mod) { original = 1; int (* SetCompiledSdkVersion)() = (void *)sctrlHENFindFunction("sceSystemMemoryManager", "SysMemUserForUser", 0x358CA1BB); - if (!SetCompiledSdkVersion) - return 1; - - SetCompiledSdkVersion(0x06060110); + if (SetCompiledSdkVersion) + SetCompiledSdkVersion(0x06060110); u32 text_addr = mod->text_addr; diff --git a/core/compat/vitapops/syspatch.c b/core/compat/vitapops/syspatch.c index 75fa74295..82af48677 100644 --- a/core/compat/vitapops/syspatch.c +++ b/core/compat/vitapops/syspatch.c @@ -115,18 +115,6 @@ int sceKernelResumeThreadPatched(SceUID thid) { void ARKVitaPopsOnModuleStart(SceModule2 * mod){ static int booted = 0; - - if (DisplaySetFrameBuf){ - static int screen_init = 0; - if (!screen_init){ - setScreenHandler(©PSPVram); - initVitaPopsVram(); - initScreen(DisplaySetFrameBuf); - screen_init = 1; - } - cls(); - PRTSTR1("mod: %s", mod->modname); - } // Patch display in PSX exploits if(strcmp(mod->modname, "sceDisplay_Service") == 0) { @@ -142,11 +130,25 @@ void ARKVitaPopsOnModuleStart(SceModule2 * mod){ patchKermitPeripheral(&_ktbl); goto flush; } + /* + if (strcmp(mod->modname, "sceIOFileManager") == 0){ + // remove k1 checks -> move $a2, 0 + _sw(0x00003021, 0x8805769c); // IoRead + _sw(0x00003021, 0x880577b0); // IoWrite + goto flush; + } + + if (strcmp(mod->modname, "sceLoadExec") == 0){ + // patch IO checks + _sw(JR_RA, mod->text_addr + 0x0000222C); + _sw(LI_V0(0), mod->text_addr + 0x00002230); + goto flush; + } + */ /* if (strcmp(mod->modname, "scePops_Manager") == 0){ patchPopsMan(mod); - goto flush; } if (strcmp(mod->modname, "pops") == 0) { @@ -156,6 +158,7 @@ void ARKVitaPopsOnModuleStart(SceModule2 * mod){ } */ + /* if (strcmp(mod->modname, "CWCHEATPRX") == 0) { if (sceKernelInitKeyConfig() == PSP_INIT_KEYCONFIG_POPS) { hookImportByNID(mod, "ThreadManForKernel", 0x9944F31F, sceKernelSuspendThreadPatched); @@ -163,6 +166,7 @@ void ARKVitaPopsOnModuleStart(SceModule2 * mod){ goto flush; } } + */ // Boot Complete Action not done yet if(booted == 0) @@ -171,12 +175,12 @@ void ARKVitaPopsOnModuleStart(SceModule2 * mod){ if(isSystemBooted()) { // Set fake framebuffer so that cwcheat can be displayed - DisplaySetFrameBuf((void *)fake_vram, PSP_SCREEN_LINE, PSP_DISPLAY_PIXEL_FORMAT_8888, PSP_DISPLAY_SETBUF_NEXTFRAME); - memset((void *)fake_vram, 0, SCE_PSPEMU_FRAMEBUFFER_SIZE); + //DisplaySetFrameBuf((void *)fake_vram, PSP_SCREEN_LINE, PSP_DISPLAY_PIXEL_FORMAT_8888, PSP_DISPLAY_SETBUF_NEXTFRAME); + //memset((void *)fake_vram, 0, SCE_PSPEMU_FRAMEBUFFER_SIZE); // Start control poller thread so we can exit via combo on PS1 games if (sceKernelInitApitype() == 0x144){ - startControlPoller(); + //startControlPoller(); } // Boot Complete Action done @@ -193,3 +197,43 @@ void ARKVitaPopsOnModuleStart(SceModule2 * mod){ // Forward to previous Handler if(previous) previous(mod); } + +int (*prev_start)(int modid, SceSize argsize, void * argp, int * modstatus, SceKernelSMOption * opt) = NULL; +int StartModuleHandler(int modid, SceSize argsize, void * argp, int * modstatus, SceKernelSMOption * opt){ + + SceModule2* mod = (SceModule2*) sceKernelFindModuleByUID(modid); + + if (DisplaySetFrameBuf){ + static int screen_init = 0; + if (!screen_init){ + setScreenHandler(©PSPVram); + initVitaPopsVram(); + initScreen(DisplaySetFrameBuf); + screen_init = 1; + } + cls(); + PRTSTR1("mod: %s", mod->modname); + } + + /* + static SceModule2* popsman = NULL; + + if (mod){ + + if (strcmp(mod->modname, "scePops_Manager") == 0){ + //patchPopsMan(mod); + popsman = mod; + } + + else if (strcmp(mod->modname, "sceKernelLibrary") == 0 && popsman){ + int modid = sceKernelLoadModule("flash0:/kd/ark_popcorn.prx", 0, 0); + sceKernelStartModule(modid, 0, 0, 0, 0); + } + + } + */ + + // forward to previous or default StartModule + if (prev_start) return prev_start(modid, argsize, argp, modstatus, opt); + return -1; +} \ No newline at end of file diff --git a/core/popcorn/main.c b/core/popcorn/main.c index 0e146b549..ecd1bb06f 100644 --- a/core/popcorn/main.c +++ b/core/popcorn/main.c @@ -1139,6 +1139,7 @@ int module_start(SceSize args, void* argp) #ifdef DEBUG printk("pops disc id: %s\r\n", g_DiscID); #endif + g_pspFwVersion = sceKernelDevkitVersion(); getKeys(); diff --git a/extras/menus/arkMenu/src/browser.cpp b/extras/menus/arkMenu/src/browser.cpp index 574e5ac0b..04d7988d8 100644 --- a/extras/menus/arkMenu/src/browser.cpp +++ b/extras/menus/arkMenu/src/browser.cpp @@ -514,9 +514,10 @@ void Browser::refreshDirs(const char* retry){ vector files; pspMsPrivateDirent *pri_dirent = (pspMsPrivateDirent*)malloc(sizeof(pspMsPrivateDirent)); + memset(pri_dirent, 0, sizeof(pspMsPrivateDirent)); pri_dirent->size = sizeof(pspMsPrivateDirent); dit.d_private = (void*)pri_dirent; - static int bufid = 0; + while ((sceIoDread(dir, &dit)) > 0){ printf("got entry: %s -> %s\n", dit.d_name, pri_dirent); @@ -889,6 +890,7 @@ void Browser::recursiveFolderDelete(string path){ memset(&entry, 0, sizeof(SceIoDirent)); pspMsPrivateDirent *pri_dirent = (pspMsPrivateDirent*)malloc(sizeof(pspMsPrivateDirent)); + memset(pri_dirent, 0, sizeof(pspMsPrivateDirent)); pri_dirent->size = sizeof(pspMsPrivateDirent); entry.d_private = (void*)pri_dirent; @@ -943,6 +945,7 @@ long Browser::recursiveSize(string path){ memset(&entry, 0, sizeof(SceIoDirent)); pspMsPrivateDirent *pri_dirent = (pspMsPrivateDirent*)malloc(sizeof(pspMsPrivateDirent)); + memset(pri_dirent, 0, sizeof(pspMsPrivateDirent)); pri_dirent->size = sizeof(pspMsPrivateDirent); entry.d_private = (void*)pri_dirent; diff --git a/extras/menus/arkMenu/src/browser_entries.cpp b/extras/menus/arkMenu/src/browser_entries.cpp index 6b6e23ed9..4acf50ac9 100644 --- a/extras/menus/arkMenu/src/browser_entries.cpp +++ b/extras/menus/arkMenu/src/browser_entries.cpp @@ -62,11 +62,11 @@ BrowserFile::~BrowserFile(){ } void BrowserFile::setShortName(string shortname){ - if (shortname.size() > 0){ + this->shortname = ""; + if (shortname.size() > 0 && shortname[0] != 0x14){ if (this->name.size() < shortname.size()){ this->path = this->parent + shortname; this->name = shortname; - this->shortname = ""; } else { this->shortname = shortname; diff --git a/extras/menus/arkMenu/src/common.cpp b/extras/menus/arkMenu/src/common.cpp index fcf9fec03..61c1e3873 100644 --- a/extras/menus/arkMenu/src/common.cpp +++ b/extras/menus/arkMenu/src/common.cpp @@ -522,7 +522,7 @@ void common::setThemePath(char* path){ } bool common::isFolder(SceIoDirent* dit){ - return (dit->d_stat.st_attr == FIO_SO_IFDIR || dit->d_stat.st_attr == 48 || dit->d_stat.st_attr == 22); + return FIO_SO_ISDIR(dit->d_stat.st_attr) || FIO_S_ISDIR(dit->d_stat.st_mode); } bool common::fileExists(const std::string &path){ diff --git a/extras/menus/provsh/main.c b/extras/menus/provsh/main.c index 13ebe623a..4591c2762 100644 --- a/extras/menus/provsh/main.c +++ b/extras/menus/provsh/main.c @@ -127,6 +127,42 @@ __attribute__((noinline)) void PSXFlashScreen(u32 color) while(vram < vramend) *(u16*)(vram += 2) = color16; } +void testIo(){ + static char tmp[256]; + int res; + + int fd = sceIoOpen("ms0:/iolog.txt", PSP_O_WRONLY|PSP_O_CREAT|PSP_O_TRUNC, 0777); + + res = sceIoOpen("ms0:/__test__.txt", PSP_O_WRONLY|PSP_O_CREAT|PSP_O_TRUNC, 0777); + sceIoClose(res); + sprintf(tmp, "sceIoOpen: %p\n", res); + sceIoWrite(fd, tmp, strlen(tmp)); + + res = sceIoRemove("ms0:/__test__.txt"); + sprintf(tmp, "sceIoRemove: %p\n", res); + sceIoWrite(fd, tmp, strlen(tmp)); + + res = sceIoMkdir("ms0:/PSP/SAVEDATA/__testdir__", 0777); + sprintf(tmp, "sceIoMkdir: %p\n", res); + sceIoWrite(fd, tmp, strlen(tmp)); + + res = sceIoDopen("ms0:/PSP/SAVEDATA/__testdir__"); + sceIoDclose(res); + sprintf(tmp, "sceIoDopen: %p\n", res); + sceIoWrite(fd, tmp, strlen(tmp)); + + res = sceIoRmdir("ms0:/PSP/SAVEDATA/__testdir__"); + sprintf(tmp, "sceIoRmdir: %p\n", res); + sceIoWrite(fd, tmp, strlen(tmp)); + + SceIoStat stat; + res = sceIoGetstat("ms0:/PSP/SAVEDATA/ARK_01234/ARK4.BIN", &stat); + sprintf(tmp, "sceIoGetstat: %p\n", res); + sceIoWrite(fd, tmp, strlen(tmp)); + + sceIoClose(fd); +} + // Entry Point int main(int argc, char * argv[]) { @@ -141,9 +177,7 @@ int main(int argc, char * argv[]) } */ - int fd = sceIoOpen("ms0:/proshell.log", PSP_O_WRONLY|PSP_O_CREAT|PSP_O_APPEND, 0777); - sceIoWrite(fd, "hello\n", 6); - sceIoClose(fd); + testIo(); // Set Start Path strcpy(cwd, START_PATH); diff --git a/loader/live/kernel/psxloader/main.c b/loader/live/kernel/psxloader/main.c index 51db64f9c..0cf73341d 100644 --- a/loader/live/kernel/psxloader/main.c +++ b/loader/live/kernel/psxloader/main.c @@ -97,6 +97,9 @@ int exploitEntry(){ // Switch to Kernel Permission Level setK1Kernel(); + int (*DisplaySetHoldMode)(int) = FindFunction("sceDisplay_Service", "sceDisplay", 0x7ED59BC4); + DisplaySetHoldMode(0); + PRTSTR("ARK-X Loader Started"); scanArkFunctions(g_tbl);