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); for (;;) { void *dst = NULL; s32 len = 0, offset = 0; /* Run apploader main function */ ret = appldr_main(&dst, &len, &offset); if (!ret) break; /* Read data from DVD */ WDVD_Read(dst, len, (u64)(offset << 2)); } /* Set entry point from apploader */ *entry = appldr_final(); return 0; }
u32 Apploader_Run() { app_entry appldr_entry; app_init appldr_init; app_main appldr_main; app_final appldr_final; char *dst; u32 len, offset; sync_before_read(TGCInfo, sizeof(struct _TGCInfo)); /* Read apploader header */ DVDLowRead(&apploader_hdr, 0x20, TGCInfo->tgcoffset + APPLDR_OFFSET); /* Calculate apploader length */ u32 appldr_len = apploader_hdr.size + apploader_hdr.trailersize; /* Read apploader code */ DVDLowRead(appldr, appldr_len, TGCInfo->tgcoffset + APPLDR_CODE); /* Flush into memory */ sync_before_exec(appldr, appldr_len); /* Set basic information */ *(vu32*)0x800000F8 = 243000000; // Bus Clock Speed *(vu32*)0x800000FC = 729000000; // CPU Clock Speed /* Set apploader entry function */ appldr_entry = apploader_hdr.entry; /* Call apploader entry */ appldr_entry(&appldr_init, &appldr_main, &appldr_final); /* Initialize apploader */ appldr_init(noprintf); while(appldr_main(&dst, &len, &offset)) { /* Read data from DVD */ PrepareTGC( offset ); DVDLowRead( dst, len, offset + TGCInfo->tgcoffset ); ParseTGC( dst, len, offset ); } /* Set entry point from apploader */ return (u32)appldr_final(); }
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(); }
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
s32 Apploader_Run(entry_point *entry, u8 cheat, u8 videoSelected, u8 vipatch, u8 patchcountrystring, u8 error002fix, u8 alternatedol, u32 alternatedoloffset) { app_entry appldr_entry; app_init appldr_init; app_main appldr_main; app_final appldr_final; u32 appldr_len; s32 ret; gprintf("\nApploader_Run() started\n"); //u32 geckoattached = usb_isgeckoalive(EXI_CHANNEL_1); //if (geckoattached)usb_flush(EXI_CHANNEL_1); geckoinit = InitGecko(); /* 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); if (error002fix!=0) { /* ERROR 002 fix (thanks to WiiPower for sharing this)*/ *(u32 *)0x80003188 = *(u32 *)0x80003140; } for (;;) { void *dst = NULL; int len = 0, offset = 0; /* Run apploader main function */ ret = appldr_main(&dst, &len, &offset); if (!ret) break; /* Read data from DVD */ WDVD_Read(dst, len, (u64)(offset << 2)); gamepatches(dst, len, videoSelected, patchcountrystring, vipatch, cheat); DCFlushRange(dst, len); } *entry = appldr_final(); /** Load alternate dol if set **/ if (alternatedol == 1) { wip_reset_counter(); void *dolbuffer = NULL; int dollen = 0; bool dolloaded = Load_Dol(&dolbuffer, &dollen, Settings.dolpath, videoSelected, patchcountrystring, vipatch, cheat); if (dolloaded) { *entry = (entry_point) load_dol_image(dolbuffer); } if(dolbuffer) free(dolbuffer); } else if (alternatedol == 2) { wip_reset_counter(); FST_ENTRY *fst = (FST_ENTRY *)*(u32 *)0x80000038; *entry = (entry_point) Load_Dol_from_disc(fst[alternatedoloffset].fileoffset, videoSelected, patchcountrystring, vipatch, cheat); if (*entry == 0) SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); } return 0; }