#include #include #include #include #include #include #include "filelist.h" using namespace std; string HBC_version; template s8 free_pointer(pointer*& ptr) { if(ptr != NULL) { if( sizeof(pointer) > 0 ) { //protection incase empty type was given memset(ptr,0,sizeof(pointer)); } free(ptr); ptr = NULL; return 0; } else { return -1; } } char * DetectHBC_version(const tmd *t) { static char desc[10]; if (t->title_version) snprintf(desc, sizeof(desc), "%d.%d", t->title_version >> 8, t->title_version & 0xFF); /* if (t->sys_version) snprintf(desc, sizeof(desc), "%s FW: IOS%llu ", desc, t->sys_version & 0xff); */ return desc; } u64 DetectHBC() { u64 *list; u32 titlecount; s32 ret; vector TitleID; TitleID.push_back(0x0001000148415858LL); //HAXX TitleID.push_back(0x000100014A4F4449LL); //JODI TitleID.push_back(0x00010001AF1BF516LL); //>=0.7 ret = ES_GetNumTitles(&titlecount); if(ret < 0) { printf("DetectHBC: ES_GetNumTitles Fehler\n"); return 0; } list = (u64*)memalign(32, titlecount * sizeof(u64) + 32); ret = ES_GetTitles(list, titlecount); if(ret < 0) { printf("DetectHBC: ES_GetTitles Error\n"); free_pointer(list); return 0; } ret = 0; //lets check for known HBC title id's. for(u32 i=0; i=0.7 { if(ret < 3) { ret = 3; HBC_version = DetectHBC_version((tmd *)SIGNATURE_PAYLOAD(s_tmd)); } } } free_pointer(list); if(ret != 0) return TitleID[ret -1]; else printf("ERROR_FIND_HBC\n"); return 0; } void LoadHBC() { u64 TitleID = DetectHBC(); if(TitleID != 0) { u32 cnt ATTRIBUTE_ALIGN(32); ES_GetNumTicketViews(TitleID, &cnt); tikview *views = (tikview *)memalign( 32, sizeof(tikview)*cnt ); ES_GetTicketViews(TitleID, views, cnt); ES_LaunchTitle(TitleID, &views[0]); } else { //well that went wrong printf("ERROR_BOOT_HBC\n"); } } bool CheckAppFound(u64 title) { char tmd[ISFS_MAXPATH]; u32 high = (u32)(title >> 32); u32 low = (u32)(title & 0xFFFFFFFF); sprintf(tmd, "/title/%08x/%08x/content/00000000.app", high, low); s32 check = ISFS_Open(tmd, ISFS_OPEN_READ); if(check == -102 || check > 0) { ISFS_Close(check); return true; } return false; } 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; } int DetectHBF() { u64 *list; u32 titlecount; int ret; vector TitleID; TitleID.push_back(0x0001000154484246LL); //THBF // TitleID.push_back(0x0001000148424630LL); //HBF0 ret = ES_GetNumTitles(&titlecount); if(ret < 0) { printf("DetectHBF: ES_GetNumTitles Fehler\n"); return 0; } list = (u64*)memalign(32, titlecount * sizeof(u64) + 32); ret = ES_GetTitles(list, titlecount); if(ret < 0) { printf("DetectHBF: ES_GetTitles Error\n"); free_pointer(list); return 0; } ret = 0; //lets check for known HBF title id's. for(u32 i=0; i