Beispiel #1
0
bool readch (s_channelConfig *cc)
{
    s32 ret;
    char path[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);

    Debug ("neek_PLNandInfo [begin]");

    ISFS_Initialize ();

    sprintf (path, "/sneek/nandcfg.ch");

    s32 fd;

    fd = ISFS_Open( path, ISFS_OPEN_READ);
    ret = -1;
    if (fd > 0)
    {
        ret = ISFS_Read(fd, cc, sizeof(s_channelConfig));
        ISFS_Close(fd);
    }

    ISFS_Deinitialize ();

    if (ret >= 0) return true;
    return false;
}
Beispiel #2
0
bool LoadPostloaderFromISFS (void)
{
    char path[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);

    ISFS_Initialize();

    strcpy (path, "/apps/postLoader/boot.dol");

    s32 fd = ISFS_Open (path, ISFS_OPEN_READ);
    if (fd < 0)
        goto fail;
    s32 filesize = ISFS_Seek(fd, 0, 2);
    if (filesize == 0)
        goto fail;
    ISFS_Seek (fd, 0, 0);

    // exeBuffer is already 32bit aligned... should work fine
    s32 readed = ISFS_Read (fd, exeBuffer, filesize);
    ISFS_Close (fd);

    if (readed != filesize)
        goto fail;

    return TRUE;

fail:
    ISFS_Deinitialize ();
    return FALSE;
}
Beispiel #3
0
void RestoreSneekFolder (void)
{
    s32 fd;
    int ret;

    char path[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);
    char pathBak[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);

    Debug ("RestoreSneekFolder [begin]");

    ISFS_Initialize ();

    sprintf (path, "/sneek/nandpath.bin");
    ret = ISFS_Delete (path);
    Debug ("RestoreSneekFolder: delete '%s' = %d", path, ret);

    sprintf (path, "/sneek/nandcfg.pl");
    ret = ISFS_Delete (path);
    Debug ("RestoreSneekFolder: delete '%s' = %d", path, ret);

    ret = sprintf (path, "/sneek/nandcfg.ch");
    ISFS_Delete (path);
    Debug ("RestoreSneekFolder: delete '%s' = %d", path, ret);

    sprintf (path, "/title/00000001/00000002/data/loader.ini");
    sprintf (pathBak, "/title/00000001/00000002/data/loader.bak");

    fd = ISFS_Open(pathBak, ISFS_OPEN_READ);
    if (fd > 0)
    {
        ISFS_Close(fd);

        ret = ISFS_Delete (path);
        Debug ("RestoreSneekFolder: delete '%s' = %d", path, ret);
        ret = ISFS_Rename (pathBak, path);
        Debug ("RestoreSneekFolder: rename '%s'->'%s' = %d", pathBak, path, ret);
    }

    sprintf (path, "/sneek/nandcfg.bin");
    sprintf (pathBak, "/sneek/nandcfg.bak");

    fd = ISFS_Open(pathBak, ISFS_OPEN_READ);
    if (fd > 0)
    {
        ISFS_Close(fd);

        ret = ISFS_Delete (path);
        Debug ("RestoreSneekFolder: delete '%s' = %d", path, ret);
        ret = ISFS_Rename (pathBak, path);
        Debug ("RestoreSneekFolder: rename '%s'->'%s' = %d", pathBak, path, ret);
    }

    ISFS_Deinitialize ();

    Debug ("RestoreSneekFolder [end]");
}
Beispiel #4
0
void AppCleanUp(void)
{
	static bool app_clean = false;
	if(app_clean)
		return;

	app_clean = true;

	BannerAsync::ThreadExit();

	if(Settings.CacheTitles)
		GameTitles.WriteCachedTitles(Settings.titlestxt_path);
	Settings.Save();

	ExitGUIThreads();
	StopGX();
	wiilight(0);

	delete btnSoundClick;
	delete btnSoundOver;
	delete btnSoundClick2;
	delete bgMusic;
	delete background;
	delete bgImg;
	delete mainWindow;
	for (int i = 0; i < 4; i++)
		delete pointer[i];

	gettextCleanUp();
	Theme::CleanUp();
	NewTitles::DestroyInstance();
	ThreadedTask::DestroyInstance();
	SoundHandler::DestroyInstance();
	GCGames::DestroyInstance();
	DeinitNetwork();
	GameTitles.SetDefault();

	ShutdownAudio();

	ResourceManager::DestroyInstance();

	WPAD_Shutdown();
	ISFS_Deinitialize();
}
Beispiel #5
0
void RestoreSM (int nidx)
{
    bool find = FALSE;
    char path[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);
    char pathBack[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);
    char *sm[] = {"00000088","00000085","0000008b","0000008e","00000098","00000095","0000009b","0000009e"};
    s32 smsize;
    bool issm = FALSE;

    ISFS_Initialize();

    int i;
    s32 fd;
    for (i = 0; i < sizeof(sm) / sizeof(char*); i++)
    {
        sprintf (path, "%s/title/00000001/00000002/content/%s.app", nandConfig->NandInfo[nidx], sm[i]);
        sprintf (pathBack, "%s/title/00000001/00000002/content/%s.bak", nandConfig->NandInfo[nidx], sm[i]);

        fd = ISFS_Open (path, ISFS_OPEN_READ);
        Debug ("ReplaceNandSystemMenu: checking %s (%d)", sm[i], fd);

        if (fd < 0) continue;
        smsize = ISFS_Seek(fd, 0, 2);

        Debug ("ReplaceNandSystemMenu: sm size %d", smsize);

        if (smsize > 1000000) // E' piu' grande di 1MB... e' il sistem menu
            issm = TRUE;

        ISFS_Close (fd);
        find = TRUE;
        break;
    }

    if (find && !issm)
    {
        // Restore filesistem
        ISFS_Delete (path);
        ISFS_Rename (pathBack, path);
    }

    ISFS_Deinitialize ();
}
Beispiel #6
0
int Playlog_Create(void)
{
	s32 fd = IOS_Open(PLAYRECPATH, IPC_OPEN_RW);
	if(fd >= 0)
	{
		//exists
		IOS_Close(fd);
		return 0;
	}

	ISFS_Initialize();

	//In case the play_rec.dat wasn´t found create one and try again
	int ret = ISFS_CreateFile(PLAYRECPATH, 0, 3, 3, 3);
	if(ret >= 0)
		ISFS_SetAttr(PLAYRECPATH, 0x1000, 1, 0, 3, 3, 3);

	ISFS_Deinitialize();

	return ret;
}
Beispiel #7
0
void RestorePriiloader (int nidx)
{
    char path[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);
    char pathBack[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);

    ISFS_Initialize();

    sprintf (path, "%s/title/00000001/00000002/data/main.bin", nandConfig->NandInfo[nidx]);
    sprintf (pathBack, "%s/title/00000001/00000002/data/main.bak", nandConfig->NandInfo[nidx]);

    ISFS_Delete (path);
    ISFS_Rename (pathBack, path);

    sprintf (path, "%s/title/00000001/00000002/data/loader.ini", nandConfig->NandInfo[nidx]);
    sprintf (pathBack, "%s/title/00000001/00000002/data/loader.bak", nandConfig->NandInfo[nidx]);

    ISFS_Delete (path);
    ISFS_Rename (pathBack, path);

    ISFS_Deinitialize ();
}
s32 what_to_do()
{
	u32 pressed;
	u32 pressedGC;
	int selection = 0;
	int ret;
	char *optionsstring[3] = { "<Install IOS118 and 118 Channel>", "<Uninstall IOS118 and 118 Channel>", "<Exit>" };
	
	while (true)
	{
		Con_ClearLine();
		
		set_highlight(true);
		printf(optionsstring[selection]);
		set_highlight(false);
		
		waitforbuttonpress(&pressed, &pressedGC);
		
		if (pressed == WPAD_BUTTON_LEFT || pressedGC == PAD_BUTTON_LEFT)
		{
			if (selection > 0)
			{
				selection--;
			} else
			{
				selection =2;
			}
		}

		if (pressed == WPAD_BUTTON_RIGHT || pressedGC == PAD_BUTTON_RIGHT)
		{
			if (selection < 2)
			{
				selection++;
			} else
			{
				selection = 0;
			}
		}

		if (pressed == WPAD_BUTTON_A || pressedGC == PAD_BUTTON_A)
		{
			printf("\n");
			if (selection == 0) {
				printf("About to install IOS118\n");
				ret = Install_patched_IOS(36, IOS36version, true, true, true, true, 118, 65535, false);
				if (ret < 0) {
					printf("IOS118 Install failed.  Press any button to exit...\n");
					waitforbuttonpress(NULL, NULL);
					Reboot();
				}
				
				printf("\nStep 1 Complete!\n");
				printf("IOS118 Installation is complete!\n");
				
				install_channel_118();

				printf("\nStep 2 Complete!\n");
				
				printf("118Channel Installation is complete!\n");
				printf("Press any button to exit...\n");
				waitforbuttonpress(NULL, NULL);
				
				Reboot();
				return 0;
			}
			
			if (selection == 1)
			{
				ISFS_Initialize();
				Uninstall_DeleteTicket(1, 118);
				Uninstall_DeleteTitle(1, 118);
				Uninstall_118Channel_all();
				ISFS_Deinitialize();
			}
			if (selection == 2)
			{
				Reboot();
			}
		}
	}
}
Beispiel #9
0
void miscdeinit(void)
{
	fflush(stdout);
	ISFS_Deinitialize();
}
Beispiel #10
0
s32 Settings_Menu()
{
	s32 ret = 0;
	u32 pressed;
	int i, selection = 0;
	char *menu_opt[3] = { "Device menu", "Update application", "Reload to another IOS (device remount required)" };
	
	while(true)
	{
		resetscreen();
		printheadline();
		
		printf("Select an option. Press B to go back to the menu.\n\n");
		
		for (i = 0; i <= 2; i++)
		{
			printf("%s %s\n", ((selection == i) ? ARROW : "  "), menu_opt[i]);
		}
		
		pressed = DetectInput(DI_BUTTONS_DOWN);
		
		if (pressed == WPAD_BUTTON_UP)
		{
			if (selection > 0) selection--;
		}
		
		if (pressed == WPAD_BUTTON_DOWN)
		{
			if (selection < 2) selection++;
		}
		
		if (pressed == WPAD_BUTTON_A)
		{
			switch (selection)
			{
				case 0:
					/* Device menu */
					ret = Device_Menu(true);
					break;
				case 1:
					/* Update application */
					UpdateYABDM(launch_path);
					break;
				case 2:
					/* IOS reload */
					ret = ios_selectionmenu(249);
					if (ret > 0)
					{
						if (ret != IOS_GetVersion())
						{
							/* Unmount devices */
							ISFS_Deinitialize();
							Unmount_Devices();
							
							KeepAccessRightsAndReload(ret, true);
							
							/* Remount devices */
							ISFS_Initialize();
							ret = Mount_Devices();
							if (ret != -2) logfile_header();
						} else {
							printf("\t- IOS reload aborted (IOS%ld is already loaded).", ret);
							waitforbuttonpress();
						}
					} else
					if (ret == 0)
					{
						printf("\t- Proceeding without IOS reload...");
						waitforbuttonpress();
					}
					
					break;
				default:
					break;
			}
			
			break;
		}
		
		if (pressed == WPAD_BUTTON_B) break;
	}
	
	return ret;
}
Beispiel #11
0
int Device_Menu(bool swap)
{
	u32 pressed;
	int i, selection = 0;
	char *dev_opt[2] = { "SD Card", "USB Storage" };
	
	while(true)
	{
		resetscreen();
		printheadline();
		
		printf("Current device: %s.\n\n", DEVICE(1));
		printf("Select the new output device. ");
		printf("%s.\n\n", (swap ? "Press B to swap/remount the storage devices" : "Device swapping is not allowed"));
		
		for (i = 0; i <= 1; i++)
		{
			printf("%s %s %s\n", ((selection == i) ? ARROW : "  "), dev_opt[i], (((i == 0 && SDmnt) || (i == 1 && USBmnt)) ? "(available)" : "(not available)"));
		}
		
		pressed = DetectInput(DI_BUTTONS_DOWN);
		
		if (pressed == WPAD_BUTTON_UP)
		{
			if (selection > 0) selection--;
		}
		
		if (pressed == WPAD_BUTTON_DOWN)
		{
			if (selection < 1) selection++;
		}
		
		if (pressed == WPAD_BUTTON_A)
		{
			/* Do not exit this screen if the user attempts to select an unavailable storage device */
			if ((selection == 0 && SDmnt) || (selection == 1 && USBmnt))
			{
				/* Detect if the selected device is being already used */
				if ((selection == 0 && !isSD) || (selection == 1 && isSD))
				{
					/* Do the magic */
					isSD ^= 1;
					
					if (debug_file)
					{
						fclose(debug_file);
						logfile_header();
						logfile("Device changed from %s to %s.\r\n\r\n", (selection == 0 ? "USB" : "SD"), DEVICE(1));
					}
				}
				
				return 0;
			}
		}
		
		if (pressed == WPAD_BUTTON_B)
		{
			if (swap) break;
		}
	}
	
	resetscreen();
	printheadline();
	
	Unmount_Devices();
	
	printf("Swap the current storage devices if you want to use different ones.\n");
	printf("Press A when you're done to mount them.\n");
	printf("Otherwise, you can just remount the devices already connected.");
	
	while(true)
	{
		pressed = DetectInput(DI_BUTTONS_DOWN);
		if (pressed == WPAD_BUTTON_A) break;
	}
	
	/* If the currently running IOS is a Waninkoko/d2x cIOS, we have to reload it before we can retry the USB ports */
	s32 ios = IOS_GetVersion();
	if (ios >= 200 && !IsHermesIOS(ios))
	{
		/* Unmount NAND */
		ISFS_Deinitialize();
		
		/* Do our thing */
		KeepAccessRightsAndReload(ios, false);
		
		/* Remount NAND */
		ISFS_Initialize();
	}
	
	int ret = Mount_Devices();
	if (ret < 0) return ret;
	
	logfile_header();
	return 0;
}
int main(int argc, char* argv[])
{
	__exception_setreload(10);
	
	int i, ret;
	
	Init_Console();
	printf("\x1b[%u;%um", 37, false);
	
	PAD_Init();
	WPAD_Init();
	WPAD_SetDataFormat(WPAD_CHAN_0, WPAD_FMT_BTNS_ACC_IR);
	
	printheadline();
	
	ret = ahbprot_menu();
	if (ret < 0)
	{
		ret = ios_selectionmenu(236);
		if (ret > 0)
		{
			printf("\t- Reloading to IOS%d... ", ret);
			WPAD_Shutdown();
			IOS_ReloadIOS(ret);
			sleep(2);
			PAD_Init();
			WPAD_Init();
			WPAD_SetDataFormat(WPAD_CHAN_0, WPAD_FMT_BTNS_ACC_IR);
			printf("done.\n\n");
		} else
		if (ret == 0)
		{
			printf("\t- Proceeding without IOS reload...\n\n");
		} else {
			Reboot();
		}
	}
	
	resetscreen();
	printheadline();
	
	/* Initialize NAND FS */
	ISFS_Initialize();
	
	/* Do our stuff */
	char path[ISFS_MAXPATH];
	char *filenames[10] = { "misc.bin", "nwc24dl.bin", "nwc24fl.bin", "nwc24fls.bin", "nwc24msg.cbk", "nwc24msg.cfg", \
							"mbox/wc24recv.ctl", "mbox/wc24recv.mbx", "mbox/wc24send.ctl", "mbox/wc24send.mbx" };
	
	for (i = 0; i < 10; i++)
	{
		snprintf(path, MAX_CHARACTERS(path), "/shared2/wc24/%s", filenames[i]);
		
		printf("%u. Deleting \"%s\"... ", i + 1, path);
		ret = ISFS_Delete(path);
		if (ret < 0)
		{
			switch (ret)
			{
				case -1:
				case -102:
					printf("\n\t- Error: Permission denied!");
					break;
				case -2:
				case -105:
					printf("\n\t- Error: File exists!");
					break;
				case -4:
				case -101:
					printf("\n\t- Error: Invalid argument!");
					break;
				case -6:
				case -106:
					printf("\n\t- Error: File not found!");
					break;
				case -8:
				case -118:
					printf("\n\t- Error: Resource busy!");
					break;
				case -12:
				case -103:
				case -114:
					printf("\n\t- Error: NAND ECC failure!");
					break;
				case -22:
					printf("\n\t- Error: Memory allocation failed during request!");
					break;
				case -107:
				case -109:
					printf("\n\t- Error: Too many files open!");
					break;
				case -108:
					printf("\n\t- Error: Memory full!");
					break;
				case -110:
					printf("\n\t- Error: Path name is too long!");
					break;
				case -111:
					printf("\n\t- Error: File already open!");
					break;
				case -115:
					printf("\n\t- Error: Directory not empty!");
					break;
				case -116:
					printf("\n\t- Error: Max directory depth exceeded!");
					break;
				default:
					printf("\n\t- FATAL / UNKNOWN ERROR!!!");
			}
			
			printf(" (ret = %d)\n\n", ret);
			
			if (ret <= -119) break;
		} else {
			printf("OK!\n\n");
		}
		
		usleep(2000000); // 2 seconds
	}
	
	/* Unmount NAND FS and exit */
	ISFS_Deinitialize();
	Reboot();
	
	return 0;
}
Beispiel #13
0
int main(int argc, char* argv[])
{
	int ret;
	u32 pressed;
	u32 pressedGC;	

	Init_Console();
	printf("\x1b[%u;%um", 37, false);

	PAD_Init();
	WPAD_Init();
	WPAD_SetDataFormat(WPAD_CHAN_0, WPAD_FMT_BTNS_ACC_IR);					

	printheadline();


	ret = *((int *)MAGIC1);
	if (ret == MAGIC2) {
		ret = *((int *)MAGIC3);
		if (ret == MAGIC4) {
			ret = *((int *)MAGIC3 + 1);
			printf("\nSo this now makes %d times you've tried to rerun me, pirate.\n", ret);
			printf("I told you before, you need to try harder than that.\n\n");
			printf("Keep trying and I'll give you a hint...\n\n");
			if (ret > 5) {
				printf("You're persistent aren't you?  Here's a hint:\nShow me that you don't pirate all of your Wii games.\n\n");
			}
			if (ret > 10) {
				printf("You're really persistent!  The hint means to play a game normally in your Wii.\n");
				printf("There are other ways around the trap too, but figure them out yourself.\n");
			}
			ret++;
		} else {
			ret = 2;
			printf("\nSo you tell me you're a pirate and you expect that running\n");
			printf("the application a second time is enough for me to forgive you?\n");
			printf("You're going to have to try something harder than that, mate.\n");
			*((int *)MAGIC3) = MAGIC4;
		}
		*((int *)MAGIC3 + 1) = ret;
		sleep(ret*2);
		printf("\nPress any button to exit...\n");
		waitforbuttonpress(NULL, NULL);
	
		Reboot();
	}

	
	
	printf("WARNING: If you are not connected to the Internet, this app might crash.\n");
	printf("If you get a DSI error, rerun the app and be a little quicker.\n\n");
	printf("\nThis Application will install IOS236 onto your Wii.\n");
	printf("It relies on the fact that you launched this app with.\n");
	printf("the AHBPROT flags set, so you must be using HBC 1.07 or\n");
	printf("later.\n");
	printf("\nIOS236 is a patched IOS36 v3351 and this app can be used\n");
	printf("instead of the Trucha Bug Restorer, upon which the app\n");
	printf("was based.\n");
	printf("\nThis application should work on all Wii firmwares 4.3 and below,\n");
	printf("and as long as the HBC supports AHBPROT, it should work on newer\n");
	printf("firmwares too.  It is safe to use this application to reinstall\n");
	printf("IOS236 or replace a different IOS236.\n");
	printf("\nThanks, in no particular order, go to Wiipower, oggzee, Team Twiizers,\n");
	printf("tona, Joseph Jordan and anybody else who has code included in\n");
	printf("the app.  The app was quite a simple job, built upon their\n");
	printf("actual real work.\n");
	/*printf("\nPlease Wait...\n");
	
	time_t t = time(NULL) + 7;
	while (time(NULL) < t)
	{
		WPAD_ScanPads();
		PAD_ScanPads();
		if(WPAD_ButtonsDown(0) || PAD_ButtonsDown(0)) 
		{
			printf("Don't be impatient, press any button to exit...\n");
			waitforbuttonpress(NULL, NULL);
			Reboot();
		}
	}*/

	printf("Press 1 or Start to start the application...\n");

	
	waitforbuttonpress(&pressed, &pressedGC);
	if (pressed != WPAD_BUTTON_1 && pressedGC != PAD_BUTTON_START)
	{
		printf("Other button pressed, press any button to exit...\n");
		waitforbuttonpress(NULL, NULL);
		Reboot();
	}

	printf("Performing Step 1\n");

	printf("Patching IOS\n");
	if (!IOSPATCH_Apply()) {
        printf("Unable to initialise the initial patches.\n");
		printf("This either means you didn't follow the download\n");
		printf("and launching instructions correctly, or your IOS\n");
		printf("is not vulnerable for an unknown reason.\n");
		printf("Perhaps you need to update the Homebrew Channel (HBC).\n");
		printf("Installation cannot continue.  Press any button to exit...\n");
        waitforbuttonpress(NULL, NULL);
		Reboot();
    }
	printf("IOS patched\n");
	printf("About to install IOS236\n");

	ret = Install_patched_IOS(36, IOS36version, true, true, true, true, 236, 65535, false);
	if (ret < 0) {
		printf("IOS236 Install failed.  Press any button to exit...\n");
		waitforbuttonpress(NULL, NULL);
		Reboot();
	}

	printf("\nStep 1 Complete!\n");
	printf("\nStep 2 is an alteration that is only needed if you plan\n");
	printf("to play games you don't own the original disc for.\n");
	printf("Do you need this alteration?\n\n");
	printf("Press the 1 or X button if you want to play pirated games.\n");
	printf("Press the 2 or Y button if you have no need for piracy.\n");
	char found = 0;
	while(!found) {
		waitforbuttonpress(&pressed, &pressedGC);
		if (pressed == WPAD_BUTTON_1 || pressedGC == PAD_BUTTON_X) {
			found = 1;
		}
		if (pressed == WPAD_BUTTON_2 || pressedGC == PAD_BUTTON_Y) {
			found = 2;
		}
	}

	if (found == 1) {
		printf("\nPerforming Step 2\n");
		ISFS_Initialize();
		Uninstall_DeleteTicket(1, 236);
		Uninstall_DeleteTitle(1, 236);
		ISFS_Deinitialize();
		*((int *)MAGIC1) = MAGIC2;
		printf("\nStep 2 Complete!\n");
		printf("\nStep 2 was to delete IOS236.  You will need\n");
		printf("to install it again.\n\n");
		printf("Shame on you for being a pirate!\n");
		printf("Sorry if you were just curious or not paying\n");
		printf("attention, but you need to learn to be careful.\n\n");
		printf("While I can't stop you from lying next time,\n");
		printf("I can at least have the satisfaction that I've\n");
		printf("wasted some of your time.\n");
		printf("\nSeriously, though.  Developers do deserve to be paid\n");
		printf("to provide you with entertainment.  At least consider\n");
		printf("buying any game that you play a lot, or that you enjoy\n");
		printf("enough to finish.\n");
		printf("\nOh, and just be glad I didn't delete your HBC ;)\n");
		sleep(10);
		printf("Press any button to exit\n");
		waitforbuttonpress(NULL, NULL);
		Reboot();
	}

	printf("IOS236 Installation is complete!\n");
	printf("Press any button to exit...\n");
	waitforbuttonpress(NULL, NULL);
	
	Reboot();

	return 0;
}
Beispiel #14
0
/********************************************************************************
* TitleBrowser- opens a browser with a list of installed Titles
* relies on code from any title deleter.
*********************************************************************************/
int TitleBrowser(u32 type) {

	u32 num_titles;
	u32 titles[100] ATTRIBUTE_ALIGN(32);
	u32 num_sys_titles;
	u32 sys_titles[10] ATTRIBUTE_ALIGN(32);
	s32 ret = -1;
	int numtitle;//to get rid of a stupid compile wrning
	//open the database file
	FILE *f;
	char path[100];

	ISFS_Initialize();

	sprintf(path,"%s/config/database.txt",bootDevice);
	f = fopen(path, "r");

	// Get count of titles of our requested type
	ret = getTitles_TypeCount(type, &num_titles);
	if (ret < 0) {
		//printf("\tError! Can't get count of titles! (ret = %d)\n", ret);
		//exit(1);
	}

	// Get titles of our requested type
	ret = getTitles_Type(type, titles, num_titles);
	if (ret < 0) {
		//printf("\tError! Can't get list of titles! (ret = %d)\n", ret);
		//exit(1);
	}

	// Get count of system titles
	ret = getTitles_TypeCount(0x00010002, &num_sys_titles);
	if (ret < 0) {
		//printf("\tError! Can't get count of titles! (ret = %d)\n", ret);
		//exit(1);
	}

	// Get system titles
	ret = getTitles_Type(0x00010002, sys_titles, num_sys_titles);
	if (ret < 0) {
		//printf("\tError! Can't get list of titles! (ret = %d)\n", ret);
		//exit(1);
	}


	//this array will hold all the names for the titles so we only have to get them one time
	char name[num_titles+num_sys_titles][50];

	customOptionList options3(num_titles+num_sys_titles+1);
	//write the titles on the option browser
	u32 i = 0;



	//first add the good stuff
	while (i < num_titles) {
		//start from the beginning of the file each loop
		if (f)rewind(f);
		//char name[50];
		char text[15];
		strcpy(name[i],"");//make sure name is empty
		u8 found=0;
		//set the title's name, number, ID to text
		sprintf(text, "%s", titleText(type, titles[i]));

		//get name from database cause i dont like the ADT function
		char line[200];
		char tmp[50];
		snprintf(tmp,50," ");
		
		//check if the content.bin is on the SD card for that game
		//if there is content.bin,then the game is on the SDmenu and not the wii
		sprintf(line,"SD:/private/wii/title/%s/content.bin",text);
		if (!checkfile(line))
			{
				if (f) {
					while (fgets(line, sizeof(line), f)) {
						if (line[0]== text[0]&&
								line[1]== text[1]&&
								line[2]== text[2]) {
							int j=0;
							found=1;
							for (j=0;(line[j+4]!='\0' || j<51);j++)

								tmp[j]=line[j+4];
							snprintf(name[i],sizeof(name[i]),"%s",tmp);
							//break;
						}
					}
				}
				if (!found) {
					if (getName00(name[i], TITLE_ID(type, titles[i]),CONF_GetLanguage()*2)>=0)
						found=2;

					if (!found) {
						if (getNameBN(name[i], TITLE_ID(type, titles[i]))>=0)
							found=3;

						if (!found)
							snprintf(name[i],sizeof(name[i]),"Unknown Title (%08x)",titles[i]);
					}
				}

				//set the text to the option browser
				options3.SetName(i, "%s",text);
				options3.SetValue(i, "%s",name[i]);
				//options3.SetValue(i, " (%08x) %s",titles[i],name[i]);//use this line to show the number to call to launch the channel
				//move on to the next title
			}
        i++;
    }

    // now add the crappy system titles
    while (i < num_titles+num_sys_titles) {
        //start from the beginning of the file each loop
        if (f)rewind(f);
        //char name[50];
        char text[15];
        strcpy(name[i],"");//make sure name is empty
        u8 found=0;
        //set the title's name, number, ID to text
        sprintf(text, "%s", titleText(0x00010002, sys_titles[i-num_titles]));

        //get name from database cause i dont like the ADT function
        char line[200];
        char tmp[50];
        snprintf(tmp,50," ");
        //snprintf(name[i],sizeof(name[i]),"Unknown Title");
        if (f) {
            while (fgets(line, sizeof(line), f)) {
                if (line[0]== text[0]&&
                        line[1]== text[1]&&
                        line[2]== text[2]) {
                    int j=0;
                    found=1;
                    for (j=0;(line[j+4]!='\0' || j<51);j++)

                        tmp[j]=line[j+4];
                    snprintf(name[i],sizeof(name[i]),"%s",tmp);
                    break;
                }
            }
        }
        if (!found) {
            if (getName00(name[i], TITLE_ID(0x00010002, sys_titles[i-num_titles]))>=0)
                found=2;

            if (!found) {
                if (getNameBN(name[i], TITLE_ID(0x00010002, sys_titles[i-num_titles]))>=0)
                    found=3;

                if (!found)
                    snprintf(name[i],sizeof(name[i]),"Unknown Title (%08x)",sys_titles[i-num_titles]);
            }
        }

        //set the text to the option browser
        options3.SetName(i, "%s",text);
        options3.SetValue(i, "%s",name[i]);
        //options3.SetValue(i, " (%08x) %s",titles[i],name[i]);//use this line to show the number to call to launch the channel
        //move on to the next title
        i++;
    }
    if (i == num_titles+num_sys_titles) {
        options3.SetName(i, " ");
        options3.SetValue(i, "%s",tr("Wii Settings"));
    }
    //we have all the titles we need so close the database and stop poking around in the wii
    fclose(f);

    //get rid of our footprints in there
    Uninstall_FromTitle(TITLE_ID(1, 0));
    ISFS_Deinitialize();
    bool exit = false;

    if (IsNetworkInit())
        ResumeNetworkWait();

    GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
	// because destroy GuiSound must wait while sound playing is finished, we use a global sound
	if(!btnClick2) btnClick2=new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
	//	GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);

    char imgPath[100];

    snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path);
    GuiImageData btnOutline(imgPath, button_dialogue_box_png);
    snprintf(imgPath, sizeof(imgPath), "%sgamesettings_background.png", CFG.theme_path);
    GuiImageData settingsbg(imgPath, settings_background_png);

    GuiTrigger trigA;
    trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
    GuiTrigger trigHome;
    trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0);
    GuiTrigger trigB;
    trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);

    GuiText titleTxt(tr("Title Launcher"), 28, (GXColor) {0, 0, 0, 255});
    titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
    titleTxt.SetPosition(12,40);
    titleTxt.SetMaxWidth(356, GuiText::SCROLL);

    GuiImage settingsbackground(&settingsbg);
    GuiButton settingsbackgroundbtn(settingsbackground.GetWidth(), settingsbackground.GetHeight());
    settingsbackgroundbtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
    settingsbackgroundbtn.SetPosition(0, 0);
    settingsbackgroundbtn.SetImage(&settingsbackground);

    GuiText cancelBtnTxt(tr("Back"), 22, THEME.prompttext);
    cancelBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30);
    GuiImage cancelBtnImg(&btnOutline);
    if (Settings.wsprompt == yes) {
        cancelBtnTxt.SetWidescreen(CFG.widescreen);
        cancelBtnImg.SetWidescreen(CFG.widescreen);
    }
    GuiButton cancelBtn(&cancelBtnImg,&cancelBtnImg, 2, 3, 180, 400, &trigA, &btnSoundOver, btnClick2,1);
    cancelBtn.SetScale(0.9);
    cancelBtn.SetLabel(&cancelBtnTxt);
    cancelBtn.SetTrigger(&trigB);

    u8 scrollbaron = 0;
    if (num_titles > 9)
        scrollbaron = 1;

    GuiCustomOptionBrowser optionBrowser3(396, 280, &options3, CFG.theme_path, "bg_options_gamesettings.png", bg_options_settings_png, num_titles+num_sys_titles>9?1:0, 200);
    optionBrowser3.SetPosition(0, 90);
    optionBrowser3.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);

    snprintf(imgPath, sizeof(imgPath), "%sWifi_btn.png", CFG.theme_path);
    GuiImageData wifiImgData(imgPath, Wifi_btn_png);
    GuiImage wifiImg(&wifiImgData);
    if (Settings.wsprompt == yes) {
        wifiImg.SetWidescreen(CFG.widescreen);
    }
    GuiButton wifiBtn(wifiImg.GetWidth(), wifiImg.GetHeight());
    wifiBtn.SetImage(&wifiImg);
    wifiBtn.SetPosition(100, 400);
    wifiBtn.SetEffectGrow();
    wifiBtn.SetAlpha(80);
    wifiBtn.SetTrigger(&trigA);

    GuiTrigger trigZ;
    trigZ.SetButtonOnlyTrigger(-1, WPAD_NUNCHUK_BUTTON_Z | WPAD_CLASSIC_BUTTON_ZL, PAD_TRIGGER_Z);

    GuiButton screenShotBtn(0,0);
    screenShotBtn.SetPosition(0,0);
    screenShotBtn.SetTrigger(&trigZ);

    HaltGui();
    GuiWindow w(screenwidth, screenheight);
    w.Append(&screenShotBtn);
    w.Append(&settingsbackgroundbtn);
    w.Append(&titleTxt);
    w.Append(&cancelBtn);
    w.Append(&wifiBtn);
    w.Append(&optionBrowser3);

    mainWindow->Append(&w);


    int tmp=num_titles+num_sys_titles;
    ResumeGui();
    numtitle=num_titles;
    while (!exit) {
        VIDEO_WaitVSync();

        if (shutdown == 1)
            Sys_Shutdown();
        if (reset == 1)
            Sys_Reboot();

        else if (wifiBtn.GetState() == STATE_CLICKED) {

                ResumeNetworkWait();
                wifiBtn.ResetState();
        }

        if (IsNetworkInit()) {
                wifiBtn.SetAlpha(255);
        }

        ret = optionBrowser3.GetClickedOption();

        if (ret > -1) {//if a click happened

            //char name[50];
            char text[15];
            if (f)rewind(f);
            //strcpy(name,"");//make sure name is empty

            if (ret<numtitle) {
                //set the title's name, number, ID to text
                sprintf(text, "%s", titleText(type, titles[ret]));

                char temp[100];
                //prompt to boot selected title
                snprintf(temp, sizeof(temp), "%s : %s",text,name[ret]);
                int  choice = WindowPrompt(tr("Boot?"), temp, tr("OK"), tr("Cancel"));
                if (choice) {//if they say yes


                    //stop all this stuff before starting the channel

                    CloseXMLDatabase();
                    ExitGUIThreads();
                    ShutdownAudio();
                    StopGX();
                    WII_Initialize();
                    WII_LaunchTitle(TITLE_ID(type,titles[ret]));
                    //this really shouldn't be needed because the title will be booted
                    exit = true;
                    break;
                } else {
                    //if they said no to booting the title
                    ret = -1;
                    optionBrowser3.ResetState();
                }

            } else { //if they clicked a system title
                if (ret == tmp) {
                    CloseXMLDatabase();
                    ExitGUIThreads();
                    ShutdownAudio();
                    StopGX();
                    WII_Initialize();
                    WII_ReturnToSettings();

                } else {
                    //set the title's name, number, ID to text
                    sprintf(text, "%s", titleText(0x00010002, sys_titles[ret-num_titles]));

                    char temp[112];
                    //prompt to boot selected title
					snprintf(temp, sizeof(temp), tr("%s : %s May not boot correctly if your System Menu is not up to date."),text,name[ret]);
                    int  choice = WindowPrompt(tr("Boot?"), temp, tr("OK"), tr("Cancel"));
                    if (choice) {//if they say yes


                        //stop all this stuff before starting the channel

                        CloseXMLDatabase();
                        ExitGUIThreads();
                        ShutdownAudio();
                        StopGX();
                        WII_Initialize();
                        WII_LaunchTitle(TITLE_ID(0x00010002,sys_titles[ret-num_titles]));
                        //this really shouldn't be needed because the title will be booted
                        exit = true;
                        break;
                    } else {
                        //if they said no to booting the title
                        ret = -1;
                        optionBrowser3.ResetState();
                    }
                }
            }
        }

        if(infilesize > 0) {

                char filesizetxt[50];
                char temp[50];
                char filepath[100];
//				u32 read = 0;
				
				//make sure there is a folder for this to be saved in
				struct stat st;
                snprintf(filepath, sizeof(filepath), "%s/wad/", bootDevice);
				if (stat(filepath, &st) != 0) {
						if (subfoldercreate(filepath) != 1) {
							WindowPrompt(tr("Error !"),tr("Can't create directory"),tr("OK"));
						}
					}
				snprintf(filepath, sizeof(filepath), "%s/wad/tmp.tmp", bootDevice);
				

                if (infilesize < MB_SIZE)
                    snprintf(filesizetxt, sizeof(filesizetxt), tr("Incoming file %0.2fKB"), infilesize/KB_SIZE);
                else
                    snprintf(filesizetxt, sizeof(filesizetxt), tr("Incoming file %0.2fMB"), infilesize/MB_SIZE);

                snprintf(temp, sizeof(temp), tr("Load file from: %s ?"), GetIncommingIP());

                int choice = WindowPrompt(filesizetxt, temp, tr("OK"), tr("Cancel"));
		gprintf("\nchoice:%d",choice);

		if (choice == 1) {

			u32 read = 0;
			u8 *temp = NULL;
			int len = NETWORKBLOCKSIZE;
			temp = (u8 *) malloc(infilesize);

						bool error = false;
						u8 *ptr = temp;
						gprintf("\nrecieving shit");
			while (read < infilesize) {

			    ShowProgress(tr("Receiving file from:"), GetIncommingIP(), NULL, read, infilesize, true);

			    if (infilesize - read < (u32) len)
				len = infilesize-read;
			    else
				len = NETWORKBLOCKSIZE;

			    int result = network_read(ptr, len);

			    if (result < 0) {
				WindowPrompt(tr("Error while transfering data."), 0, tr("OK"));
				error = true;
				break;
			    }
			    if (!result) {
				gprintf("\n!RESULT");
				break;
							}
			    ptr += result;
			    read += result;
			}
			ProgressStop();

						char filename[101];
						char tmptxt[200];



						//bool installWad=0;
						if (!error) {
						    gprintf("\nno error yet");

							network_read((u8*) &filename, 100);
							gprintf("\nfilename: %s",filename);

							// Do we need to unzip this thing?
							if (wiiloadVersion[0] > 0 || wiiloadVersion[1] > 4) {
							    gprintf("\nusing newer wiiload version");

								if (uncfilesize != 0) { // if uncfilesize == 0, it's not compressed
								    gprintf("\ntrying to uncompress");
									// It's compressed, uncompress
									u8 *unc = (u8 *) malloc(uncfilesize);
									uLongf f = uncfilesize;
									error = uncompress(unc, &f, temp, infilesize) != Z_OK;
									uncfilesize = f;

									free(temp);
									temp = unc;
								}
							}

							if (!error) {
								sprintf(tmptxt,"%s",filename);
								//if we got a wad
								if (strcasestr(tmptxt,".wad")) {
								    FILE *file = fopen(filepath, "wb");
								    fwrite(temp, 1, (uncfilesize>0?uncfilesize:infilesize), file);
								    fclose(file);

								    sprintf(tmptxt,"%s/wad/%s",bootDevice,filename);
								    if (checkfile(tmptxt))remove(tmptxt);
								    rename(filepath, tmptxt);

								    //check and make sure the wad we just saved is the correct size
								    u32 lSize;
								    file = fopen(tmptxt, "rb");

								    // obtain file size:
								    fseek (file , 0 , SEEK_END);
								    lSize = ftell (file);

								    rewind (file);
								    if (lSize==(uncfilesize>0?uncfilesize:infilesize)) {
									gprintf("\nsize is ok");
									int pick = WindowPrompt(tr(" Wad Saved as:"), tmptxt, tr("Install"),tr("Uninstall"),tr("Cancel"));
									//install or uninstall it
									if (pick==1)
										{
											HaltGui();
											w.Remove(&titleTxt);
											w.Remove(&cancelBtn);
											w.Remove(&wifiBtn);
											w.Remove(&optionBrowser3);
											ResumeGui();

											Wad_Install(file);

											HaltGui();
											w.Append(&titleTxt);
											w.Append(&cancelBtn);
											w.Append(&wifiBtn);
											w.Append(&optionBrowser3);
											ResumeGui();

										}
									if (pick==2)Wad_Uninstall(file);
								    }
								    else gprintf("\nBad size");
								    //close that beast, we're done with it
								    fclose (file);

								    //do we want to keep the file in the wad folder
								    if (WindowPrompt(tr("Delete ?"), tmptxt, tr("Delete"),tr("Keep"))!=0)
									remove(tmptxt);
								    }
								else {
								    WindowPrompt(tr("ERROR:"), tr("Not a WAD file."), tr("OK"));
								    }
							}
						}



			if (error || read != infilesize) {
			    WindowPrompt(tr("Error:"), tr("No data could be read."), tr("OK"));


			}
			if(temp)free(temp);
		}



		CloseConnection();
                ResumeNetworkWait();
        }

        if (cancelBtn.GetState() == STATE_CLICKED) {
            //break the loop and end the function
            exit = true;
            ret = -10;
        }
	else if (screenShotBtn.GetState() == STATE_CLICKED) {
			gprintf("\n\tscreenShotBtn clicked");
			screenShotBtn.ResetState();
			ScreenShot();
			gprintf("...It's easy, mmmmmmKay");
		    }
    }

    CloseConnection();
    if (IsNetworkInit())
        HaltNetworkThread();

    fclose(f);
    HaltGui();
    mainWindow->Remove(&w);
    ResumeGui();

    return ret;
}
static int recCloseLib(void){ return (--isfsOpen) ? ISFS_Deinitialize() : 0; }
Beispiel #16
0
s32 Downgrade_TMD_Revision(void *ptmd, u32 tmd_size, void *certs, u32 certs_size) 
{
	// The revison of the tmd used as paramter here has to be >= the revision of the installed tmd
	s32 ret;

	printf("Setting the revision to 0...\n");

	ret = ES_AddTitleStart(ptmd, tmd_size, certs, certs_size, NULL, 0);
	if (ret < 0) 
	{
		if (ret == -1035)
		{
			printf("Error: ES_AddTitleStart returned %d, maybe you need an updated Downgrader\n", ret);
		} else
		{
			printf("Error: ES_AddTitleStart returned %d\n", ret);
		}
		ES_AddTitleCancel();
		return ret;
	}

	s32 file;
	char *tmd_path = "/tmp/title.tmd";
	
	ret = ISFS_Delete(tmd_path);	
	if (ret < 0) 
	{
		printf("Error: ISFS_Delete returned %d\n", ret);
		ES_AddTitleCancel();
		ISFS_Deinitialize();
		return ret;
	}
	ret = ISFS_CreateFile(tmd_path, 0, 3, 3, 3);
	if (ret < 0) 
	{
		printf("Error: ISFS_CreateFile returned %d\n", ret);
		ES_AddTitleCancel();
		ISFS_Deinitialize();
		return ret;
	}

	file = ISFS_Open(tmd_path, ISFS_OPEN_RW);
	if (file < 0)
	{
		printf("Error: ISFS_Open returned %d\n", file);
		ES_AddTitleCancel();
		ISFS_Deinitialize();
		return file;
	}
	
	u8 *tmd = (u8 *)ptmd;
	tmd[0x1dc] = 0;
	tmd[0x1dd] = 0;
	
	ret = ISFS_Write(file, (u8 *)ptmd, tmd_size);
	if (ret < 0) 
	{
		printf("Error: ISFS_Write returned %d\n", ret);
		ISFS_Close(file);
		ES_AddTitleCancel();
		ISFS_Deinitialize();
		return ret;
	}

	ISFS_Close(file);
	ISFS_Deinitialize();

	ret = ES_AddTitleFinish();
	if (ret < 0) 
	{
		printf("Error: ES_AddTitleFinish returned %d\n", ret);
		return ret;
	}
	
	return 1;
}