int ocarina_load_code(const u8 *cheat, u32 cheatSize) { if (debuggerselect == 0x00) codelist = (u8 *) 0x800022A8; else codelist = (u8 *) 0x800028B8; codelistend = (u8 *) 0x80003000; if(cheatSize <= 0) { //gprintf("Ocarina: No codes found\n"); code_buf = NULL; code_size = 0; return 0; } code_size = cheatSize; code_buf = (u8*)MEM1_lo_alloc(code_size); if(code_buf == NULL) { gprintf("Ocarina: Couldnt allocate buffer!\n"); code_buf = NULL; code_size = 0; return 0; } memcpy(code_buf, cheat, code_size); gprintf("Ocarina: Codes found.\n"); DCFlushRange(code_buf, code_size); return code_size; }
void WiiFlow_ExternalBooter(u8 vidMode, bool vipatch, bool countryString, u8 patchVidMode, int aspectRatio, u32 returnTo, u8 BootType, bool use_led) { normalCFG.vidMode = vidMode; normalCFG.vipatch = vipatch; normalCFG.countryString = countryString; normalCFG.patchVidMode = patchVidMode; normalCFG.aspectRatio = aspectRatio; normalCFG.returnTo = returnTo; normalCFG.configbytes[0] = configbytes[0]; normalCFG.configbytes[1] = configbytes[1]; normalCFG.IOS = CurrentIOS; normalCFG.codelist = codelist; normalCFG.codelistend = codelistend; normalCFG.cheats = code_buf; normalCFG.cheatSize = code_size; normalCFG.hooktype = hooktype; normalCFG.debugger = debuggerselect; normalCFG.gameconf = gameconf; normalCFG.gameconfsize = gameconfsize; normalCFG.BootType = BootType; normalCFG.use_led = use_led; normalCFG.wip_list = get_wip_list(); normalCFG.wip_count = get_wip_count(); /* Copy CFG Into lower MEM1 so it doesnt get destroyed */ DCFlushRange(&normalCFG, sizeof(the_CFG)); the_CFG *lowCFG = (the_CFG*)MEM1_lo_alloc(sizeof(the_CFG)); memcpy(lowCFG, &normalCFG, sizeof(the_CFG)); DCFlushRange(&lowCFG, sizeof(the_CFG)); *EXT_ADDR_CFG = ((u32)lowCFG); /* Unmount devices etc */ ShutdownBeforeExit(); /* Wii Games will need it */ net_wc24cleanup(); /* Set proper time */ settime(secs_to_ticks(time(NULL) - 946684800)); /* Copy in booter */ memcpy(EXT_ADDR, booter_ptr, booter_size); DCFlushRange(EXT_ADDR, booter_size); /* Loader just for the booter */ memcpy(LDR_ADDR, extldr_ptr, extldr_size); DCFlushRange(LDR_ADDR, extldr_size); /* Boot it */ JumpToEntry(LDR_ENTRY); }
int app_gameconfig_load(const char *discid, u8 *tempgameconf, u32 tempgameconfsize) { if (gameconf == NULL) { gameconf = (u32*) MEM1_lo_alloc(65536); if (gameconf == NULL) return -1; } u32 ret; s32 gameidmatch, maxgameidmatch = -1, maxgameidmatch2 = -1; u32 i, numnonascii, parsebufpos; u32 codeaddr, codeval, codeaddr2, codeval2, codeoffset; u32 temp, tempoffset = 0; char parsebuffer[18]; // Remove non-ASCII characters numnonascii = 0; for (i = 0; i < tempgameconfsize; i++) { if (tempgameconf[i] < 9 || tempgameconf[i] > 126) numnonascii++; else tempgameconf[i - numnonascii] = tempgameconf[i]; } tempgameconfsize -= numnonascii; *(tempgameconf + tempgameconfsize) = 0; //gameconf = (tempgameconf + tempgameconfsize) + (4 - (((u32) (tempgameconf + tempgameconfsize)) % 4)); for (maxgameidmatch = 0; maxgameidmatch <= 6; maxgameidmatch++) { i = 0; while (i < tempgameconfsize) { maxgameidmatch2 = -1; while (maxgameidmatch != maxgameidmatch2) { while (i != tempgameconfsize && tempgameconf[i] != ':') i++; if (i == tempgameconfsize) break; while ((tempgameconf[i] != 10 && tempgameconf[i] != 13) && (i != 0)) i--; if (i != 0) i++; parsebufpos = 0; gameidmatch = 0; while (tempgameconf[i] != ':') { if (tempgameconf[i] == '?') { parsebuffer[parsebufpos] = discid[parsebufpos]; parsebufpos++; gameidmatch--; i++; } else if (tempgameconf[i] != 0 && tempgameconf[i] != ' ') parsebuffer[parsebufpos++] = tempgameconf[i++]; else if (tempgameconf[i] == ' ') break; else i++; if (parsebufpos == 8) break; } parsebuffer[parsebufpos] = 0; if (strncasecmp("DEFAULT", parsebuffer, strlen(parsebuffer)) == 0 && strlen(parsebuffer) == 7) { gameidmatch = 0; goto idmatch; } if (strncasecmp(discid, parsebuffer, strlen(parsebuffer)) == 0) { gameidmatch += strlen(parsebuffer); idmatch: if (gameidmatch > maxgameidmatch2) { maxgameidmatch2 = gameidmatch; } } while ((i != tempgameconfsize) && (tempgameconf[i] != 10 && tempgameconf[i] != 13)) i++; } while (i != tempgameconfsize && tempgameconf[i] != ':') { parsebufpos = 0; while ((i != tempgameconfsize) && (tempgameconf[i] != 10 && tempgameconf[i] != 13)) { if (tempgameconf[i] != 0 && tempgameconf[i] != ' ' && tempgameconf[i] != '(' && tempgameconf[i] != ':') parsebuffer[parsebufpos++] = tempgameconf[i++]; else if (tempgameconf[i] == ' ' || tempgameconf[i] == '(' || tempgameconf[i] == ':') break; else i++; if (parsebufpos == 17) break; } parsebuffer[parsebufpos] = 0; //if (!autobootcheck) { if (strncasecmp("codeliststart", parsebuffer, strlen(parsebuffer)) == 0 && strlen(parsebuffer) == 13) { sscanf((char *) (tempgameconf + i), " = %x", (unsigned int *) &codelist); } if (strncasecmp("codelistend", parsebuffer, strlen(parsebuffer)) == 0 && strlen(parsebuffer) == 11) { sscanf((char *) (tempgameconf + i), " = %x", (unsigned int *) &codelistend); } if (strncasecmp("poke", parsebuffer, strlen(parsebuffer)) == 0 && strlen(parsebuffer) == 4) { ret = sscanf((char *) tempgameconf + i, "( %x , %x", &codeaddr, &codeval); if (ret == 2) { *(gameconf + (gameconfsize / 4)) = 0; gameconfsize += 4; *(gameconf + (gameconfsize / 4)) = 0; gameconfsize += 8; *(gameconf + (gameconfsize / 4)) = codeaddr; gameconfsize += 4; *(gameconf + (gameconfsize / 4)) = codeval; gameconfsize += 4; DCFlushRange((void *) (gameconf + (gameconfsize / 4) - 5), 20); } } if (strncasecmp("pokeifequal", parsebuffer, strlen(parsebuffer)) == 0 && strlen(parsebuffer) == 11) { ret = sscanf((char *) (tempgameconf + i), "( %x , %x , %x , %x", &codeaddr, &codeval, &codeaddr2, &codeval2); if (ret == 4) { *(gameconf + (gameconfsize / 4)) = 0; gameconfsize += 4; *(gameconf + (gameconfsize / 4)) = codeaddr; gameconfsize += 4; *(gameconf + (gameconfsize / 4)) = codeval; gameconfsize += 4; *(gameconf + (gameconfsize / 4)) = codeaddr2; gameconfsize += 4; *(gameconf + (gameconfsize / 4)) = codeval2; gameconfsize += 4; DCFlushRange((void *) (gameconf + (gameconfsize / 4) - 5), 20); } } if (strncasecmp("searchandpoke", parsebuffer, strlen(parsebuffer)) == 0 && strlen(parsebuffer) == 13) { ret = sscanf((char *) (tempgameconf + i), "( %x%n", &codeval, &tempoffset); if (ret == 1) { gameconfsize += 4; temp = 0; while (ret == 1) { *(gameconf + (gameconfsize / 4)) = codeval; gameconfsize += 4; temp++; i += tempoffset; ret = sscanf((char *) (tempgameconf + i), " %x%n", &codeval, &tempoffset); } *(gameconf + (gameconfsize / 4) - temp - 1) = temp; ret = sscanf((char *) (tempgameconf + i), " , %x , %x , %x , %x", &codeaddr, &codeaddr2, &codeoffset, &codeval2); if (ret == 4) { *(gameconf + (gameconfsize / 4)) = codeaddr; gameconfsize += 4; *(gameconf + (gameconfsize / 4)) = codeaddr2; gameconfsize += 4; *(gameconf + (gameconfsize / 4)) = codeoffset; gameconfsize += 4; *(gameconf + (gameconfsize / 4)) = codeval2; gameconfsize += 4; DCFlushRange((void *) (gameconf + (gameconfsize / 4) - temp - 5), temp * 4 + 20); } else gameconfsize -= temp * 4 + 4; } } } if (tempgameconf[i] != ':') { while ((i != tempgameconfsize) && (tempgameconf[i] != 10 && tempgameconf[i] != 13)) i++; if (i != tempgameconfsize) i++; } } if (i != tempgameconfsize) while ((tempgameconf[i] != 10 && tempgameconf[i] != 13) && (i != 0)) i--; } } return 0; }