diff --git a/source/homebrewboot/BootHomebrew.cpp b/source/homebrewboot/BootHomebrew.cpp index c34a7738..c03e19cc 100644 --- a/source/homebrewboot/BootHomebrew.cpp +++ b/source/homebrewboot/BootHomebrew.cpp @@ -140,9 +140,8 @@ static int RunAppbooter() DCFlushRange(ARGS_ADDR, sizeof(struct __argv) + args.length); - u64 currentStub = getStubDest(); loadStub(); - Set_Stub(returnTo(currentStub)); + Set_Stub(returnTo(false)); gprintf("Exiting USBLoaderGX...\n\n"); diff --git a/source/lstub.cpp b/source/lstub.cpp index 5e72886e..c5d16961 100644 --- a/source/lstub.cpp +++ b/source/lstub.cpp @@ -1,5 +1,5 @@ //functions for manipulating the HBC stub by giantpune -//updated by blackb0x August 2021 +//updated by blackb0x April 2022 #include #include @@ -7,29 +7,11 @@ #include #include "lstub.h" -#include "gecko.h" #include "wad/nandtitle.h" extern const u8 stub_bin[]; extern const u32 stub_bin_size; -static char *determineStubTIDLocation() -{ - u32 *stubID = (u32 *)0x80001818; - - // HBC stub 1.1.4 - if (stubID[0] == 0x548406B0 && stubID[1] == 0x7C800124) - return (char *)0x80002662; - // HBC stub changed @ version 1.0.7. this file was last updated for HBC 1.0.8 - else if (stubID[0] == 0x48000859 && stubID[1] == 0x4800088d) - return (char *)0x8000286A; - // HBC stub 1.0.6 and lower, and stub.bin - else if (stubID[0] == 0x480004c1 && stubID[1] == 0x480004f5) - return (char *)0x800024C6; - - return NULL; -} - s32 Set_Stub(u64 reqID) { if (!hbcStubAvailable()) @@ -37,9 +19,7 @@ s32 Set_Stub(u64 reqID) if (NandTitles.IndexOf(reqID) < 0) return WII_EINSTALL; - char *stub = determineStubTIDLocation(); - if (!stub) - return 0; + char *stub = (char *)0x80002662; stub[0] = TITLE_7(reqID); stub[1] = TITLE_6(reqID); @@ -61,66 +41,41 @@ void loadStub() DCFlushRange(stubLoc, stub_bin_size); } -u64 getStubDest() -{ - if (!hbcStubAvailable()) - return 0; - - char ret[8]; - u64 retu = 0; - - char *stub = determineStubTIDLocation(); - if (!stub) - return 0; - - ret[0] = stub[0]; - ret[1] = stub[1]; - ret[2] = stub[8]; - ret[3] = stub[9]; - ret[4] = stub[4]; - ret[5] = stub[5]; - ret[6] = stub[12]; - ret[7] = stub[13]; - - memcpy(&retu, ret, 8); - return retu; -} - u8 hbcStubAvailable() { char *sig = (char *)0x80001804; return (strncmp(sig, "STUBHAXX", 8) == 0); } -u64 returnTo(u64 currentStub) +u64 returnTo(bool onlyHBC) { - // UNEO - if (NandTitles.IndexOf(0x00010001554E454FULL) > 0) - return 0x00010001554E454FULL; - // ULNR - else if (NandTitles.IndexOf(0x00010001554C4E52ULL) > 0) - return 0x00010001554C4E52ULL; - // IDCL - else if (NandTitles.IndexOf(0x000100014944434CULL) > 0) - return 0x000100014944434CULL; + if (!onlyHBC) + { + // UNEO + if (NandTitles.IndexOf(0x00010001554E454FULL) >= 0) + return 0x00010001554E454FULL; + // ULNR + if (NandTitles.IndexOf(0x00010001554C4E52ULL) >= 0) + return 0x00010001554C4E52ULL; + // IDCL + if (NandTitles.IndexOf(0x000100014944434CULL) >= 0) + return 0x000100014944434CULL; + } // OHBC - else if (NandTitles.IndexOf(0x000100014F484243ULL) > 0) + if (NandTitles.IndexOf(0x000100014F484243ULL) >= 0) return 0x000100014F484243ULL; // LULZ - else if (NandTitles.IndexOf(0x000100014C554C5AULL) > 0) + if (NandTitles.IndexOf(0x000100014C554C5AULL) >= 0) return 0x000100014C554C5AULL; // 1.0.7 - else if (NandTitles.IndexOf(0x00010001AF1BF516ULL) > 0) + if (NandTitles.IndexOf(0x00010001AF1BF516ULL) >= 0) return 0x00010001AF1BF516ULL; // JODI - else if (NandTitles.IndexOf(0x000100014A4F4449ULL) > 0) + if (NandTitles.IndexOf(0x000100014A4F4449ULL) >= 0) return 0x000100014A4F4449ULL; // HAXX - else if (NandTitles.IndexOf(0x0001000148415858ULL) > 0) + if (NandTitles.IndexOf(0x0001000148415858ULL) >= 0) return 0x0001000148415858ULL; // System menu - else if (!currentStub) - return 0x100000002ULL; - // Current stub - return currentStub; + return 0x100000002ULL; } diff --git a/source/lstub.h b/source/lstub.h index 4314d2bb..cc27e59a 100644 --- a/source/lstub.h +++ b/source/lstub.h @@ -12,18 +12,13 @@ s32 Set_Stub(u64 reqID); //load the default HBC stub into memory. as long as nothing writes to the 0x80001800 -// +0xDC7 memory block it will stay there. by default it has 0x00010001/JODI. +// +0xDC7 memory block it will stay there. by default it has 0x00010001/UNEO. void loadStub(); -//get whatever ID the stub is set to load -//!returns 0 if no stub is loaded into memory (must be the HBC stub at 0x800018000) -//!otherwise returns the ID set to return to -u64 getStubDest(); - //returns 0 or 1 depending on wether the stub is available u8 hbcStubAvailable(); //returns a valid title to return to -u64 returnTo(u64 currentStub); +u64 returnTo(bool onlyHBC = false); #endif diff --git a/source/prompts/PromptWindows.cpp b/source/prompts/PromptWindows.cpp index 373d61f0..a08d5244 100644 --- a/source/prompts/PromptWindows.cpp +++ b/source/prompts/PromptWindows.cpp @@ -712,9 +712,8 @@ int WindowExitPrompt() int choice = -1; - u64 oldstub = getStubDest(); loadStub(); - if (oldstub != 0x00010001554c4e52ll && oldstub != 0x00010001554e454fll) Set_Stub(oldstub); + Set_Stub(returnTo(true)); // Reset the stub back to the HBC GuiWindow promptWindow(640, 480); promptWindow.SetAlignment(ALIGN_LEFT, ALIGN_TOP);