示例#1
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();
}
示例#2
0
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	
示例#3
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