updated lstub to work with newer HBC stub ( fixes "return to loader" )

This commit is contained in:
giantpune 2010-09-16 10:22:24 +00:00
parent ba5e1f2c37
commit 5bc9cee195
4 changed files with 74 additions and 7 deletions

View File

@ -2,8 +2,8 @@
<app version="1"> <app version="1">
<name> USB Loader GX</name> <name> USB Loader GX</name>
<coder>USB Loader GX Team</coder> <coder>USB Loader GX Team</coder>
<version>1.0 r940</version> <version>1.0 r941</version>
<release_date>201009151816</release_date> <release_date>201009160837</release_date>
<short_description>Loads games from USB-devices</short_description> <short_description>Loads games from USB-devices</short_description>
<long_description>USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times. <long_description>USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times.
The interactive GUI is completely controllable with WiiMote, Classic Controller or GC Controller. The interactive GUI is completely controllable with WiiMote, Classic Controller or GC Controller.

View File

@ -23,7 +23,8 @@ void gprintf( const char *str, ... )
va_end(ap); va_end(ap);
usb_sendbuffer( 1, astr, strlen(astr) ); //usb_sendbuffer( 1, astr, strlen(astr) );
usb_sendbuffer_safe( 1, astr, strlen(astr) );
} }
bool InitGecko() bool InitGecko()
@ -37,5 +38,43 @@ bool InitGecko()
else return false; else return false;
} }
static char ascii(char s)
{
if(s < 0x20)
return '.';
if(s > 0x7E)
return '.';
return s;
}
void hexdump(void *d, int len)
{
u8 *data;
int i, off;
data = (u8*)d;
gprintf("\n 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF");
gprintf("\n==== =============================================== ================\n");
for (off=0; off<len; off += 16)
{
gprintf("%04x ",off);
for(i=0; i<16; i++)
if((i+off)>=len)
gprintf(" ");
else
gprintf("%02x ",data[off+i]);
gprintf(" ");
for(i=0; i<16; i++)
if((i+off)>=len)
gprintf(" ");
else
gprintf("%c",ascii(data[off+i]));
gprintf("\n");
}
}
#endif /* NO_DEBUG */ #endif /* NO_DEBUG */

View File

@ -11,9 +11,11 @@ extern "C" {
//use this just like printf(); //use this just like printf();
void gprintf(const char *str, ...); void gprintf(const char *str, ...);
bool InitGecko(); bool InitGecko();
void hexdump(void *d, int len);
#else #else
#define gprintf(...) #define gprintf(...)
#define InitGecko() false #define InitGecko() false
#define hexdump( x, y )
#endif /* NO_DEBUG */ #endif /* NO_DEBUG */

View File

@ -8,6 +8,7 @@
#include "lstub.h" #include "lstub.h"
#include "stub_bin.h" #include "stub_bin.h"
#include "gecko.h"
#define TITLE_1(x) ((u8)((x) >> 8)) #define TITLE_1(x) ((u8)((x) >> 8))
#define TITLE_2(x) ((u8)((x) >> 16)) #define TITLE_2(x) ((u8)((x) >> 16))
@ -18,6 +19,23 @@
#define TITLE_7(x) ((u8)((x) >> 56)) #define TITLE_7(x) ((u8)((x) >> 56))
#define TITLE_ID(x,y) (((u64)(x) << 32) | (y)) #define TITLE_ID(x,y) (((u64)(x) << 32) | (y))
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) s32 Set_Stub(u64 reqID)
{ {
u32 tmdsize; u32 tmdsize;
@ -54,7 +72,9 @@ s32 Set_Stub(u64 reqID)
if(ES_GetStoredTMDSize(tid, &tmdsize) < 0) if(ES_GetStoredTMDSize(tid, &tmdsize) < 0)
return WII_EINSTALL; return WII_EINSTALL;
char *stub = (char *)0x800024C6; char *stub = determineStubTIDLocation();
if( !stub )
return -68;
stub[0] = TITLE_7(reqID); stub[0] = TITLE_7(reqID);
stub[1] = TITLE_6(reqID); stub[1] = TITLE_6(reqID);
@ -65,6 +85,8 @@ s32 Set_Stub(u64 reqID)
stub[12] = TITLE_1(reqID); stub[12] = TITLE_1(reqID);
stub[13] = ((u8)(reqID)); stub[13] = ((u8)(reqID));
DCFlushRange( stub, 0x10 );
return 1; return 1;
} }
@ -84,6 +106,7 @@ 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 );
} }
u64 getStubDest() u64 getStubDest()
@ -91,10 +114,13 @@ u64 getStubDest()
if (!hbcStubAvailable()) if (!hbcStubAvailable())
return 0; return 0;
char ret[ 8 ];
u64 retu = 0;
char *stub = determineStubTIDLocation();
if( !stub )
return 0;
char *stub = (char *)0x800024C6;
char ret[9];
u64 retu =0;
ret[0] = stub[0]; ret[0] = stub[0];
ret[1] = stub[1]; ret[1] = stub[1];