diff --git a/HBC/META.XML b/HBC/META.XML index 97058e7c..e50ebdb1 100644 --- a/HBC/META.XML +++ b/HBC/META.XML @@ -2,8 +2,8 @@ USB Loader GX USB Loader GX Team - 1.0 r960 - 201009211724 + 1.0 r961 + 201009222057 Loads games from USB-devices USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times. The interactive GUI is completely controllable with WiiMote, Classic Controller or GC Controller. diff --git a/Makefile b/Makefile index a390b215..e6ad7442 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,7 @@ SOURCES := source \ source/images \ source/fonts \ source/sounds \ + source/system \ source/libwbfs \ source/unzip \ source/language \ diff --git a/source/main.cpp b/source/main.cpp index a019c07f..625e765b 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -19,10 +19,9 @@ //#include extern "C" { - extern void __exception_setreload( int t ); + extern void __exception_setreload(int t); } - #include #include @@ -53,6 +52,7 @@ extern "C" #include "lstub.h" #include "usbloader/usbstorage2.h" #include "wad/nandtitle.h" +#include "system/IosLoader.h" extern bool geckoinit; extern char headlessID[8]; @@ -61,101 +61,98 @@ char bootDevice[10]; NandTitle titles; PartList partitions; - -int main( int argc, char *argv[] ) +int main(int argc, char *argv[]) { - MEM2_init( 48 ); - setlocale( LC_ALL, "en.UTF-8" ); + MEM2_init(48); + setlocale(LC_ALL, "en.UTF-8"); geckoinit = InitGecko(); InitVideo(); - __exception_setreload( 20 ); + __exception_setreload(20); - printf( "\tStarting up\n" ); + printf("\tStarting up\n"); titles.Get(); bool bootDevice_found = false; - if ( argc >= 1 ) + if (argc >= 1) { - if ( !strncasecmp( argv[0], "usb:/", 5 ) ) + if (!strncasecmp(argv[0], "usb:/", 5)) { - strcpy( bootDevice, "USB:" ); + strcpy(bootDevice, "USB:"); bootDevice_found = true; } - else if ( !strncasecmp( argv[0], "sd:/", 4 ) ) - bootDevice_found = true; + else if (!strncasecmp(argv[0], "sd:/", 4)) bootDevice_found = true; } //Let's use libogc sd/usb for config loading - printf( "\tInitialize sd card\n" ); + printf("\tInitialize sd card\n"); SDCard_Init(); - printf( "\tInitialize usb device\n" ); + printf("\tInitialize usb device\n"); USBDevice_Init(); - if ( !bootDevice_found ) + if (!bootDevice_found) { - printf( "\tSearch for configuration file\n" ); + printf("\tSearch for configuration file\n"); //try USB //left in all the dol and elf files in this check in case this is the first time running the app and they dont have the config - if ( checkfile( ( char* ) "USB:/config/GXglobal.cfg" ) || ( checkfile( ( char* ) "USB:/apps/usbloader_gx/boot.elf" ) ) - || checkfile( ( char* ) "USB:/apps/usbloadergx/boot.dol" ) || ( checkfile( ( char* ) "USB:/apps/usbloadergx/boot.elf" ) ) - || checkfile( ( char* ) "USB:/apps/usbloader_gx/boot.dol" ) ) - strcpy( bootDevice, "USB:" ); + if (checkfile((char*) "USB:/config/GXglobal.cfg") || (checkfile((char*) "USB:/apps/usbloader_gx/boot.elf")) + || checkfile((char*) "USB:/apps/usbloadergx/boot.dol") || (checkfile( + (char*) "USB:/apps/usbloadergx/boot.elf")) || checkfile((char*) "USB:/apps/usbloader_gx/boot.dol")) strcpy( + bootDevice, "USB:"); - printf( "\tConfiguration file is on %s\n", bootDevice ); + printf("\tConfiguration file is on %s\n", bootDevice); } gettextCleanUp(); - printf( "\tLoading configuration..." ); + printf("\tLoading configuration..."); Settings.Load(); VIDEO_SetWidescreen(Settings.widescreen); - printf( "done\n" ); - - SDCard_deInit();// unmount SD for reloading IOS - USBDevice_deInit();// unmount USB for reloading IOS - USBStorage2_Deinit(); - - printf( "\tCheck for an existing cIOS\n" ); - CheckForCIOS(); + printf("done\n"); // Let's load the cIOS now - if ( LoadAppCIOS() < 0 ) + IosLoader loader(titles); + if (loader.LoadAppCios() < 0) { - printf( "\tERROR: No cIOS could be loaded. Exiting....\n" ); - sleep( 5 ); + printf("\n\tWARNING!\n"); + printf("\tUSB Loader GX needs unstubbed cIOS 222 v4 or 249 v9+\n\n"); + + printf( + "\tWe cannot determine the versions on your system,\n\tsince you have no patched ios 36 or 236 installed.\n"); + printf("\tTherefor, if loading of USB Loader GX fails, you\n\tprobably have installed the 4.2 update,\n"); + printf("\tand you should go figure out how to get some cios action going on\n\tin your Wii.\n"); + + printf("\tERROR: No cIOS could be loaded. Exiting....\n"); + sleep(10); Sys_BackToLoader(); } + printf("\tLoaded cIOS = %u (Rev %u)\n", IOS_GetVersion(), IOS_GetRevision()); - printf( "\tLoaded cIOS = %u (Rev %u)\n", IOS_GetVersion(), IOS_GetRevision() ); - - printf( "\tWaiting for USB:\n" ); - if ( MountWBFS() < 0 ) + printf("\tWaiting for USB:\n"); + if (MountWBFS() < 0) { - printf( "ERROR: No WBFS drive mounted.\n" ); - sleep( 5 ); - exit( 0 ); + printf("ERROR: No WBFS drive mounted.\n"); + sleep(5); + exit(0); } //if a ID was passed via args copy it and try to boot it after the partition is mounted //its not really a headless mode. more like hairless. - if ( argc > 1 && argv[1] ) + if (argc > 1 && argv[1]) { - if ( strlen( argv[1] ) == 6 ) - strncpy( headlessID, argv[1], sizeof( headlessID ) ); + if (strlen(argv[1]) == 6) strncpy(headlessID, argv[1], sizeof(headlessID)); } //! Init the rest of the System - Sys_Init(); SetupPads(); InitAudio(); char *fontPath = NULL; - asprintf( &fontPath, "%sfont.ttf", Settings.theme_path ); - SetupDefaultFont( fontPath ); - free( fontPath ); + asprintf(&fontPath, "%sfont.ttf", Settings.theme_path); + SetupDefaultFont(fontPath); + free(fontPath); - gprintf( "\n\tEnd of Main()" ); + gprintf("\n\tEnd of Main()"); InitGUIThreads(); - MainMenu( MENU_CHECK ); + MainMenu(MENU_CHECK); return 0; } diff --git a/source/menu.cpp b/source/menu.cpp index 528a7808..f49897f3 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -456,26 +456,9 @@ int MainMenu( int menu ) alternatedoloffset = 0; } reloadblock = off; - returnToLoaderGV = 1; + returnToLoaderGV = 1; } - int ios2; - // When the selected ios is 249, and you're loading from FAT, reset ios to 222 - if ( load_from_fs != PART_FS_WBFS && ios2 == 249 ) - { - ios2 = 222; - } - bool onlinefix = ShutdownWC24(); - - // You cannot reload ios when loading from fat - if ( IOS_GetVersion() != ios2 || onlinefix ) - { - ret = Sys_ChangeIos( ios2 ); - if ( ret < 0 ) - { - Sys_ChangeIos( 249 ); - } - } if ( !mountMethod ) { gprintf( "Loading fragment list..." ); diff --git a/source/sys.cpp b/source/sys.cpp index 75246eaf..8d1cfe6d 100644 --- a/source/sys.cpp +++ b/source/sys.cpp @@ -1,22 +1,14 @@ -#include -#include -#include +#include +#include +#include -#include "usbloader/wdvd.h" -#include "usbloader/usbstorage2.h" -#include "usbloader/disc.h" -#include "usbloader/wbfs.h" -#include "usbloader/partition_usbloader.h" -#include "mload/mload_modules.h" -#include "video.h" +#include "mload/mload.h" +#include "settings/CSettings.h" #include "audio.h" -#include "menu.h" #include "fatmounter.h" -#include "gecko.h" -#include "sys.h" -#include "wpad.h" #include "lstub.h" -#include "wad/nandtitle.h" +#include "menu.h" +#include "video.h" extern char game_partition[6]; extern u8 load_from_fs; @@ -76,105 +68,6 @@ void Sys_Reboot( void ) STM_RebootSystem(); } -int Sys_ChangeIos( int ios ) -{ - s32 prevIos = IOS_GetVersion(); - - SDCard_deInit(); - USBDevice_deInit(); - - WPAD_Flush( 0 ); - WPAD_Disconnect( 0 ); - WPAD_Shutdown(); - - WDVD_Close(); - - USBStorage2_Deinit(); - - s32 ret = IOS_ReloadIOSsafe( ios ); - if ( ret < 0 ) - { - ios = prevIos; - } - - SDCard_Init(); - - if ( ios == 222 || ios == 223 ) - { - load_ehc_module(); - } - USBDevice_Init(); - - PAD_Init(); - Wpad_Init(); - WPAD_SetDataFormat( WPAD_CHAN_ALL, WPAD_FMT_BTNS_ACC_IR ); - WPAD_SetVRes( WPAD_CHAN_ALL, screenwidth, screenheight ); - - WBFS_Init( WBFS_DEVICE_USB ); - Disc_Init(); - - if ( Sys_IsHermes() ) - { - WBFS_OpenNamed( ( char * ) &game_partition ); - } - else - { - WBFS_Open(); - } - - return ret; -} - -int Sys_IosReload( int IOS ) -{ - s32 ret = -1; - - //shutdown SD and USB before IOS Reload in DiscWait - SDCard_deInit(); - USBDevice_deInit(); - - WPAD_Flush( 0 ); - WPAD_Disconnect( 0 ); - WPAD_Shutdown(); - - WDVD_Close(); - - USBStorage2_Deinit(); - - if ( IOS == 249 || IOS == 222 || IOS == 223 ) - { - for ( int i = 0; i < 10; i++ ) - { - ret = IOS_ReloadIOSsafe( IOS ); - if ( ret < 0 ) return ret; - if ( IOS == 222 || IOS == 223 ) load_ehc_module(); - ret = WBFS_Init( WBFS_DEVICE_USB ); - if ( !( ret < 0 ) ) break; - sleep( 1 ); - USBStorage2_Deinit(); - } - if ( ret >= 0 ) - { - ret = Disc_Init(); - if ( ret >= 0 ) - { - ret = WBFS_Open(); - } - } - else Sys_BackToLoader(); - } - - PAD_Init(); - Wpad_Init(); - WPAD_SetDataFormat( WPAD_CHAN_ALL, WPAD_FMT_BTNS_ACC_IR ); - WPAD_SetVRes( WPAD_CHAN_ALL, screenwidth, screenheight ); - //reinitialize SD and USB - SDCard_Init(); - USBDevice_Init(); - - return ret; -} - #define ShutdownToDefault 0 #define ShutdownToIdle 1 #define ShutdownToStandby 2 @@ -205,10 +98,12 @@ static void _Sys_Shutdown( int SHUTDOWN_MODE ) STM_ShutdownToStandby(); } } + void Sys_Shutdown( void ) { _Sys_Shutdown( ShutdownToDefault ); } + void Sys_ShutdownToIdel( void ) { _Sys_Shutdown( ShutdownToIdle ); @@ -242,151 +137,6 @@ bool Sys_IsHermes() return IOS_GetVersion() == 222 || IOS_GetVersion() == 223; } -#include "prompts/PromptWindows.h" - -void ShowMemInfo() -{ - char buf[255]; - struct mallinfo mymallinfo = mallinfo(); - sprintf( ( char * ) &buf, "Total: %d, Used: %d, Can be freed: %d", mymallinfo.arena / 1024, mymallinfo.uordblks / 1024, mymallinfo.keepcost / 1024 ); - WindowPrompt( "Mem info", ( char * ) &buf, "OK" ); -} - -s32 IOS_ReloadIOSsafe( int ios ) -{ - if ( ios == 222 ) - { - s32 ios222rev = titles.VersionOf( 0x1000000deULL ); - if ( !ios222rev ) - return -2; - if ( ios222rev != 4 && ios222rev != 5 && ios222rev != 65535 ) - return -2; - } - else if ( ios == 223 ) - { - s32 ios223rev = titles.VersionOf( 0x1000000dfULL ); - if ( !ios223rev ) - return -2; - if ( ios223rev != 4 && ios223rev != 5 && ios223rev != 65535 ) - return -2; - } - else if ( ios == 249 ) - { - s32 ios249rev = titles.VersionOf( 0x1000000f9ULL ); - if ( !ios249rev ) - return -2; - if ( ios249rev < 9 || ios249rev == 65280 ) - return -2; - } - else if ( ios == 250 ) - { - s32 ios250rev = titles.VersionOf( 0x1000000faULL ); - if ( !ios250rev ) - return -2; - if ( ios250rev < 9 || ios250rev == 65280 ) - return -2; - } - - s32 r = IOS_ReloadIOS( ios ); - if ( r >= 0 ) - { - WII_Initialize(); - } - return r; -} - -s32 CheckForCIOS() -{ - gprintf( "\tChecking for stub IOS\n" ); - s32 ret = 1; - s32 ios222rev = titles.VersionOf( 0x00000001000000deULL ); - s32 ios249rev = titles.VersionOf( 0x00000001000000f9ULL ); - - u8 ios222OK = !( ios222rev < 4 || ios222rev == 65280 ); - u8 ios249OK = !( ios249rev < 9 || ios249rev == 65280 ); - - gprintf( "222ok: %u\t 249ok: %u\n", ios222OK, ios249OK ); - return 1; - - //if we don't like either of the cIOS then scram - //if( !((ios222rev >= 4 && ios222rev < 65280) || (ios249rev >=9 && ios249rev < 65280))) - if ( ios222rev < 4 || ios222rev == 65280 || ios249rev < 9 || ios249rev == 65280 ) - { - printf( "\x1b[2J" ); - if ( ( ios222rev < 0 && ios222rev != WII_EINSTALL ) && ( ios249rev < 0 && ios249rev != WII_EINSTALL ) ) - { - printf( "\n\n\n\tWARNING!" ); - printf( "\n\tUSB Loader GX needs unstubbed cIOS 222 v4 or 249 v9+" ); - printf( "\n\n\tWe cannot determine the versions on your system,\n\tsince you have no patched ios 36 or 236 installed." ); - printf( "\n\tTherefor, if loading of USB Loader GX fails, you\n\tprobably have installed the 4.2 update," ); - printf( "\n\tand you should go figure out how to get some cios action going on\n\tin your Wii." ); - printf( "\n\n\tThis message will show every time." ); - sleep( 5 ); - } - else - { - printf( "\n\n\n\tERROR!" ); - printf( "\n\tUSB Loader GX needs unstubbed cIOS 222 v4 or 249 v9+" ); - printf( "\n\n\tI found \n\t\t222 = %d%s", ios222rev, ios222rev == 65280 ? " (Stubbed by 4.2 update)" : "" ); - printf( "\n\t\t249 = %d%s", ios249rev, ios249rev == 65280 ? " (Stubbed by 4.2 update)" : "" ); - printf( "\n\n\tGo figure out how to get some cIOS action going on\n\tin your Wii and come back and see me." ); - - sleep( 15 ); - printf( "\n\n\tBye" ); - - USBDevice_deInit(); - exit( 0 ); - } - } - - return ret; -} - -int LoadAppCIOS() -{ - s32 ret = 1; - /* Load Custom IOS */ - SDCard_deInit();// unmount SD for reloading IOS - USBDevice_deInit();// unmount USB for reloading IOS - USBStorage2_Deinit(); - - if ( Settings.cios == 222 && IOS_GetVersion() != 222 ) - { - printf( "\n\tReloading IOS to config setting (222)..." ); - ret = IOS_ReloadIOSsafe( 222 ); - printf( "%d", ret ); - if ( ret < 0 ) - { - Settings.cios = 249; - IOS_ReloadIOSsafe( Settings.cios ); - } - } - - if ( ( Settings.cios == 249 && IOS_GetVersion() != 249 ) - || ( Settings.cios == 250 && IOS_GetVersion() != 250 ) ) - { - printf( "\n\tReloading IOS to config setting (%d)...", ( Settings.cios == 249 ) ? 249 : 250 ); - ret = IOS_ReloadIOSsafe( ( Settings.cios == 249 ) ? 249 : 250 ); - printf( "%d", ret ); - if ( ret < 0 ) - { - Settings.cios = 222; - ret = IOS_ReloadIOSsafe( Settings.cios ); - } - } - - SDCard_Init(); - if ( IOS_GetVersion() == 222 ) - load_ehc_module(); - - USBDevice_Init(); - - return ret; -} - - -#include - void ScreenShot() { time_t rawtime; diff --git a/source/sys.h b/source/sys.h index 1af137a3..3141c3ba 100644 --- a/source/sys.h +++ b/source/sys.h @@ -11,19 +11,7 @@ void Sys_ShutdownToIdel( void ); void Sys_ShutdownToStandby( void ); void Sys_LoadMenu( void ); void Sys_BackToLoader( void ); -int Sys_ChangeIos( int ios ); -int Sys_IosReload( int IOS ); bool Sys_IsHermes(); -s32 IOS_ReloadIOSsafe( int ios ); void ScreenShot(); -s32 CheckForCIOS(); -int LoadAppCIOS(); -void ShowMemInfo(); -extern s32 ios222rev; -extern s32 ios223rev; -extern s32 ios249rev; -extern s32 ios250rev; - #endif - diff --git a/source/system/IosLoader.cpp b/source/system/IosLoader.cpp new file mode 100644 index 00000000..dbfe97cc --- /dev/null +++ b/source/system/IosLoader.cpp @@ -0,0 +1,115 @@ +#include + +#include "IosLoader.h" +#include "../fatmounter.h" +#include "../usbloader/usbstorage2.h" +#include "../wad/nandtitle.h" +#include "../mload/mload_modules.h" +#include "../settings/CSettings.h" + +/****************************************************************************** + * Construction/Destruction: + ******************************************************************************/ + +/* Initializes a new instance of the IosLoader class. */ +IosLoader::IosLoader(NandTitle titles) +{ + nandTitles = titles; +} + +/* Finalizes an instance of the IosLoader class. */ +IosLoader::~IosLoader() +{ +} + +/****************************************************************************** + * Public Methods: + ******************************************************************************/ + +/* + * Loads CIOS (If possible the one from the settings file). + * @return 0 if a cios has been successfully loaded. Else a value below 0 is returned. + */ +s32 IosLoader::LoadAppCios() +{ + s32 ret = -1; + + // Unmount devices before reloading IOS. + SDCard_deInit(); + USBDevice_deInit(); + USBStorage2_Deinit(); + + u32 ciosLoadPriority[] = { 250, 249, 222, Settings.cios }; // Descending. + u32 activeCios = IOS_GetVersion(); + + + for (u8 i=(sizeof(ciosLoadPriority)/sizeof(ciosLoadPriority[0])); i>=0; i--) + { + u32 cios = ciosLoadPriority[i]; + + if (activeCios == cios) + { + ret = 0; + break; + } + + if ((ret = ReloadIosSafe(cios)) > -1) + { + // Remember working cios. + Settings.cios = cios; + break; + } + } + + // Remount devices after reloading IOS. + SDCard_Init(); + if (IOS_GetVersion() == 222) load_ehc_module(); + USBDevice_Init(); + + return ret; +} + +/****************************************************************************** + * Private/Protected Methods: + ******************************************************************************/ + +/* + * Reloads a certain IOS under the condition, that an appropriate version of the IOS is installed. + * @return a negative value if a safe reload of the ios was not possible. + */ +s32 IosLoader::ReloadIosSafe(s32 ios) +{ + switch (ios) + { + case 222: + { + s32 ios222rev = nandTitles.VersionOf(0x1000000deULL); + if (ios222rev == 4 || ios222rev == 5 || ios222rev == 65535) break; + return -2; + } + case 223: + { + s32 ios223rev = nandTitles.VersionOf(0x1000000dfULL); + if (ios223rev == 4 || ios223rev == 5 || ios223rev == 65535) break; + return -2; + } + case 249: + { + s32 ios249rev = nandTitles.VersionOf(0x1000000f9ULL); + if (ios249rev < 9 || ios249rev == 65280) return -2; + break; + } + case 250: + { + s32 ios250rev = nandTitles.VersionOf(0x1000000faULL); + if (ios250rev < 9 || ios250rev == 65280) return -2; + break; + } + default: + return -3; + } + + s32 r = IOS_ReloadIOS(ios); + if (r >= 0) WII_Initialize(); + return r; +} diff --git a/source/system/IosLoader.h b/source/system/IosLoader.h new file mode 100644 index 00000000..5a59f8db --- /dev/null +++ b/source/system/IosLoader.h @@ -0,0 +1,19 @@ +#ifndef _IOSLOADER_H_ +#define _IOSLOADER_H_ + +#include +#include "../wad/nandtitle.h" + +class IosLoader +{ + public: + IosLoader(NandTitle titles); + ~IosLoader(); + s32 CheckForCios(); + s32 LoadAppCios(); + private: + NandTitle nandTitles; + s32 ReloadIosSafe(s32 ios); +}; + +#endif diff --git a/source/usbloader/wbfs.cpp b/source/usbloader/wbfs.cpp index 65ca535d..89338690 100644 --- a/source/usbloader/wbfs.cpp +++ b/source/usbloader/wbfs.cpp @@ -311,8 +311,9 @@ int MountWBFS() int ret = -1; time_t currTime = time( 0 ); - while ( time( 0 ) - currTime < 15 ) + while ( time( 0 ) - currTime < 30 ) { + USBDevice_deInit(); USBStorage2_Deinit(); USBDevice_Init(); diff --git a/source/wad/nandtitle.h b/source/wad/nandtitle.h index d7b5b270..54820130 100644 --- a/source/wad/nandtitle.h +++ b/source/wad/nandtitle.h @@ -34,8 +34,6 @@ using namespace std; #define RF_NEWS_CHANNEL 0x48414741 #define RF_FORECAST_CHANNEL 0x48414641 - - typedef struct { u8 zeroes1[0x40]; @@ -58,7 +56,6 @@ typedef struct u8 md5[0x10]; } IMET; - class NandTitle { public: