mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-22 03:09:15 +01:00
Return to the loader when exiting homebrew
This commit is contained in:
parent
0ac4d8249c
commit
bcfac02dd3
Binary file not shown.
@ -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");
|
||||||
|
|
||||||
|
104
source/lstub.cpp
104
source/lstub.cpp
@ -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;
|
||||||
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user