u32 Apploader_Run(u8 vidMode, GXRModeObj *vmode, bool vipatch, bool countryString, u8 patchVidModes, int aspectRatio) { void *dst = NULL; int len = 0; int offset = 0; u32 appldr_len; s32 ret; app_entry appldr_entry; app_init appldr_init; app_main appldr_main; app_final appldr_final; ret = WDVD_Read(&apploader_hdr, 0x20, APPLDR_OFFSET); wifi_printf("apploader_Apploader_Run: WDVD_Read() return value = %d\n", ret); if(ret < 0) return 0; appldr_len = apploader_hdr.size + apploader_hdr.trailersize; wifi_printf("apploader_Apploader_Run: appldr_len value = %08X\n", appldr_len); ret = WDVD_Read(appldr, appldr_len, APPLDR_CODE); wifi_printf("apploader_Apploader_Run: WDVD_Read() return value = %d\n", ret); if(ret < 0) return 0; DCFlushRange(appldr, appldr_len); ICInvalidateRange(appldr, appldr_len); appldr_entry = apploader_hdr.entry; appldr_entry(&appldr_init, &appldr_main, &appldr_final); appldr_init(gprintf); while(appldr_main(&dst, &len, &offset)) { WDVD_Read(dst, len, offset); wifi_printf("apploader_Apploader_Run: dst = %08X len = %08X offset = %08X\n", (u32)dst, (u32)len, (u32)offset); maindolpatches(dst, len, vidMode, vmode, vipatch, countryString, patchVidModes, aspectRatio); DCFlushRange(dst, len); ICInvalidateRange(dst, len); prog(10); } return (u32)appldr_final(); }
u32 Load_Dol_from_sd(void) { int ret; FILE* file; void *dol_header; u32 entrypoint; char fname[128]; char gameidbuffer4[5]; memset(gameidbuffer4, 0, 5); memcpy(gameidbuffer4, (char*)0x80000000, 4); snprintf(fname, sizeof(fname), "%s/%s.dol", gAltDolPath, gameidbuffer4); if (CFG.verbosemode) printf(" %s\n", fname); file = fopen(fname, "rb"); if(file == NULL) { // Why we need two same error messages? // printf(" Not found.\n"); // sleep(4); return 0; } int filesize; fseek(file, 0, SEEK_END); filesize = ftell(file); fseek(file, 0, SEEK_SET); dol_header = memalign(32, sizeof(dolheader)); if (dol_header == NULL) { printf("[+] Out of memory!\n"); sleep(2); fclose(file); return 0; } ret = fread( dol_header, 1, sizeof(dolheader), file); if(ret != sizeof(dolheader)) { printf("[+] Error reading .dol header\n"); sleep(2); free(dol_header); fclose(file); return 0; } entrypoint = load_dol_start(dol_header); if (entrypoint == 0) { printf("[+] Invalid .dol\n"); sleep(2); free(dol_header); fclose(file); return 0; } void *offset; u32 pos; u32 len; int sec_idx = 0; // printf(" ..."); while (load_dol_image(&offset, &pos, &len)) { if(pos+len > filesize) { printf("[+] .dol too small\n"); sleep(2); free(dol_header); fclose(file); return -1; } if (len != 0) { //dbg_printf("\rdol [%d] @ 0x%08x [%6x] 0x%08x\n", sec_idx, // (int)offset, len, (int)offset + len); fseek(file, pos, 0); ret = fread( offset, 1, len, file); if(ret != len) { printf("[+] Error reading .dol\n"); sleep(2); free(dol_header); fclose(file); return -1; } maindolpatches(offset, len); Remove_001_Protection(offset, len); } sec_idx++; // printf("."); } printf("\n"); free(dol_header); fclose(file); return entrypoint; } // Load_Dol_from_sd
s32 Apploader_Run(entry_point *entry) { app_entry appldr_entry; app_init appldr_init; app_main appldr_main; app_final appldr_final; u32 appldr_len; s32 ret; /* Read apploader header */ ret = WDVD_Read(buffer, 0x20, APPLDR_OFFSET); if (ret < 0) return ret; /* Calculate apploader length */ appldr_len = buffer[5] + buffer[6]; /* Read apploader code */ ret = WDVD_Read(appldr, appldr_len, APPLDR_OFFSET + 0x20); if (ret < 0) return ret; /* Set apploader entry function */ appldr_entry = (app_entry)buffer[4]; /* Call apploader entry */ appldr_entry(&appldr_init, &appldr_main, &appldr_final); /* Initialize apploader */ appldr_init(__noprint); /*HOOKS STUFF - FISHEARS*/ if (CFG.ocarina) { memset((void*)0x80001800,0,kenobiwii_size); memcpy((void*)0x80001800,kenobiwii,kenobiwii_size); DCFlushRange((void*)0x80001800,kenobiwii_size); hooktype = 1; memcpy((void*)0x80001800, (char*)0x80000000, 6); // For WiiRD } /*HOOKS STUFF - FISHEARS*/ for (;;) { void *dst = NULL; s32 len = 0, offset = 0; // GXRModeObj** table = NULL; // Run apploader main function ret = appldr_main(&dst, &len, &offset); if (!ret) break; /* Read data from DVD */ WDVD_Read(dst, len, (u64)(offset << 2)); // wiiNinja added for cIOS222/223. Code from Configurable USB Loader maindolpatches(dst, len); DCFlushRange(dst, len); } /* Set entry point from apploader */ *entry = appldr_final(); // Alternative dol (WiiPower) if (CFG.alt_dol) { u32 new_entry; if (CFG.verbosemode) printf("* Alternative .dol:"); new_entry = Load_Dol_from_sd(); if (new_entry == 0) { // Non-fatal error, continue without alt.dol if (CFG.verbosemode) printf("[+] Alternate .dol not found. Continue without it...\n"); sleep(2); } else if (new_entry == (u32)-1) { // fatal error return -1; } else { // ok. *entry = (void*)new_entry; if (CFG.verbosemode) printf("* Alternate .dol loaded OK!\n"); } } return 0; } // Apploader_Run