diff --git a/source/main.c b/source/main.c
index 4dd7d4d..4404578 100644
--- a/source/main.c
+++ b/source/main.c
@@ -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_nextArgv[2048];
static char g_nextNroPath[512];
+static char g_nroReturnPath[512];
u64 g_nroAddr = 0;
static u64 g_nroSize = 0;
static NroHeader g_nroHeader;
@@ -26,6 +27,8 @@ Result g_lastRet = 0;
extern void* __stack_top;//Defined in libnx.
#define STACK_SIZE 0x100000 //Change this if main-thread stack size ever changes.
+#define DEFAULT_NRO "sdmc:/hbmenu.nro"
+
void __libnx_initheap(void)
{
static char g_innerheap[0x20000];
@@ -264,8 +267,15 @@ void loadNro(void)
if (strlen(g_nextNroPath) == 0)
{
- strcpy(g_nextNroPath, "sdmc:/hbmenu.nro");
- strcpy(g_nextArgv, "sdmc:/hbmenu.nro");
+ char nextNro[512];
+ 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);
@@ -372,6 +382,7 @@ void loadNro(void)
{ EntryType_LastLoadResult, 0, {0, 0} },
{ EntryType_SyscallAvailableHint, 0, {0xffffffffffffffff, 0x1fc1fff0007ffff} },
{ EntryType_RandomSeed, 0, {0, 0} },
+ { EntryType_NroReturnPath, 0, {0, 0} },
{ EntryType_EndOfList, 0, {0, 0} }
};
@@ -399,6 +410,8 @@ void loadNro(void)
// RandomSeed
entries[8].Value[0] = randomGet64();
entries[8].Value[1] = randomGet64();
+ // NroReturnPath
+ entries[9].Value[0] = (u64) &g_nroReturnPath[0];
u64 entrypoint = map_addr;
@@ -409,7 +422,6 @@ void loadNro(void)
if (!has_mod0) {
// 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).
g_smCloseWorkaround = true;
}