diff --git a/Makefile b/Makefile index ac0337d..372d419 100644 --- a/Makefile +++ b/Makefile @@ -309,6 +309,10 @@ $(OUTPUT).elf: $(OFILES) @echo $(notdir $<) @$(bin2o) +%.bin.o : %.bin + @echo $(notdir $<) + @$(bin2o) + #%.o: %.c # @echo $(notdir $<) # $(CC) -MMD -MP -MF $(DEPSDIR)/$*.d $(CFLAGS) -c $< -o $@ diff --git a/data/stub.bin b/data/stub.bin new file mode 100644 index 0000000..63a37a0 Binary files /dev/null and b/data/stub.bin differ diff --git a/lib/grrlib/GRRLIB/libgrrlib.a b/lib/grrlib/GRRLIB/libgrrlib.a new file mode 100644 index 0000000..7ada541 Binary files /dev/null and b/lib/grrlib/GRRLIB/libgrrlib.a differ diff --git a/lib/grrlib/lib17/libgrrlib.a b/lib/grrlib/lib17/libgrrlib.a new file mode 100644 index 0000000..1d690cf Binary files /dev/null and b/lib/grrlib/lib17/libgrrlib.a differ diff --git a/lib/grrlib/lib22/libgrrlib.a b/lib/grrlib/lib22/libgrrlib.a new file mode 100644 index 0000000..aba951b Binary files /dev/null and b/lib/grrlib/lib22/libgrrlib.a differ diff --git a/lib/grrlib/lib24/libgrrlib.a b/lib/grrlib/lib24/libgrrlib.a new file mode 100644 index 0000000..8444031 Binary files /dev/null and b/lib/grrlib/lib24/libgrrlib.a differ diff --git a/lib/grrlib/lib25/libgrrlib.a b/lib/grrlib/lib25/libgrrlib.a new file mode 100644 index 0000000..8444031 Binary files /dev/null and b/lib/grrlib/lib25/libgrrlib.a differ diff --git a/lib/grrlib/lib26/libgrrlib.a b/lib/grrlib/lib26/libgrrlib.a new file mode 100644 index 0000000..7ada541 Binary files /dev/null and b/lib/grrlib/lib26/libgrrlib.a differ diff --git a/lib/jpeg/lib17/libjpeg.a b/lib/jpeg/lib17/libjpeg.a new file mode 100644 index 0000000..fe7810e Binary files /dev/null and b/lib/jpeg/lib17/libjpeg.a differ diff --git a/lib/jpeg/lib22/libjpeg.a b/lib/jpeg/lib22/libjpeg.a new file mode 100644 index 0000000..b139c1e Binary files /dev/null and b/lib/jpeg/lib22/libjpeg.a differ diff --git a/lib/jpeg/lib24/libjpeg.a b/lib/jpeg/lib24/libjpeg.a new file mode 100644 index 0000000..b203503 Binary files /dev/null and b/lib/jpeg/lib24/libjpeg.a differ diff --git a/lib/jpeg/lib25/libjpeg.a b/lib/jpeg/lib25/libjpeg.a new file mode 100644 index 0000000..b203503 Binary files /dev/null and b/lib/jpeg/lib25/libjpeg.a differ diff --git a/lib/jpeg/lib26/libjpeg.a b/lib/jpeg/lib26/libjpeg.a new file mode 100644 index 0000000..5135edf Binary files /dev/null and b/lib/jpeg/lib26/libjpeg.a differ diff --git a/lib/jpeg/src/libjpeg.a b/lib/jpeg/src/libjpeg.a new file mode 100644 index 0000000..5135edf Binary files /dev/null and b/lib/jpeg/src/libjpeg.a differ diff --git a/lib/jpeg8a/lib/libjpeg.a b/lib/jpeg8a/lib/libjpeg.a new file mode 100644 index 0000000..a078135 Binary files /dev/null and b/lib/jpeg8a/lib/libjpeg.a differ diff --git a/lib/libext2fs/lib/wii/libext2fs.a b/lib/libext2fs/lib/wii/libext2fs.a new file mode 100644 index 0000000..369cea3 Binary files /dev/null and b/lib/libext2fs/lib/wii/libext2fs.a differ diff --git a/lib/libext2fs/lib17/libext2fs.a b/lib/libext2fs/lib17/libext2fs.a new file mode 100644 index 0000000..c897c11 Binary files /dev/null and b/lib/libext2fs/lib17/libext2fs.a differ diff --git a/lib/libext2fs/lib22/libext2fs.a b/lib/libext2fs/lib22/libext2fs.a new file mode 100644 index 0000000..75fdbe3 Binary files /dev/null and b/lib/libext2fs/lib22/libext2fs.a differ diff --git a/lib/libext2fs/lib24/libext2fs.a b/lib/libext2fs/lib24/libext2fs.a new file mode 100644 index 0000000..1535b54 Binary files /dev/null and b/lib/libext2fs/lib24/libext2fs.a differ diff --git a/lib/libext2fs/lib25/libext2fs.a b/lib/libext2fs/lib25/libext2fs.a new file mode 100644 index 0000000..42efc63 Binary files /dev/null and b/lib/libext2fs/lib25/libext2fs.a differ diff --git a/lib/libext2fs/lib26/libext2fs.a b/lib/libext2fs/lib26/libext2fs.a new file mode 100644 index 0000000..369cea3 Binary files /dev/null and b/lib/libext2fs/lib26/libext2fs.a differ diff --git a/lib/libfat/lib17/libfat.a b/lib/libfat/lib17/libfat.a new file mode 100644 index 0000000..246dbbe Binary files /dev/null and b/lib/libfat/lib17/libfat.a differ diff --git a/lib/libfat/lib22/libfat.a b/lib/libfat/lib22/libfat.a new file mode 100644 index 0000000..7ef160f Binary files /dev/null and b/lib/libfat/lib22/libfat.a differ diff --git a/lib/libfat/lib24/libfat.a b/lib/libfat/lib24/libfat.a new file mode 100644 index 0000000..21b8f2d Binary files /dev/null and b/lib/libfat/lib24/libfat.a differ diff --git a/lib/libfat/lib25/libfat.a b/lib/libfat/lib25/libfat.a new file mode 100644 index 0000000..45d0de1 Binary files /dev/null and b/lib/libfat/lib25/libfat.a differ diff --git a/lib/libfat/lib26/libfat.a b/lib/libfat/lib26/libfat.a new file mode 100644 index 0000000..f58c142 Binary files /dev/null and b/lib/libfat/lib26/libfat.a differ diff --git a/lib/libfat/src/libogc/lib/wii/libfat.a b/lib/libfat/src/libogc/lib/wii/libfat.a new file mode 100644 index 0000000..f58c142 Binary files /dev/null and b/lib/libfat/src/libogc/lib/wii/libfat.a differ diff --git a/lib/libntfs/lib17/libntfs-O2.a b/lib/libntfs/lib17/libntfs-O2.a new file mode 100644 index 0000000..d6bd448 Binary files /dev/null and b/lib/libntfs/lib17/libntfs-O2.a differ diff --git a/lib/libntfs/lib17/libntfs.a b/lib/libntfs/lib17/libntfs.a new file mode 100644 index 0000000..845a90a Binary files /dev/null and b/lib/libntfs/lib17/libntfs.a differ diff --git a/lib/libntfs/lib22/libntfs.a b/lib/libntfs/lib22/libntfs.a new file mode 100644 index 0000000..8ebc694 Binary files /dev/null and b/lib/libntfs/lib22/libntfs.a differ diff --git a/lib/libntfs/lib24/libntfs.a b/lib/libntfs/lib24/libntfs.a new file mode 100644 index 0000000..1211d05 Binary files /dev/null and b/lib/libntfs/lib24/libntfs.a differ diff --git a/lib/libntfs/lib25/libntfs.a b/lib/libntfs/lib25/libntfs.a new file mode 100644 index 0000000..008edf8 Binary files /dev/null and b/lib/libntfs/lib25/libntfs.a differ diff --git a/lib/libntfs/lib26/libntfs.a b/lib/libntfs/lib26/libntfs.a new file mode 100644 index 0000000..1e3a411 Binary files /dev/null and b/lib/libntfs/lib26/libntfs.a differ diff --git a/lib/libntfs/src/lib/wii/libntfs.a b/lib/libntfs/src/lib/wii/libntfs.a new file mode 100644 index 0000000..1e3a411 Binary files /dev/null and b/lib/libntfs/src/lib/wii/libntfs.a differ diff --git a/lib/png-1.2.34/lib/libpng.a b/lib/png-1.2.34/lib/libpng.a new file mode 100644 index 0000000..cc07e34 Binary files /dev/null and b/lib/png-1.2.34/lib/libpng.a differ diff --git a/lib/png/lib17/libpng.a b/lib/png/lib17/libpng.a new file mode 100644 index 0000000..bf5e20a Binary files /dev/null and b/lib/png/lib17/libpng.a differ diff --git a/lib/png/lib22/libpng.a b/lib/png/lib22/libpng.a new file mode 100644 index 0000000..cbea300 Binary files /dev/null and b/lib/png/lib22/libpng.a differ diff --git a/lib/png/lib24/libpng.a b/lib/png/lib24/libpng.a new file mode 100644 index 0000000..ead246d Binary files /dev/null and b/lib/png/lib24/libpng.a differ diff --git a/lib/png/lib25/libpng.a b/lib/png/lib25/libpng.a new file mode 100644 index 0000000..ead246d Binary files /dev/null and b/lib/png/lib25/libpng.a differ diff --git a/lib/png/lib26/libpng.a b/lib/png/lib26/libpng.a new file mode 100644 index 0000000..5c65bac Binary files /dev/null and b/lib/png/lib26/libpng.a differ diff --git a/lib/png/src/libpng.a b/lib/png/src/libpng.a new file mode 100644 index 0000000..5c65bac Binary files /dev/null and b/lib/png/src/libpng.a differ diff --git a/lib/zlib/lib17/libz.a b/lib/zlib/lib17/libz.a new file mode 100644 index 0000000..d2f8cfc Binary files /dev/null and b/lib/zlib/lib17/libz.a differ diff --git a/lib/zlib/lib22/libz.a b/lib/zlib/lib22/libz.a new file mode 100644 index 0000000..b6ca2b5 Binary files /dev/null and b/lib/zlib/lib22/libz.a differ diff --git a/lib/zlib/lib24/libz.a b/lib/zlib/lib24/libz.a new file mode 100644 index 0000000..c252de4 Binary files /dev/null and b/lib/zlib/lib24/libz.a differ diff --git a/lib/zlib/lib25/libz.a b/lib/zlib/lib25/libz.a new file mode 100644 index 0000000..c252de4 Binary files /dev/null and b/lib/zlib/lib25/libz.a differ diff --git a/lib/zlib/lib26/libz.a b/lib/zlib/lib26/libz.a new file mode 100644 index 0000000..1f62f2b Binary files /dev/null and b/lib/zlib/lib26/libz.a differ diff --git a/lib/zlib/src/libz.a b/lib/zlib/src/libz.a new file mode 100644 index 0000000..1f62f2b Binary files /dev/null and b/lib/zlib/src/libz.a differ diff --git a/source/cfg.c b/source/cfg.c index b2c5687..7afbd7a 100644 --- a/source/cfg.c +++ b/source/cfg.c @@ -35,6 +35,7 @@ char APPS_DIR[200] = ""; char LAST_CFG_PATH[200]; char direct_start_id_buf[] = "#GAMEID\0\0\0\0\0CFGUSB0000000000"; char DIOS_MIOS_INFO[200] = ""; +u32 HBC_LOWER_TID = 0x00000000; /* configurable fields */ diff --git a/source/cfg.h b/source/cfg.h index e5612f1..e29e8dc 100644 --- a/source/cfg.h +++ b/source/cfg.h @@ -233,6 +233,7 @@ extern char APPS_DIR[]; extern char CFG_VERSION[]; extern char LAST_CFG_PATH[]; extern char DIOS_MIOS_INFO[]; +extern u32 HBC_LOWER_TID; typedef char GAMEID_t[8]; diff --git a/source/channel.c b/source/channel.c index 3eed3a0..da21886 100644 --- a/source/channel.c +++ b/source/channel.c @@ -97,7 +97,7 @@ char *read_name_from_banner_app(u64 titleid) u8 imet[4] = {0x49, 0x4D, 0x45, 0x54}; - sprintf(path_buffer, "%s/title/%08x/%08x/content", CFG.nand_emu_path, TITLE_HIGH(titleid), TITLE_LOW(titleid)); + sprintf(path_buffer, "%s/title/%08x/%08x/content", CFG.nand_emu_path, TITLE_UPPER(titleid), TITLE_LOWER(titleid)); dbg_printf("opendir(%s)\n", path_buffer); sdir = opendir(path_buffer); @@ -109,7 +109,7 @@ char *read_name_from_banner_app(u64 titleid) { continue; } - sprintf(path_buffer, "%s/title/%08x/%08x/content/%s", CFG.nand_emu_path, TITLE_HIGH(titleid), TITLE_LOW(titleid), entry->d_name); + sprintf(path_buffer, "%s/title/%08x/%08x/content/%s", CFG.nand_emu_path, TITLE_UPPER(titleid), TITLE_LOWER(titleid), entry->d_name); dbg_printf("fopen(%s)\n", path_buffer); fp = fopen(path_buffer, "rb"); @@ -159,7 +159,7 @@ char *read_name_from_banner_bin(u64 titleid) u32 filesize; FILE *fp; - sprintf(path, "%s/title/%08x/%08x/data/banner.bin", CFG.nand_emu_path, TITLE_HIGH(titleid), TITLE_LOW(titleid)); + sprintf(path, "%s/title/%08x/%08x/data/banner.bin", CFG.nand_emu_path, TITLE_UPPER(titleid), TITLE_LOWER(titleid)); fp = fopen(path, "rb"); if (fp == NULL) @@ -189,7 +189,7 @@ char *get_channel_name(u64 titleid, FILE *fp) { char *temp = NULL; u32 low; - low = TITLE_LOW(titleid); + low = TITLE_LOWER(titleid); // TODO // dbg_printf("Getting the name for: %08x...\n", titleid); diff --git a/source/menu.c b/source/menu.c index 2bf9ba8..c263c0d 100644 --- a/source/menu.c +++ b/source/menu.c @@ -61,6 +61,7 @@ #include "savegame.h" #include "channel.h" #include "RuntimeIOSPatch.h" +#include "titles.h" void _unstub_start(); @@ -70,10 +71,6 @@ u32 dolchunkcount; extern void __exception_closeall(); -#define TITLE_UPPER(x) ((u32)((x) >> 32)) -#define TITLE_LOWER(x) ((u32)(x)) -#define TITLE_ID(x,y) (((u64)(x) << 32) | (y)) - typedef void (*entrypoint) (void); #define CHANGE(V,M) {V+=change; if(V>(M)) V=(M); if(V<0) V=0;} @@ -397,7 +394,7 @@ s32 get_channel_list(void *outbuf, u32 size) channel->magic = CHANNEL_MAGIC; //strncpy(channel->path, path, strlen(path)); - u32 title_low = TITLE_LOW(strtol(entry->d_name,NULL,16)); + u32 title_low = TITLE_LOWER(strtol(entry->d_name,NULL,16)); memcpy(channel->id, &title_low, sizeof(u32)); char *name = get_channel_name(TITLE_ID(0x00010001, title_low),fp); strncpy(channel->title, name, sizeof(channel->title)); @@ -1061,7 +1058,7 @@ void Menu_GameInfoStr2(struct discHdr *header, char *str, u64 comp_size, u64 rea } if (game_tmd.sys_version) { s += strlen(s); - sprintf(s, " IOS%d\n\n", TITLE_LOW(game_tmd.sys_version)); + sprintf(s, " IOS%d\n\n", TITLE_LOWER(game_tmd.sys_version)); } else { s += strlen(s); sprintf(s, "\n\n"); @@ -4644,7 +4641,7 @@ L_repaint: } } if (game_tmd.sys_version) { - set_recommended_cIOS_idx(TITLE_LOW(game_tmd.sys_version), false); + set_recommended_cIOS_idx(TITLE_LOWER(game_tmd.sys_version), false); } } //dbg_printf("set ios: %d idx: %d\n", CFG.ios, CFG.game.ios_idx); diff --git a/source/rcstub.c b/source/rcstub.c new file mode 100644 index 0000000..3b4e728 --- /dev/null +++ b/source/rcstub.c @@ -0,0 +1,117 @@ +/* Load the open source "return to channel" stub + * + * Functions for manipulating the HBC stub by giantpune from PostLoader + * Stub from USBLoader GX and FIX94 work + * Adapted to Cfg USB Loader by NiTRo + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "rcstub.h" +#include "debug.h" + +extern const u8 stub_bin[]; +extern const u32 stub_bin_size; + +void stub_load ( void ) +{ + dbg_printf("stub_load()\n"); + + // Clear potential homebrew channel stub + memset((void*)0x80001800, 0, 0x1800); + // Copy our own stub into memory + memcpy((void*)0x80001800, stub_bin, stub_bin_size); + DCFlushRange((void*)0x80001800, 0x1800); + + return; +} + +void stub_unload ( void ) +{ + dbg_printf("stub_unload()\n"); + + memset((void*)0x80001800, 0, 0x1800); + DCFlushRange((void*)0x80001800, 0x1800); + + return; +} + +static char* stub_find_tid_addr ( void ) +{ + u32 *stub_id = (u32*) 0x80001818; + + //HBC stub 1.0.6 and lower, and stub.bin + if (stub_id[0] == 0x480004c1 && stub_id[1] == 0x480004f5) + return (char *) 0x800024C6; + //HBC stub changed @ version 1.0.7. this file was last updated for HBC 1.0.8 + else if (stub_id[0] == 0x48000859 && stub_id[1] == 0x4800088d) + return (char *) 0x8000286A; + return NULL; +} + +s32 stub_set_tid ( u64 new_tid ) +{ + char *stub_tid_addr = stub_find_tid_addr(); + if (!stub_tid_addr) return -68; + + stub_tid_addr[0] = TITLE_7( new_tid ); + stub_tid_addr[1] = TITLE_6( new_tid ); + stub_tid_addr[8] = TITLE_5( new_tid ); + stub_tid_addr[9] = TITLE_4( new_tid ); + stub_tid_addr[4] = TITLE_3( new_tid ); + stub_tid_addr[5] = TITLE_2( new_tid ); + stub_tid_addr[12] = TITLE_1( new_tid ); + stub_tid_addr[13] = ((u8) (new_tid)); + + DCFlushRange(stub_tid_addr, 0x10); + + return 0; +} + +s32 stub_set_splitted_tid ( u32 type, const char* new_lower ) +{ + const u32 lower = ((u32)new_lower[0] << 24) | + ((u32)new_lower[1] << 16) | + ((u32)new_lower[2] << 8) | + ((u32)new_lower[3]); + + return stub_set_tid(TITLE_ID( type, lower )); +} + + +u8 stub_available ( void ) +{ + char * sig = (char *) 0x80001804; + return (strncmp(sig, "STUBHAXX", 8) == 0); +} + +u64 stub_get_tid ( void ) +{ + if (!stub_available()) return 0; + + char ret[8]; + u64 retu = 0; + + char *stub = stub_find_tid_addr(); + 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; +} diff --git a/source/rcstub.h b/source/rcstub.h new file mode 100644 index 0000000..56d3f6b --- /dev/null +++ b/source/rcstub.h @@ -0,0 +1,21 @@ +/* Load the open source "return to channel" stub + * + * Functions for manipulating the HBC stub by giantpune from PostLoader + * Stub from USBLoader GX and FIX94 work + * Adapted to Cfg USB Loader by NiTRo + */ + +#ifndef _STUB_ +#define _STUB_ + +#include "titles.h" + +void stub_load ( void ); +void stub_unload ( void ); +s32 stub_set_tid ( u64 new_tid ); +s32 stub_set_splitted_tid ( u32 type, const char* new_lower ); +u8 stub_available ( void ); +u64 stub_get_tid ( void ); + +#endif + diff --git a/source/sys.c b/source/sys.c index 549ec12..b49cdf0 100644 --- a/source/sys.c +++ b/source/sys.c @@ -731,6 +731,7 @@ int ReloadIOS(int subsys, int verbose) } } } + if (is_ios_type(IOS_TYPE_WANIN) && IOS_GetRevision() >= 18) { //load_dip_249(); mk_mload_version(); @@ -853,10 +854,7 @@ void get_title_id() if (old_title_id <= 2) { // HBC reload stub -> assuming boot from HBC - if (strncmp("STUBHAXX", (char *)0x80001804, 8) == 0) - { - old_title_id = 0xAF1BF516; - } + old_title_id = HBC_LOWER_TID; } dbg_printf("channel id: %08X\n", old_title_id); } @@ -1536,7 +1534,7 @@ u8 get_base_ios_from_tmd(int ios_slot, u32 *version) { t = (tmd*)SIGNATURE_PAYLOAD(TMD); dbg_printf("\ntmd id: %llx %x-%x t: %x v: %d", - t->title_id, TITLE_HIGH(t->title_id), TITLE_LOW(t->title_id), + t->title_id, TITLE_UPPER(t->title_id), TITLE_LOWER(t->title_id), t->title_type, t->title_version); if (version) *version = t->title_version; @@ -1579,7 +1577,7 @@ retry:; for (mm = 0; mm < 2; mm++) { for (i = 0; i < ios_info_number; i++) { - if (ios_info[i].slot != TITLE_LOW(t->title_id)) continue; + if (ios_info[i].slot != TITLE_LOWER(t->title_id)) continue; if (memcmp((void *)hash, &ios_info[i].hash, sizeof(sha1)) == 0) { retValue = atoi(ios_info[i].info); @@ -1658,7 +1656,7 @@ char* get_iosx_info_from_tmd(int ios_slot, u32 *version) t = (tmd*)SIGNATURE_PAYLOAD(TMD); dbg_printf("\ntmd id: %llx %x-%x t: %x v: %d", - t->title_id, TITLE_HIGH(t->title_id), TITLE_LOW(t->title_id), + t->title_id, TITLE_UPPER(t->title_id), TITLE_LOWER(t->title_id), t->title_type, t->title_version); if (version) *version = t->title_version; @@ -1703,7 +1701,7 @@ retry:; for (mm = 0; mm < 2; mm++) { for (i = 0; i < ios_info_number; i++) { - if (ios_info[i].slot != TITLE_LOW(t->title_id)) continue; + if (ios_info[i].slot != TITLE_LOWER(t->title_id)) continue; if (memcmp((void *)hash, &ios_info[i].hash, sizeof(sha1)) == 0) { info = ios_info[i].info; @@ -1851,7 +1849,7 @@ char* get_ios_tmd_hash_str(char *str) if (ret != 0) goto out; t = (tmd*)SIGNATURE_PAYLOAD(TMD); dbg_printf("\ntmd id: %llx %x-%x t: %x v: %d", - t->title_id, TITLE_HIGH(t->title_id), TITLE_LOW(t->title_id), + t->title_id, TITLE_UPPER(t->title_id), TITLE_LOWER(t->title_id), t->title_type, t->title_version); // safety check if (t->title_id != TITLE_ID(1, IOS_GetVersion())) goto out; diff --git a/source/sys.h b/source/sys.h index 11724ec..c032d64 100644 --- a/source/sys.h +++ b/source/sys.h @@ -1,9 +1,7 @@ #ifndef _SYS_H_ #define _SYS_H_ -#define TITLE_ID(x,y) (((u64)(x) << 32) | (y)) -#define TITLE_HIGH(x) ((u32)((x) >> 32)) -#define TITLE_LOW(x) ((u32)(x)) +#include "titles.h" /* Prototypes */ void Sys_Init(void); diff --git a/source/titles.h b/source/titles.h new file mode 100644 index 0000000..01d5176 --- /dev/null +++ b/source/titles.h @@ -0,0 +1,34 @@ +/* + * Titles ID functions and defaults + */ + +#define TITLE_ID(x,y) (((u64)(x) << 32) | (y)) +#define TITLE_UPPER(x) ((u32)((x) >> 32)) +#define TITLE_LOWER(x) ((u32)(x)) + +#define TITLE_1(x) ((u8)((x) >> 8)) +#define TITLE_2(x) ((u8)((x) >> 16)) +#define TITLE_3(x) ((u8)((x) >> 24)) +#define TITLE_4(x) ((u8)((x) >> 32)) +#define TITLE_5(x) ((u8)((x) >> 40)) +#define TITLE_6(x) ((u8)((x) >> 48)) +#define TITLE_7(x) ((u8)((x) >> 56)) + +#define DOWNLOADED_CHANNELS 0x00010001 +#define SYSTEM_CHANNELS 0x00010002 +#define GAME_CHANNELS 0x00010004 + +//Region Free News Channel +#define RF_NEWS_CHANNEL 0x48414741 +//Region Free Forecast Channel +#define RF_FORECAST_CHANNEL 0x48414641 +//DVDX +#define DVDX_CHANNEL 0x44564458 +//HAXX (HBC old) +#define HBC_OLD_CHANNEL 0x48415858 +//JODI (HBC new) +#define HBC_NEW_CHANNEL 0x4A4F4449 +//.... (HBC 1.0.7+) +#define HBC_107_CHANNEL 0xAF1BF516 +//LULZ (HBC 1.1.2) +#define HBC_112_CHANNEL 0x4C554C5A \ No newline at end of file diff --git a/source/usb-loader.c b/source/usb-loader.c index bf2439e..f32052c 100644 --- a/source/usb-loader.c +++ b/source/usb-loader.c @@ -22,6 +22,8 @@ #include "console.h" #include "RuntimeIOSPatch.h" +#include "rcstub.h" + // libogc < 1.8.5 can hang if wiimote is initialized multiple times // (in case ios is reload 2x) so we delay wpad to later // libogc = 1.8.5 can crash if started with 2+ wiimotes @@ -71,6 +73,8 @@ void print_ios() int main(int argc, char **argv) { s32 ret; + signed_blob *buf = NULL; + u32 filesize; IOSPATCH_Apply(); @@ -247,6 +251,48 @@ int main(int argc, char **argv) goto out; } + /* identify HBC lower TID if installed */ + // check HBC 1.1.2+ (LULZ) first + ret = GetTMD(TITLE_ID(DOWNLOADED_CHANNELS,HBC_112_CHANNEL), &buf, &filesize); + SAFE_FREE(buf); + if (ret == 0) { + HBC_LOWER_TID = HBC_112_CHANNEL; + } else { + // check old 1.0.7+ + ret = GetTMD(TITLE_ID(DOWNLOADED_CHANNELS,HBC_107_CHANNEL), &buf, &filesize); + SAFE_FREE(buf); + if (ret == 0) { + HBC_LOWER_TID = HBC_107_CHANNEL; + } else { + // check older (JODI) + ret = GetTMD(TITLE_ID(DOWNLOADED_CHANNELS,HBC_NEW_CHANNEL), &buf, &filesize); + SAFE_FREE(buf); + if (ret == 0) { + HBC_LOWER_TID = HBC_NEW_CHANNEL; + } else { + // check oldest (HAXX) + ret = GetTMD(TITLE_ID(DOWNLOADED_CHANNELS,HBC_OLD_CHANNEL), &buf, &filesize); + SAFE_FREE(buf); + if (ret == 0) { + HBC_LOWER_TID = HBC_OLD_CHANNEL; + } + } + } + } + dbg_printf("HBC lower TID %08x\n", HBC_LOWER_TID); + + if (CFG.return_to > 2) + { + // Check if the title exists + ret = GetTMD(TITLE_ID(DOWNLOADED_CHANNELS,CFG.return_to), &buf, &filesize); + SAFE_FREE(buf); + if (ret == 0) { + stub_load (); + stub_set_splitted_tid(DOWNLOADED_CHANNELS,(char*)&(CFG.return_to)); + dbg_printf("stub_return_to_channel %08x\n", CFG.return_to); + } + } + /* Menu loop */ //dbg_printf("Menu_Loop\n"); //Wpad_WaitButtons(); Menu_Loop(); @@ -256,7 +302,9 @@ out: /* Restart */ exit(0); Restart_Wait(); - + + stub_unload (); + return 0; }