Return to the loader when exiting homebrew

This commit is contained in:
wiidev 2021-08-01 18:00:15 +01:00
parent 0ac4d8249c
commit bcfac02dd3
4 changed files with 68 additions and 53 deletions

Binary file not shown.

View File

@ -142,16 +142,7 @@ static int RunAppbooter()
u64 currentStub = getStubDest(); u64 currentStub = getStubDest();
loadStub(); loadStub();
Set_Stub(returnTo(currentStub));
if (Set_Stub_Split(0x00010001, "UNEO") < 0)
{
if (Set_Stub_Split(0x00010001, "ULNR") < 0)
{
if (!currentStub) currentStub = 0x100000002ULL;
Set_Stub(currentStub);
}
}
gprintf("Exiting USBLoaderGX...\n\n"); gprintf("Exiting USBLoaderGX...\n\n");

View File

@ -1,4 +1,5 @@
//functions for manipulating the HBC stub by giantpune //functions for manipulating the HBC stub by giantpune
//updated by blackb0x August 2021
#include <string.h> #include <string.h>
#include <ogcsys.h> #include <ogcsys.h>
@ -7,78 +8,70 @@
#include "lstub.h" #include "lstub.h"
#include "gecko.h" #include "gecko.h"
#include "wad/nandtitle.h" #include "wad/nandtitle.h"
extern const u8 stub_bin[]; extern const u8 stub_bin[];
extern const u32 stub_bin_size; extern const u32 stub_bin_size;
static char* determineStubTIDLocation() static char *determineStubTIDLocation()
{ {
u32 *stubID = (u32*) 0x80001818; u32 *stubID = (u32 *)0x80001818;
//HBC stub 1.0.6 and lower, and stub.bin // HBC stub 1.1.4
if (stubID[0] == 0x480004c1 && stubID[1] == 0x480004f5) if (stubID[0] == 0x548406B0 && stubID[1] == 0x7C800124)
return (char *) 0x800024C6; 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;
//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;
//hexdump( stubID, 0x20 );
return NULL; return NULL;
} }
s32 Set_Stub(u64 reqID) s32 Set_Stub(u64 reqID)
{ {
if (NandTitles.IndexOf(reqID) < 0) return WII_EINSTALL; if (!hbcStubAvailable())
return 0;
if (NandTitles.IndexOf(reqID) < 0)
return WII_EINSTALL;
char *stub = determineStubTIDLocation(); char *stub = determineStubTIDLocation();
if (!stub) return -68; if (!stub)
return 0;
stub[0] = TITLE_7( reqID ); stub[0] = TITLE_7(reqID);
stub[1] = TITLE_6( reqID ); stub[1] = TITLE_6(reqID);
stub[8] = TITLE_5( reqID ); stub[8] = TITLE_5(reqID);
stub[9] = TITLE_4( reqID ); stub[9] = TITLE_4(reqID);
stub[4] = TITLE_3( reqID ); stub[4] = TITLE_3(reqID);
stub[5] = TITLE_2( reqID ); stub[5] = TITLE_2(reqID);
stub[12] = TITLE_1( reqID ); stub[12] = TITLE_1(reqID);
stub[13] = ((u8) (reqID)); stub[13] = ((u8)(reqID));
DCFlushRange(stub, 0x10); DCFlushRange(stub, 0x10);
return 1; return 1;
}
s32 Set_Stub_Split(u32 type, const char* reqID)
{
const u32 lower = ((u32)reqID[0] << 24) |
((u32)reqID[1] << 16) |
((u32)reqID[2] << 8) |
((u32)reqID[3]);
u64 reqID64 = TITLE_ID( type, lower );
return Set_Stub(reqID64);
} }
void loadStub() void loadStub()
{ {
char *stubLoc = (char *) 0x80001800; char *stubLoc = (char *)0x80001800;
memcpy(stubLoc, stub_bin, stub_bin_size); memcpy(stubLoc, stub_bin, stub_bin_size);
DCFlushRange(stubLoc, stub_bin_size); DCFlushRange(stubLoc, stub_bin_size);
} }
u64 getStubDest() u64 getStubDest()
{ {
if (!hbcStubAvailable()) return 0; if (!hbcStubAvailable())
return 0;
char ret[8]; char ret[8];
u64 retu = 0; u64 retu = 0;
char *stub = determineStubTIDLocation(); char *stub = determineStubTIDLocation();
if (!stub) return 0; if (!stub)
return 0;
ret[0] = stub[0]; ret[0] = stub[0];
ret[1] = stub[1]; ret[1] = stub[1];
@ -90,13 +83,44 @@ u64 getStubDest()
ret[7] = stub[13]; ret[7] = stub[13];
memcpy(&retu, ret, 8); memcpy(&retu, ret, 8);
return retu; return retu;
} }
u8 hbcStubAvailable() u8 hbcStubAvailable()
{ {
char * sig = (char *) 0x80001804; char *sig = (char *)0x80001804;
return (strncmp(sig, "STUBHAXX", 8) == 0); return (strncmp(sig, "STUBHAXX", 8) == 0);
} }
u64 returnTo(u64 currentStub)
{
// 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;
// OHBC
else if (NandTitles.IndexOf(0x000100014F484243ULL) > 0)
return 0x000100014F484243ULL;
// LULZ
else if (NandTitles.IndexOf(0x000100014C554C5AULL) > 0)
return 0x000100014C554C5AULL;
// 1.0.7
else if (NandTitles.IndexOf(0x00010001AF1BF516ULL) > 0)
return 0x00010001AF1BF516ULL;
// JODI
else if (NandTitles.IndexOf(0x000100014A4F4449ULL) > 0)
return 0x000100014A4F4449ULL;
// HAXX
else if (NandTitles.IndexOf(0x0001000148415858ULL) > 0)
return 0x0001000148415858ULL;
// System menu
else if (!currentStub)
return 0x100000002ULL;
// Current stub
return currentStub;
}

View File

@ -11,9 +11,6 @@
//!1 if successful //!1 if successful
s32 Set_Stub(u64 reqID); s32 Set_Stub(u64 reqID);
//!same as the above function, but expects a type and 4 char channel ID
s32 Set_Stub_Split(u32 type, const char* reqID);
//load the default HBC stub into memory. as long as nothing writes to the 0x80001800 //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/JODI.
void loadStub(); void loadStub();
@ -26,4 +23,7 @@ u64 getStubDest();
//returns 0 or 1 depending on wether the stub is available //returns 0 or 1 depending on wether the stub is available
u8 hbcStubAvailable(); u8 hbcStubAvailable();
//returns a valid title to return to
u64 returnTo(u64 currentStub);
#endif #endif