diff --git a/patches/reboot.s b/patches/reboot.s index 76b5ea7..6b1ab7c 100644 --- a/patches/reboot.s +++ b/patches/reboot.s @@ -181,6 +181,8 @@ nand_mount: .dcw "nand" blo copy_loop32 bx lr + .pool + copy_launch_stub_end: flushCaches: @@ -209,5 +211,4 @@ nand_mount: .dcw "nand" bx lr -.pool .close diff --git a/source/fs.c b/source/fs.c index 37c9846..dc21632 100644 --- a/source/fs.c +++ b/source/fs.c @@ -189,8 +189,8 @@ void loadPayload(u32 pressed, const char *payloadPath) char path[62] = {0}, absPath[92] = {0}; - char mountPoint[5] = {0}; - for(u32 i = 0; i < 4 && launchedPath[i] != ':'; i++) + u16 mountPoint[5] = {0}; + for(u32 i = 0; i < 4 && launchedPath[i] != u':'; i++) mountPoint[i] = launchedPath[i]; if(payloadPath == NULL) @@ -222,7 +222,7 @@ void loadPayload(u32 pressed, const char *payloadPath) if(!info.fname[0]) return; sprintf(path, "payloads/%s", info.altname); - if(memcmp(mountPoint, "nand", 4)) + if(memcmp(mountPoint, u"nand", 8)) sprintf(absPath, "nand:/rw/luma/payloads/%s", info.altname); else sprintf(absPath, "%s:/luma/payloads/%s", mountPoint, info.altname); @@ -231,7 +231,7 @@ void loadPayload(u32 pressed, const char *payloadPath) } else { - if(memcmp(mountPoint, "nand", 4)) + if(memcmp(mountPoint, u"nand", 8)) sprintf(absPath, "nand:/rw/luma/payloads/%s", payloadPath); else sprintf(absPath, "%s:/luma/payloads/%s", mountPoint, payloadPath); diff --git a/source/main.c b/source/main.c index 22b40bb..3191c0b 100644 --- a/source/main.c +++ b/source/main.c @@ -49,17 +49,19 @@ void main(int argc, char **argv) FirmwareType firmType; FirmwareSource nandType; + char errbuf[128]; + switch(argc) { case 0: - error("Unsupported launcher."); + error("Unsupported launcher (argc = 0)."); break; case 1: //Normal boot { u32 i; - for(i = 0; i < 40 && launchedPath[i] != 0; i++) //Copy and convert the path to utf16 - launchedPath[2 * i] = argv[0][i]; + for(i = 0; i < 40 && argv[0][i] != 0; i++) //Copy and convert the path to utf16 + launchedPath[i] = argv[0][i]; for(; i < 41; i++) launchedPath[i] = 0; @@ -71,7 +73,7 @@ void main(int argc, char **argv) { u32 i; u16 *p = (u16 *)argv[0]; - for(i = 0; i < 40 && launchedPath[i] != 0; i++) + for(i = 0; i < 40 && p[i] != 0; i++) launchedPath[i] = p[i]; for(; i < 41; i++) launchedPath[i] = 0; @@ -79,28 +81,40 @@ void main(int argc, char **argv) memcpy(launchedFirmTidLow, (u16 *)argv[1], 16); break; } + + default: + sprintf(errbuf, "Unsupported launcher (argc = %d > 2).", argc); + error(errbuf); + break; } - char mountPoint[5] = {0}; - for(u32 i = 0; i < 4 && argv[0][i] != ':'; i++) - mountPoint[i] = argv[0][i]; + u16 mountPoint[5] = {0}; + for(u32 i = 0; i < 4 && launchedPath[i] != u':'; i++) + mountPoint[i] = launchedPath[i]; //Mount SD or CTRNAND bool isSdMode; - if(memcmp(mountPoint, "sdmc", 4) == 0) + if(memcmp(mountPoint, u"sdmc", 8) == 0) { if(!mountFs(true, false)) error("Failed to mount SD."); isSdMode = true; } - else if(memcmp(mountPoint, "nand", 4) == 0) + else if(memcmp(mountPoint, u"nand", 8) == 0) { firmSource = FIRMWARE_SYSNAND; if(!mountFs(false, true)) error("Failed to mount SD and CTRNAND."); isSdMode = false; } else - error("Launched from an unsupported location"); + { + char mount8[5] = {0}; + for(u32 i = 0 ; i < 4; i++) + mount8[i] = (char)mountPoint[i]; + + sprintf(errbuf, "Launched from an unsupported location: %s.", mount8); + error(errbuf); + } //Attempt to read the configuration file needConfig = readConfig() ? MODIFY_CONFIGURATION : CREATE_CONFIGURATION; @@ -305,9 +319,8 @@ boot: if(res != 0) { - char patchesError[43]; - sprintf(patchesError, "Failed to apply %u FIRM patch(es).", res); - error(patchesError); + sprintf(errbuf, "Failed to apply %u FIRM patch(es).", res); + error(errbuf); } launchFirm(firmType, loadFromStorage); diff --git a/source/patches.c b/source/patches.c index 88a358d..120765f 100644 --- a/source/patches.c +++ b/source/patches.c @@ -135,8 +135,8 @@ u32 patchFirmlaunches(u8 *pos, u32 size, u32 process9MemAddr) u32 *pos_fopen = (u32 *)memsearch(off, "OPEN", reboot_bin_size, 4); *pos_fopen = fOpenOffset; - u16 *fname = (u16 *)memsearch(off, u"sd", reboot_bin_size, 4); - memcpy(fname, launchedPath, 82); + u16 *fname = (u16 *)memsearch(off, u"sdmc", reboot_bin_size, 8); + memcpy(fname, launchedPath, sizeof(launchedPath)); return 0; }