Add g_nroReturnPath

g_nroReturnPath is the path that nx-hbloader will load after the next NRO returns. If it is not set, the next NRO will simply return to sdmc:/hbmenu.nro
This commit is contained in:
friedkeenan 2019-01-02 00:16:30 -06:00 committed by GitHub
parent 0556fbbd99
commit 553b2fd9af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -9,6 +9,7 @@ const char* g_easterEgg = "Do you mean to tell me that you're thinking seriously
static char g_argv[2048]; static char g_argv[2048];
static char g_nextArgv[2048]; static char g_nextArgv[2048];
static char g_nextNroPath[512]; static char g_nextNroPath[512];
static char g_nroReturnPath[512];
u64 g_nroAddr = 0; u64 g_nroAddr = 0;
static u64 g_nroSize = 0; static u64 g_nroSize = 0;
static NroHeader g_nroHeader; static NroHeader g_nroHeader;
@ -26,6 +27,8 @@ Result g_lastRet = 0;
extern void* __stack_top;//Defined in libnx. extern void* __stack_top;//Defined in libnx.
#define STACK_SIZE 0x100000 //Change this if main-thread stack size ever changes. #define STACK_SIZE 0x100000 //Change this if main-thread stack size ever changes.
#define DEFAULT_NRO "sdmc:/hbmenu.nro"
void __libnx_initheap(void) void __libnx_initheap(void)
{ {
static char g_innerheap[0x20000]; static char g_innerheap[0x20000];
@ -264,8 +267,15 @@ void loadNro(void)
if (strlen(g_nextNroPath) == 0) if (strlen(g_nextNroPath) == 0)
{ {
strcpy(g_nextNroPath, "sdmc:/hbmenu.nro"); char nextNro[512];
strcpy(g_nextArgv, "sdmc:/hbmenu.nro"); if (strlen(g_nroReturnPath) == 0)
strcpy(nextNro, DEFAULT_NRO);
else {
strcpy(nextNro, g_nroReturnPath);
g_nroReturnPath[0]='\0';
}
strcpy(g_nextNroPath, nextNro);
strcpy(g_nextArgv, nextNro);
} }
memcpy(g_argv, g_nextArgv, sizeof g_argv); memcpy(g_argv, g_nextArgv, sizeof g_argv);
@ -372,6 +382,7 @@ void loadNro(void)
{ EntryType_LastLoadResult, 0, {0, 0} }, { EntryType_LastLoadResult, 0, {0, 0} },
{ EntryType_SyscallAvailableHint, 0, {0xffffffffffffffff, 0x1fc1fff0007ffff} }, { EntryType_SyscallAvailableHint, 0, {0xffffffffffffffff, 0x1fc1fff0007ffff} },
{ EntryType_RandomSeed, 0, {0, 0} }, { EntryType_RandomSeed, 0, {0, 0} },
{ EntryType_NroReturnPath, 0, {0, 0} },
{ EntryType_EndOfList, 0, {0, 0} } { EntryType_EndOfList, 0, {0, 0} }
}; };
@ -399,6 +410,8 @@ void loadNro(void)
// RandomSeed // RandomSeed
entries[8].Value[0] = randomGet64(); entries[8].Value[0] = randomGet64();
entries[8].Value[1] = randomGet64(); entries[8].Value[1] = randomGet64();
// NroReturnPath
entries[9].Value[0] = (u64) &g_nroReturnPath[0];
u64 entrypoint = map_addr; u64 entrypoint = map_addr;
@ -409,7 +422,6 @@ void loadNro(void)
if (!has_mod0) { if (!has_mod0) {
// Apply sm-close workaround to NROs which do not contain a valid MOD0 header. // Apply sm-close workaround to NROs which do not contain a valid MOD0 header.
// This heuristic is based on the fact that MOD0 support was added very shortly after
// the fix for the sm-close bug (in fact, two commits later). // the fix for the sm-close bug (in fact, two commits later).
g_smCloseWorkaround = true; g_smCloseWorkaround = true;
} }