//functions for manipulating the HBC stub by giantpune #include #include #include #include #include "lstub.h" #include "stub_bin.h" #include "gecko.h" #include "wad/nandtitle.h" static char* determineStubTIDLocation() { u32 *stubID = ( u32* )0x80001818; //HBC stub 1.0.6 and lower, and stub.bin 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; } s32 Set_Stub( u64 reqID ) { if ( titles.IndexOf( reqID ) < 0 ) return WII_EINSTALL; char *stub = determineStubTIDLocation(); if ( !stub ) return -68; stub[0] = TITLE_7( reqID ); stub[1] = TITLE_6( reqID ); stub[8] = TITLE_5( reqID ); stub[9] = TITLE_4( reqID ); stub[4] = TITLE_3( reqID ); stub[5] = TITLE_2( reqID ); stub[12] = TITLE_1( reqID ); stub[13] = ( ( u8 )( reqID ) ); DCFlushRange( stub, 0x10 ); return 1; } s32 Set_Stub_Split( u32 type, const char* reqID ) { char tmp[4]; u32 lower; sprintf( tmp, "%c%c%c%c", reqID[0], reqID[1], reqID[2], reqID[3] ); memcpy( &lower, tmp, 4 ); u64 reqID64 = TITLE_ID( type, lower ); return Set_Stub( reqID64 ); } void loadStub() { char *stubLoc = ( char * )0x80001800; memcpy( stubLoc, stub_bin, stub_bin_size ); 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 ( sig[0] == 'S' && sig[1] == 'T' && sig[2] == 'U' && sig[3] == 'B' && sig[4] == 'H' && sig[5] == 'A' && sig[6] == 'X' && sig[7] == 'X' ) ? 1 : 0; }