Пример #1
0
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;
}
Пример #2
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();
}
Пример #3
0
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();
}
Пример #4
0
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
Пример #5
0
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;
}