From 7a663a151a97c27678ed2e358c50c52b77ce8c68 Mon Sep 17 00:00:00 2001 From: Maschell Date: Tue, 15 Dec 2020 22:29:45 +0100 Subject: [PATCH] Fix running from browser_hax, still broken when using payload multi loader --- src/dynamic_libs/os_functions.c | 4 +- src/dynamic_libs/os_functions.h | 7 +++- src/entry.c | 2 +- src/main.c | 66 ++++++++++----------------------- src/main.h | 2 +- src/menu.c | 2 +- 6 files changed, 31 insertions(+), 52 deletions(-) diff --git a/src/dynamic_libs/os_functions.c b/src/dynamic_libs/os_functions.c index 902d79b..abf9ad9 100644 --- a/src/dynamic_libs/os_functions.c +++ b/src/dynamic_libs/os_functions.c @@ -68,7 +68,7 @@ EXPORT_DECL(int, OSTryLockMutex, void* mutex); //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- EXPORT_DECL(u64, OSGetTitleID, void); EXPORT_DECL(void, OSGetArgcArgv, int* argc, char*** argv); -EXPORT_DECL(void, __Exit, void); +EXPORT_DECL(void, __Exit, int); EXPORT_DECL(void, OSSavesDone_ReadyToRelease, void); EXPORT_DECL(void, OSFatal, const char* msg); EXPORT_DECL(void, OSSetExceptionCallback, u8 exceptionType, exception_callback newCallback); @@ -155,7 +155,7 @@ void InitOSFunctionPointers(void) OS_FIND_EXPORT(coreinit_handle, __os_snprintf); OS_FIND_EXPORT(coreinit_handle, __gh_errno_ptr); - OSDynLoad_FindExport(coreinit_handle, 0, "_Exit", &__Exit); + OSDynLoad_FindExport(coreinit_handle, 0, "exit", &__Exit); OS_FIND_EXPORT(coreinit_handle, OSScreenInit); OS_FIND_EXPORT(coreinit_handle, OSScreenShutdown); diff --git a/src/dynamic_libs/os_functions.h b/src/dynamic_libs/os_functions.h index 63e6519..97a0826 100644 --- a/src/dynamic_libs/os_functions.h +++ b/src/dynamic_libs/os_functions.h @@ -32,6 +32,8 @@ extern "C" { #endif + + #define BUS_SPEED 248625000 #define SECS_TO_TICKS(sec) (((unsigned long long)(sec)) * (BUS_SPEED/4)) #define MILLISECS_TO_TICKS(msec) (SECS_TO_TICKS(msec) / 1000) @@ -40,6 +42,9 @@ extern "C" { #define usleep(usecs) OSSleepTicks(MICROSECS_TO_TICKS(usecs)) #define sleep(secs) OSSleepTicks(SECS_TO_TICKS(secs)) +#define os_usleep(usecs) OSSleepTicks(MICROSECS_TO_TICKS(usecs)) +#define os_sleep(secs) OSSleepTicks(SECS_TO_TICKS(secs)) + #define FLUSH_DATA_BLOCK(addr) asm volatile("dcbf 0, %0; sync" : : "r"(((addr) & ~31))) #define INVAL_DATA_BLOCK(addr) asm volatile("dcbi 0, %0; sync" : : "r"(((addr) & ~31))) @@ -110,7 +115,7 @@ extern int (* OSTryLockMutex)(void* mutex); //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- extern u64 (* OSGetTitleID)(void); extern void (* OSGetArgcArgv)(int* argc, char*** argv); -extern void (* __Exit)(void); +extern void (* __Exit)(int); extern void (* OSSavesDone_ReadyToRelease)(void); extern void (* OSFatal)(const char* msg); extern void (* DCFlushRange)(const void *addr, u32 length); diff --git a/src/entry.c b/src/entry.c index cb62803..d66fef7 100644 --- a/src/entry.c +++ b/src/entry.c @@ -114,7 +114,7 @@ int _start(int argc, char **argv) { unsigned int bufferU32 = 0x4E800421; KernelWriteU32(repl_addr,bufferU32,&private_data); - return Menu_Main(); + return Menu_Main(argc, argv); } /* Write a 32-bit word with kernel permissions */ diff --git a/src/main.c b/src/main.c index 71e6955..0354ea5 100644 --- a/src/main.c +++ b/src/main.c @@ -43,10 +43,7 @@ bool CheckRunning() { return true; } - - -int Menu_Main(void) -{ +int Menu_Main(int argc, char ** argv){ //!---------INIT--------- InitOSFunctionPointers(); InitSysFunctionPointers(); @@ -55,60 +52,37 @@ int Menu_Main(void) InitVPadFunctionPointers(); InitProcUIFunctionPointers(); - u64 currenTitleId = OSGetTitleID(); - - VPADInit(); - /*int forceMenu = 0; - - { - VPADData vpad; - int vpadError = -1; - VPADRead(0, &vpad, 1, &vpadError); - - if(vpadError == 0) - { - forceMenu = (vpad.btns_d | vpad.btns_h) & VPAD_BUTTON_B; - } - }*/ - - //mount_sd_fat("sd"); - cfw_config_t config; default_config(&config); - //read_config(&config); - int launch = 1; + //int launch = 1; + ShowMenu(&config); - //if(forceMenu || config.directLaunch == 0) - //{ - launch = ShowMenu(&config); - //} - ExecuteIOSExploit(&config); + if ( - OSGetTitleID() == 0x000500101004A200L || // mii maker eur - OSGetTitleID() == 0x000500101004A100L || // mii maker usa - OSGetTitleID() == 0x000500101004A000L) { // mii maker jpn + OSGetTitleID() == 0x000500101004A200L || // mii maker eur + OSGetTitleID() == 0x000500101004A100L || // mii maker usa + OSGetTitleID() == 0x000500101004A000L) { // mii maker jpn // restart mii maker. OSForceFullRelaunch(); SYSLaunchMenu(); - exit(0); - } else { - ProcUIInit(OSSavesDone_ReadyToRelease); - - OSForceFullRelaunch(); - SYSLaunchMenu(); - - while (CheckRunning()) { - // wait. - OSSleepTicks(MILLISECS_TO_TICKS(100)); - } - ProcUIShutdown(); - - return 0; + return ( (int (*)(int, char **))(*(unsigned int*)0x1005E040) )(argc, argv); } + + ProcUIInit(OSSavesDone_ReadyToRelease); + + OSForceFullRelaunch(); + SYSLaunchMenu(); + while (CheckRunning()) { + log_printf_("check"); + // wait. + OSSleepTicks(MILLISECS_TO_TICKS(100)); + } + ProcUIShutdown(); + log_printf_("exit"); return 0; } diff --git a/src/main.h b/src/main.h index 0ee1b7b..d33014b 100644 --- a/src/main.h +++ b/src/main.h @@ -11,7 +11,7 @@ extern "C" { #endif //! C wrapper for our C++ functions -int Menu_Main(void); +int Menu_Main(int argc, char ** argv); #ifdef __cplusplus } diff --git a/src/menu.c b/src/menu.c index c4e06df..d237253 100644 --- a/src/menu.c +++ b/src/menu.c @@ -265,7 +265,7 @@ int ShowMenu(cfw_config_t * currentConfig) initScreen = 0; } - usleep(20000); + os_usleep(20000); } OSScreenShutdown();