mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-12-22 18:01:54 +01:00
*Lot's of cleanup and file/function movement.
*Homebrew boot changed a bit (cleanup) *A lot more stuff i can't remember anymore
This commit is contained in:
parent
bed86339f7
commit
33ce3e48ab
@ -2,8 +2,8 @@
|
||||
<app version="1">
|
||||
<name> USB Loader GX</name>
|
||||
<coder>USB Loader GX Team</coder>
|
||||
<version>1.0 r994</version>
|
||||
<release_date>201010280947</release_date>
|
||||
<version>1.0 r995</version>
|
||||
<release_date>201010311348</release_date>
|
||||
<short_description>Loads games from USB-devices</short_description>
|
||||
<long_description>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.
|
||||
|
2
Makefile
2
Makefile
@ -61,7 +61,7 @@ LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80B00
|
||||
#---------------------------------------------------------------------------------
|
||||
# any extra libraries we wish to link with the project
|
||||
#---------------------------------------------------------------------------------
|
||||
LIBS := -lpngu -lpng -lgd -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -lvorbisidec -lmad -lmxml -ljpeg -lunzip
|
||||
LIBS := -lpngu -lpng -lgd -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -lvorbisidec -lmad -lmxml -ljpeg -lzip
|
||||
#---------------------------------------------------------------------------------
|
||||
# list of directories containing libraries, this must be the top level containing
|
||||
# include and lib
|
||||
|
File diff suppressed because one or more lines are too long
@ -2,6 +2,8 @@
|
||||
#include "mload/mload.h"
|
||||
#include "mload/mload_modules.h"
|
||||
#include "usbloader/disc.h"
|
||||
#include "usbloader/apploader.h"
|
||||
#include "usbloader/wdvd.h"
|
||||
#include "usbloader/GameList.h"
|
||||
#include "settings/Settings.h"
|
||||
#include "settings/CGameSettings.h"
|
||||
@ -9,17 +11,87 @@
|
||||
#include "usbloader/wbfs.h"
|
||||
#include "settings/newtitles.h"
|
||||
#include "patches/fst.h"
|
||||
#include "patches/gamepatches.h"
|
||||
#include "patches/wip.h"
|
||||
#include "system/IosLoader.h"
|
||||
#include "wad/nandtitle.h"
|
||||
#include "menu/menus.h"
|
||||
#include "memory/memory.h"
|
||||
#include "fatmounter.h"
|
||||
#include "FontSystem.h"
|
||||
#include "sys.h"
|
||||
|
||||
//appentrypoint has to be global because of asm
|
||||
u32 AppEntrypoint = 0;
|
||||
|
||||
struct discHdr *dvdheader = NULL;
|
||||
extern int load_from_fs;
|
||||
extern int mountMethod;
|
||||
|
||||
|
||||
static u32 BootPartition(char * dolpath, u8 videoselected, u8 languageChoice, u8 cheat, u8 vipatch, u8 patchcountrystring,
|
||||
u8 alternatedol, u32 alternatedoloffset, u32 returnTo, u8 fix002)
|
||||
{
|
||||
gprintf("booting partition IOS %u v%u\n", IOS_GetVersion(), IOS_GetRevision());
|
||||
entry_point p_entry;
|
||||
s32 ret;
|
||||
u64 offset;
|
||||
|
||||
/* Find game partition offset */
|
||||
ret = __Disc_FindPartition(&offset);
|
||||
if (ret < 0)
|
||||
return 0;
|
||||
|
||||
/* Open specified partition */
|
||||
ret = WDVD_OpenPartition(offset);
|
||||
if (ret < 0)
|
||||
return 0;
|
||||
|
||||
load_wip_code((u8*) Disc_ID);
|
||||
|
||||
/* If a wip file is loaded for this game this does nothing - Dimok */
|
||||
PoPPatch();
|
||||
|
||||
/* Setup low memory */
|
||||
__Disc_SetLowMem();
|
||||
|
||||
/* Run apploader */
|
||||
ret = Apploader_Run(&p_entry, dolpath, cheat, videoselected, languageChoice, vipatch, patchcountrystring,
|
||||
alternatedol, alternatedoloffset, returnTo, fix002);
|
||||
|
||||
if (ret < 0)
|
||||
return 0;
|
||||
|
||||
free_wip();
|
||||
|
||||
return (u32) p_entry;
|
||||
}
|
||||
|
||||
int BootGame(const char * gameID)
|
||||
{
|
||||
if(!gameID || strlen(gameID) < 3)
|
||||
return -1;
|
||||
|
||||
if (mountMethod == 3)
|
||||
{
|
||||
ExitApp();
|
||||
struct discHdr *header = gameList.GetDiscHeader(gameID);
|
||||
u32 tid;
|
||||
memcpy(&tid, header->id, 4);
|
||||
gprintf("\nBooting title %016llx", TITLE_ID( ( header->id[5] == '1' ? 0x00010001 : 0x00010002 ), tid ));
|
||||
WII_Initialize();
|
||||
return WII_LaunchTitle(TITLE_ID( ( header->id[5] == '1' ? 0x00010001 : 0x00010002 ), tid ));
|
||||
}
|
||||
if (mountMethod == 2)
|
||||
{
|
||||
ExitApp();
|
||||
gprintf("\nLoading BC for GameCube");
|
||||
WII_Initialize();
|
||||
return WII_LaunchTitle(0x0000000100000100ULL);
|
||||
}
|
||||
|
||||
AppCleanUp();
|
||||
|
||||
gprintf("\tSettings.partition: %d\n", Settings.partition);
|
||||
|
||||
gameList.LoadUnfiltered();
|
||||
@ -63,6 +135,14 @@ int BootGame(const char * gameID)
|
||||
returnToLoaderGV = game_cfg->returnTo;
|
||||
}
|
||||
|
||||
if(iosChoice != IOS_GetVersion())
|
||||
{
|
||||
gprintf("Reloading into cIOS: %i\n", iosChoice);
|
||||
IosLoader::LoadGameCios(iosChoice);
|
||||
if(MountGamePartition(false) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!mountMethod)
|
||||
{
|
||||
gprintf("Loading fragment list...");
|
||||
@ -114,16 +194,35 @@ int BootGame(const char * gameID)
|
||||
|
||||
gprintf("\tDisc_wiiBoot\n");
|
||||
|
||||
shadow_mload();
|
||||
|
||||
ret = Disc_WiiBoot(Settings.dolpath, videoChoice, languageChoice, ocarinaChoice, viChoice, countrystrings,
|
||||
/* Boot partition */
|
||||
AppEntrypoint = BootPartition(Settings.dolpath, videoChoice, languageChoice, ocarinaChoice, viChoice, countrystrings,
|
||||
alternatedol, alternatedoloffset, channel, fix002);
|
||||
|
||||
if (ret < 0)
|
||||
Sys_LoadMenu();
|
||||
if(AppEntrypoint != 0)
|
||||
{
|
||||
bool enablecheat = false;
|
||||
|
||||
//should never get here
|
||||
printf("Returning entry point: 0x%0x\n", ret);
|
||||
if (ocarinaChoice)
|
||||
{
|
||||
// OCARINA STUFF - FISHEARS
|
||||
if (ocarina_load_code((u8 *) Disc_ID) > 0)
|
||||
{
|
||||
ocarina_do_code();
|
||||
enablecheat = true;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
shadow_mload();
|
||||
UnmountNTFS();
|
||||
SDCard_deInit();
|
||||
USBDevice_deInit();
|
||||
|
||||
gprintf("Jumping to game entrypoint: 0x%08X.\n", AppEntrypoint);
|
||||
|
||||
return Disc_JumpToEntrypoint(videoChoice, enablecheat);
|
||||
}
|
||||
|
||||
WDVD_ClosePartition();
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
@ -33,7 +33,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
#include <unzip/unzip.h>
|
||||
|
||||
#include "prompts/ProgressWindow.h"
|
||||
#include "FileOperations/fileops.h"
|
||||
|
@ -28,7 +28,7 @@
|
||||
#ifndef _ZIPFILE_H_
|
||||
#define _ZIPFILE_H_
|
||||
|
||||
#include <unzip/unzip.h>
|
||||
#include <zip/unzip.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include <gccore.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
|
||||
/* init-globals */
|
||||
bool geckoinit = false;
|
||||
@ -9,22 +10,24 @@ bool textVideoInit = false;
|
||||
#ifndef NO_DEBUG
|
||||
#include <stdarg.h>
|
||||
|
||||
//using the gprintf from crediar because it is smaller than mine
|
||||
void gprintf(const char *str, ...)
|
||||
void gprintf(const char *format, ...)
|
||||
{
|
||||
if (!(geckoinit)) return;
|
||||
if (!geckoinit)
|
||||
return;
|
||||
|
||||
char astr[0x100];
|
||||
char * tmp = NULL;
|
||||
va_list va;
|
||||
va_start(va, format);
|
||||
if((vasprintf(&tmp, format, va) >= 0) && tmp)
|
||||
{
|
||||
u32 level = IRQ_Disable();
|
||||
usb_sendbuffer(1, tmp, strlen(tmp));
|
||||
IRQ_Restore(level);
|
||||
}
|
||||
va_end(va);
|
||||
|
||||
va_list ap;
|
||||
va_start( ap, str );
|
||||
|
||||
vsprintf(astr, str, ap);
|
||||
|
||||
va_end( ap );
|
||||
|
||||
usb_sendbuffer(1, astr, strlen(astr));
|
||||
//usb_sendbuffer_safe( 1, astr, strlen(astr) );
|
||||
if(tmp)
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
bool InitGecko()
|
||||
|
@ -1,141 +1,3 @@
|
||||
#if 0
|
||||
#include <gccore.h>
|
||||
#include <ogcsys.h>
|
||||
#include <malloc.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ogc/machine/processor.h>
|
||||
#include <wiiuse/wpad.h>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
#include "usbloader/usbstorage2.h"
|
||||
#include "dolloader.h"
|
||||
#include "fatmounter.h"
|
||||
#include "sys.h"
|
||||
|
||||
extern const u8 app_booter_dol[];
|
||||
extern const u32 app_booter_dol_size;
|
||||
|
||||
static u8 *homebrewbuffer = ( u8 * ) 0x92000000;
|
||||
static int homebrewsize = 0;
|
||||
static std::vector<std::string> Arguments;
|
||||
|
||||
void AddBootArgument( const char * argv )
|
||||
{
|
||||
std::string arg( argv );
|
||||
Arguments.push_back( arg );
|
||||
}
|
||||
|
||||
int CopyHomebrewMemory( u8 *temp, u32 pos, u32 len )
|
||||
{
|
||||
homebrewsize += len;
|
||||
memcpy( ( homebrewbuffer ) + pos, temp, len );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void FreeHomebrewBuffer()
|
||||
{
|
||||
homebrewbuffer = ( u8 * )0x92000000;
|
||||
homebrewsize = 0;
|
||||
}
|
||||
|
||||
static int SetupARGV( struct __argv * args )
|
||||
{
|
||||
if ( !args )
|
||||
return -1;
|
||||
|
||||
bzero( args, sizeof( struct __argv ) );
|
||||
args->argvMagic = ARGV_MAGIC;
|
||||
|
||||
u32 stringlength = 1;
|
||||
|
||||
/** Append Arguments **/
|
||||
for ( u32 i = 0; i < Arguments.size(); i++ )
|
||||
{
|
||||
stringlength += Arguments[i].size() + 1;
|
||||
}
|
||||
|
||||
args->length = stringlength;
|
||||
args->commandLine = ( char* ) malloc( args->length );
|
||||
if ( !args->commandLine )
|
||||
return -1;
|
||||
|
||||
u32 argc = 0;
|
||||
u32 position = 0;
|
||||
|
||||
/** Append Arguments **/
|
||||
for ( u32 i = 0; i < Arguments.size(); i++ )
|
||||
{
|
||||
strcpy( &args->commandLine[position], Arguments[i].c_str() );
|
||||
position += Arguments[i].size() + 1;
|
||||
argc++;
|
||||
}
|
||||
|
||||
args->argc = argc;
|
||||
|
||||
args->commandLine[args->length - 1] = '\0';
|
||||
args->argv = &args->commandLine;
|
||||
args->endARGV = args->argv + 1;
|
||||
|
||||
Arguments.clear();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int BootHomebrew()
|
||||
{
|
||||
if ( homebrewsize <= 0 )
|
||||
Sys_BackToLoader();
|
||||
|
||||
SDCard_deInit();
|
||||
USBDevice_deInit();
|
||||
USBStorage2_Deinit();
|
||||
|
||||
struct __argv args;
|
||||
SetupARGV( &args );
|
||||
|
||||
u32 cpu_isr;
|
||||
|
||||
entrypoint entry = ( entrypoint ) load_dol( app_booter_dol, &args );
|
||||
|
||||
if ( !entry )
|
||||
Sys_BackToLoader();
|
||||
|
||||
VIDEO_SetBlack( true );
|
||||
VIDEO_Flush();
|
||||
VIDEO_WaitVSync();
|
||||
|
||||
SYS_ResetSystem( SYS_SHUTDOWN, 0, 0 );
|
||||
_CPU_ISR_Disable ( cpu_isr );
|
||||
__exception_closeall();
|
||||
entry();
|
||||
_CPU_ISR_Restore ( cpu_isr );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int BootHomebrew( const char * filepath )
|
||||
{
|
||||
FILE * file = fopen( filepath, "rb" );
|
||||
if ( !file )
|
||||
Sys_BackToLoader();
|
||||
|
||||
fseek( file, 0, SEEK_END );
|
||||
|
||||
int size = ftell( file );
|
||||
rewind( file );
|
||||
|
||||
homebrewsize = fread( homebrewbuffer, 1, size, file );
|
||||
fclose( file );
|
||||
|
||||
AddBootArgument( filepath );
|
||||
|
||||
return BootHomebrew();
|
||||
}
|
||||
#endif
|
||||
|
||||
#include <gccore.h>
|
||||
#include <ogcsys.h>
|
||||
#include <malloc.h>
|
||||
@ -153,23 +15,12 @@ int BootHomebrew( const char * filepath )
|
||||
#include "fatmounter.h"
|
||||
#include "dolloader.h"
|
||||
|
||||
void *innetbuffer = NULL;
|
||||
static u8 *homebrewbuffer = (u8 *) 0x92000000;
|
||||
u32 homebrewsize = 0;
|
||||
static u32 homebrewsize = 0;
|
||||
static std::vector<std::string> Arguments;
|
||||
|
||||
extern const u8 app_booter_dol[];
|
||||
|
||||
int AllocHomebrewMemory(u32 filesize)
|
||||
{
|
||||
|
||||
innetbuffer = malloc(filesize);
|
||||
|
||||
if (!innetbuffer) return -1;
|
||||
|
||||
homebrewsize = filesize;
|
||||
return 1;
|
||||
}
|
||||
extern const u32 app_booter_dol_size;
|
||||
|
||||
void AddBootArgument(const char * argv)
|
||||
{
|
||||
@ -190,12 +41,6 @@ void FreeHomebrewBuffer()
|
||||
homebrewbuffer = (u8 *) 0x92000000;
|
||||
homebrewsize = 0;
|
||||
|
||||
if (innetbuffer)
|
||||
{
|
||||
free(innetbuffer);
|
||||
innetbuffer = NULL;
|
||||
}
|
||||
|
||||
Arguments.clear();
|
||||
}
|
||||
|
||||
@ -245,6 +90,8 @@ static int RunAppbooter()
|
||||
{
|
||||
if (homebrewsize == 0) return -1;
|
||||
|
||||
ExitApp();
|
||||
|
||||
struct __argv args;
|
||||
SetupARGV(&args);
|
||||
|
||||
@ -271,13 +118,6 @@ static int RunAppbooter()
|
||||
}
|
||||
}
|
||||
|
||||
SDCard_deInit();
|
||||
USBDevice_deInit();
|
||||
|
||||
WPAD_Flush(0);
|
||||
WPAD_Disconnect(0);
|
||||
WPAD_Shutdown();
|
||||
|
||||
SYS_ResetSystem(SYS_SHUTDOWN, 0, 0);
|
||||
_CPU_ISR_Disable( cpu_isr );
|
||||
__exception_closeall();
|
||||
@ -287,7 +127,7 @@ static int RunAppbooter()
|
||||
return 0;
|
||||
}
|
||||
|
||||
int BootHomebrew(char * filepath)
|
||||
int BootHomebrew(const char * filepath)
|
||||
{
|
||||
void *buffer = NULL;
|
||||
u32 filesize = 0;
|
||||
@ -327,18 +167,5 @@ int BootHomebrew(char * filepath)
|
||||
|
||||
int BootHomebrewFromMem()
|
||||
{
|
||||
gprintf("BootHomebrewFromMem()\n %p, %08x\n", innetbuffer, homebrewsize);
|
||||
|
||||
if (!innetbuffer)
|
||||
{
|
||||
gprintf("!innetbuffer\n");
|
||||
SDCard_deInit();
|
||||
USBDevice_deInit();
|
||||
Sys_BackToLoader();
|
||||
}
|
||||
|
||||
CopyHomebrewMemory((u8*) innetbuffer, 0, homebrewsize);
|
||||
free(innetbuffer);
|
||||
|
||||
return RunAppbooter();
|
||||
}
|
||||
|
@ -1,15 +1,10 @@
|
||||
#ifndef _BOOTHOMEBREW_H_
|
||||
#define _BOOTHOMEBREW_H_
|
||||
|
||||
//int BootHomebrew();
|
||||
int BootHomebrew(const char * filepath);
|
||||
int BootHomebrewFromMem();
|
||||
int BootHomebrew(char * filepath);
|
||||
int CopyHomebrewMemory(u8 *temp, u32 pos, u32 len);
|
||||
void AddBootArgument(const char * arg);
|
||||
void FreeHomebrewBuffer();
|
||||
int LoadHomebrew(const char * filepath);
|
||||
int AllocHomebrewMemory(u32 filesize);
|
||||
extern void *innetbuffer;
|
||||
extern u32 homebrewsize;
|
||||
|
||||
#endif
|
||||
|
@ -9,7 +9,7 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <zlib.h>
|
||||
#include <unzip/unzip.h>
|
||||
#include <zip/unzip.h>
|
||||
|
||||
#include "language/gettext.h"
|
||||
#include "libwiigui/gui.h"
|
||||
@ -34,16 +34,12 @@ extern void ResumeGui();
|
||||
extern void HaltGui();
|
||||
|
||||
/*** Extern variables ***/
|
||||
extern GuiImage * bgImg;
|
||||
extern u32 infilesize;
|
||||
extern u32 uncfilesize;
|
||||
extern char wiiloadVersion[2];
|
||||
extern u8 shutdown;
|
||||
extern u8 reset;
|
||||
|
||||
/*** Variables used elsewhere ***/
|
||||
u8 boothomebrew = 0;
|
||||
|
||||
/****************************************************************************
|
||||
* roundup Function
|
||||
***************************************************************************/
|
||||
@ -54,6 +50,137 @@ int roundup(float number)
|
||||
else return (int) (number + 1);
|
||||
}
|
||||
|
||||
static int ReceiveFile()
|
||||
{
|
||||
char filesizetxt[50];
|
||||
char temp[50];
|
||||
u32 filesize = 0;
|
||||
|
||||
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" ));
|
||||
|
||||
if (choice == 0)
|
||||
return MENU_NONE;
|
||||
|
||||
u32 read = 0;
|
||||
int len = NETWORKBLOCKSIZE;
|
||||
filesize = infilesize;
|
||||
u8 * buffer = (u8 *) malloc(infilesize);
|
||||
if(!buffer)
|
||||
{
|
||||
WindowPrompt(tr( "Not enough memory." ), 0, tr( "OK" ));
|
||||
return MENU_NONE;
|
||||
}
|
||||
|
||||
bool error = false;
|
||||
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(buffer+read, len);
|
||||
|
||||
if (result < 0)
|
||||
{
|
||||
WindowPrompt(tr( "Error while transfering data." ), 0, tr( "OK" ));
|
||||
free(buffer);
|
||||
return MENU_NONE;
|
||||
}
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
read += result;
|
||||
}
|
||||
|
||||
char filename[101];
|
||||
network_read((u8*) &filename, 100);
|
||||
|
||||
// Do we need to unzip this thing?
|
||||
if (wiiloadVersion[0] > 0 || wiiloadVersion[1] > 4)
|
||||
{
|
||||
// We need to unzip...
|
||||
if (buffer[0] == 'P' && buffer[1] == 'K' && buffer[2] == 0x03 && buffer[3] == 0x04)
|
||||
{
|
||||
// It's a zip file, unzip to the apps directory
|
||||
// Zip archive, ask for permission to install the zip
|
||||
char zippath[255];
|
||||
sprintf((char *) &zippath, "%s%s", Settings.homebrewapps_path, filename);
|
||||
|
||||
FILE *fp = fopen(zippath, "wb");
|
||||
if (!fp)
|
||||
{
|
||||
WindowPrompt(tr( "Error writing the data." ), 0, tr( "OK" ));
|
||||
return MENU_NONE;
|
||||
}
|
||||
|
||||
fwrite(buffer, 1, infilesize, fp);
|
||||
fclose(fp);
|
||||
|
||||
free(buffer);
|
||||
buffer = NULL;
|
||||
|
||||
// Now unzip the zip file...
|
||||
unzFile uf = unzOpen(zippath);
|
||||
if (uf == NULL)
|
||||
{
|
||||
WindowPrompt(tr( "Error while opening the zip." ), 0, tr( "OK" ));
|
||||
return MENU_NONE;
|
||||
}
|
||||
|
||||
extractZip(uf, 0, 1, 0, Settings.homebrewapps_path);
|
||||
unzCloseCurrentFile(uf);
|
||||
|
||||
remove(zippath);
|
||||
|
||||
WindowPrompt(tr( "Success:" ),
|
||||
tr( "Uploaded ZIP file installed to homebrew directory." ), tr( "OK" ));
|
||||
|
||||
// Reload this menu here...
|
||||
return MENU_HOMEBREWBROWSE;
|
||||
}
|
||||
else if (uncfilesize != 0) // if uncfilesize == 0, it's not compressed
|
||||
{
|
||||
// It's compressed, uncompress
|
||||
u8 *unc = (u8 *) malloc(uncfilesize);
|
||||
uLongf f = uncfilesize;
|
||||
error = uncompress(unc, &f, buffer, infilesize) != Z_OK;
|
||||
uncfilesize = f;
|
||||
filesize = uncfilesize;
|
||||
|
||||
free(buffer);
|
||||
buffer = unc;
|
||||
}
|
||||
}
|
||||
|
||||
CopyHomebrewMemory(buffer, 0, filesize);
|
||||
free(buffer);
|
||||
|
||||
ProgressStop();
|
||||
|
||||
if (error || read != infilesize || strcasestr(filename, ".dol") || strcasestr(filename, ".elf"))
|
||||
{
|
||||
WindowPrompt(tr( "Error:" ), tr( "No data could be read." ), tr( "OK" ));
|
||||
FreeHomebrewBuffer();
|
||||
return MENU_NONE;
|
||||
}
|
||||
|
||||
CloseConnection();
|
||||
|
||||
AddBootArgument(filename);
|
||||
|
||||
return BootHomebrewFromMem();
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* MenuHomebrewBrowse
|
||||
***************************************************************************/
|
||||
@ -695,10 +822,9 @@ int MenuHomebrewBrowse()
|
||||
XMLInfo[0].GetReleasedate(), XMLInfo[0].GetLongDescription(), iconpath, filesize);
|
||||
if (choice == 1)
|
||||
{
|
||||
boothomebrew = 1;
|
||||
menu = MENU_EXIT;
|
||||
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
|
||||
HomebrewFiles.GetFilepath(fileoffset), HomebrewFiles.GetFilename(fileoffset));
|
||||
BootHomebrew(Settings.selected_homebrew);
|
||||
break;
|
||||
}
|
||||
MainButton1.ResetState();
|
||||
@ -728,10 +854,9 @@ int MenuHomebrewBrowse()
|
||||
XMLInfo[1].GetReleasedate(), XMLInfo[1].GetLongDescription(), iconpath, filesize);
|
||||
if (choice == 1)
|
||||
{
|
||||
boothomebrew = 1;
|
||||
menu = MENU_EXIT;
|
||||
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
|
||||
HomebrewFiles.GetFilepath(fileoffset + 1), HomebrewFiles.GetFilename(fileoffset + 1));
|
||||
BootHomebrew(Settings.selected_homebrew);
|
||||
break;
|
||||
}
|
||||
MainButton2.ResetState();
|
||||
@ -761,10 +886,9 @@ int MenuHomebrewBrowse()
|
||||
XMLInfo[2].GetReleasedate(), XMLInfo[2].GetLongDescription(), iconpath, filesize);
|
||||
if (choice == 1)
|
||||
{
|
||||
boothomebrew = 1;
|
||||
menu = MENU_EXIT;
|
||||
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
|
||||
HomebrewFiles.GetFilepath(fileoffset + 2), HomebrewFiles.GetFilename(fileoffset + 2));
|
||||
BootHomebrew(Settings.selected_homebrew);
|
||||
break;
|
||||
}
|
||||
MainButton3.ResetState();
|
||||
@ -794,10 +918,9 @@ int MenuHomebrewBrowse()
|
||||
XMLInfo[3].GetReleasedate(), XMLInfo[3].GetLongDescription(), iconpath, filesize);
|
||||
if (choice == 1)
|
||||
{
|
||||
boothomebrew = 1;
|
||||
menu = MENU_EXIT;
|
||||
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
|
||||
HomebrewFiles.GetFilepath(fileoffset + 3), HomebrewFiles.GetFilename(fileoffset + 3));
|
||||
BootHomebrew(Settings.selected_homebrew);
|
||||
break;
|
||||
}
|
||||
MainButton4.ResetState();
|
||||
@ -864,166 +987,9 @@ int MenuHomebrewBrowse()
|
||||
|
||||
else if (infilesize > 0)
|
||||
{
|
||||
char filesizetxt[50];
|
||||
char temp[50];
|
||||
|
||||
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" ));
|
||||
|
||||
if (choice == 1)
|
||||
{
|
||||
|
||||
int res = AllocHomebrewMemory(infilesize);
|
||||
|
||||
if (res < 0)
|
||||
{
|
||||
CloseConnection();
|
||||
WindowPrompt(tr( "Not enough free memory." ), 0, tr( "OK" ));
|
||||
}
|
||||
else
|
||||
{
|
||||
u32 read = 0;
|
||||
u8 *temp = NULL;
|
||||
int len = NETWORKBLOCKSIZE;
|
||||
temp = (u8 *) malloc(infilesize);
|
||||
|
||||
bool error = false;
|
||||
u8 *ptr = temp;
|
||||
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)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
ptr += result;
|
||||
|
||||
read += result;
|
||||
}
|
||||
|
||||
char filename[101];
|
||||
if (!error)
|
||||
{
|
||||
|
||||
network_read((u8*) &filename, 100);
|
||||
|
||||
// Do we need to unzip this thing?
|
||||
if (wiiloadVersion[0] > 0 || wiiloadVersion[1] > 4)
|
||||
{
|
||||
|
||||
// We need to unzip...
|
||||
if (temp[0] == 'P' && temp[1] == 'K' && temp[2] == 0x03 && temp[3] == 0x04)
|
||||
{
|
||||
// It's a zip file, unzip to the apps directory
|
||||
|
||||
// Zip archive, ask for permission to install the zip
|
||||
char zippath[255];
|
||||
sprintf((char *) &zippath, "%s%s", Settings.homebrewapps_path, filename);
|
||||
|
||||
FILE *fp = fopen(zippath, "wb");
|
||||
if (fp != NULL)
|
||||
{
|
||||
fwrite(temp, 1, infilesize, fp);
|
||||
fclose(fp);
|
||||
|
||||
// Now unzip the zip file...
|
||||
unzFile uf = unzOpen(zippath);
|
||||
if (uf == NULL)
|
||||
{
|
||||
error = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
extractZip(uf, 0, 1, 0, Settings.homebrewapps_path);
|
||||
unzCloseCurrentFile(uf);
|
||||
|
||||
remove(zippath);
|
||||
|
||||
// Reload this menu here...
|
||||
menu = MENU_HOMEBREWBROWSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
error = true;
|
||||
}
|
||||
}
|
||||
else if (uncfilesize != 0) // if uncfilesize == 0, it's not compressed
|
||||
{
|
||||
// It's compressed, uncompress
|
||||
u8 *unc = (u8 *) malloc(uncfilesize);
|
||||
uLongf f = uncfilesize;
|
||||
error = uncompress(unc, &f, temp, infilesize) != Z_OK;
|
||||
uncfilesize = f;
|
||||
homebrewsize = uncfilesize;
|
||||
|
||||
free(temp);
|
||||
temp = unc;
|
||||
}
|
||||
}
|
||||
|
||||
if (!error && strstr(filename, ".zip") == NULL)
|
||||
{
|
||||
innetbuffer = temp;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
ProgressStop();
|
||||
|
||||
if (error || read != infilesize)
|
||||
{
|
||||
WindowPrompt(tr( "Error:" ), tr( "No data could be read." ), tr( "OK" ));
|
||||
FreeHomebrewBuffer();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strstr(filename, ".dol") || strstr(filename, ".DOL") || strstr(filename, ".elf")
|
||||
|| strstr(filename, ".ELF"))
|
||||
{
|
||||
boothomebrew = 2;
|
||||
AddBootArgument(filename);
|
||||
menu = MENU_EXIT;
|
||||
CloseConnection();
|
||||
break;
|
||||
}
|
||||
else if (strstr(filename, ".zip"))
|
||||
{
|
||||
WindowPrompt(tr( "Success:" ),
|
||||
tr( "Uploaded ZIP file installed to homebrew directory." ), tr( "OK" ));
|
||||
CloseConnection();
|
||||
}
|
||||
else
|
||||
{
|
||||
FreeHomebrewBuffer();
|
||||
WindowPrompt(tr( "ERROR:" ), tr( "Not a DOL/ELF file." ), tr( "OK" ));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
CloseConnection();
|
||||
ResumeNetworkWait();
|
||||
menu = ReceiveFile();
|
||||
CloseConnection();
|
||||
ResumeNetworkWait();
|
||||
}
|
||||
|
||||
else if (channelBtn.GetState() == STATE_CLICKED)
|
||||
|
@ -116,8 +116,6 @@ int main(int argc, char *argv[])
|
||||
SetupDefaultFont(fontPath);
|
||||
free(fontPath);
|
||||
|
||||
//gprintf("\tEnd of Main()\n");
|
||||
InitGUIThreads();
|
||||
MainMenu(MENU_DISCLIST);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,36 +1,36 @@
|
||||
#ifndef __MEMORY_H_
|
||||
#define __MEMORY_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#define Disc_ID ((u32*) 0x80000000)
|
||||
#define Disc_Region ((u32*) 0x80000003)
|
||||
#define Disc_Magic ((u32*) 0x80000018)
|
||||
#define Sys_Magic ((u32*) 0x80000020)
|
||||
#define Version ((u32*) 0x80000024)
|
||||
#define Mem_Size ((u32*) 0x80000028)
|
||||
#define Board_Model ((u32*) 0x8000002C)
|
||||
#define Arena_L ((u32*) 0x80000030)
|
||||
#define Arena_H ((u32*) 0x80000034)
|
||||
#define FST ((u32*) 0x80000038)
|
||||
#define Max_FST ((u32*) 0x8000003C)
|
||||
#define Assembler ((u32*) 0x80000060)
|
||||
#define Video_Mode ((u32*) 0x800000CC)
|
||||
#define Dev_Debugger ((u32*) 0x800000EC)
|
||||
#define Simulated_Mem ((u32*) 0x800000F0)
|
||||
#define BI2 ((u32*) 0x800000F4)
|
||||
#define Bus_Speed ((u32*) 0x800000F8)
|
||||
#define CPU_Speed ((u32*) 0x800000FC)
|
||||
#define Online_Check ((u32*) 0x80003180)
|
||||
#define GameID_Address ((u32*) 0x80003184)
|
||||
|
||||
#define allocate_memory(size) memalign(32, (size+31)&(~31))
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#ifndef __MEMORY_H_
|
||||
#define __MEMORY_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#define Disc_ID ((u32*) 0x80000000)
|
||||
#define Disc_Region ((u32*) 0x80000003)
|
||||
#define Disc_Magic ((u32*) 0x80000018)
|
||||
#define Sys_Magic ((u32*) 0x80000020)
|
||||
#define Version ((u32*) 0x80000024)
|
||||
#define Mem_Size ((u32*) 0x80000028)
|
||||
#define Board_Model ((u32*) 0x8000002C)
|
||||
#define Arena_L ((u32*) 0x80000030)
|
||||
#define Arena_H ((u32*) 0x80000034)
|
||||
#define FST ((u32*) 0x80000038)
|
||||
#define Max_FST ((u32*) 0x8000003C)
|
||||
#define Assembler ((u32*) 0x80000060)
|
||||
#define Video_Mode ((u32*) 0x800000CC)
|
||||
#define Dev_Debugger ((u32*) 0x800000EC)
|
||||
#define Simulated_Mem ((u32*) 0x800000F0)
|
||||
#define BI2 ((u32*) 0x800000F4)
|
||||
#define Bus_Speed ((u32*) 0x800000F8)
|
||||
#define CPU_Speed ((u32*) 0x800000FC)
|
||||
#define Online_Check ((u32*) 0x80003180)
|
||||
#define GameID_Address ((u32*) 0x80003184)
|
||||
|
||||
#define allocate_memory(size) memalign(32, (size+31)&(~31))
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -36,7 +36,6 @@
|
||||
#include "usbloader/frag.h"
|
||||
#include "usbloader/wbfs.h"
|
||||
#include "wad/nandtitle.h"
|
||||
#include "GameBootProcess.h"
|
||||
|
||||
/*** Variables that are also used extern ***/
|
||||
GuiWindow * mainWindow = NULL;
|
||||
@ -61,13 +60,12 @@ bool altdoldefault = true;
|
||||
|
||||
static lwp_t guithread = LWP_THREAD_NULL;
|
||||
static bool guiHalt = true;
|
||||
static int ExitRequested = 0;
|
||||
static bool ExitRequested = false;
|
||||
|
||||
/*** Extern variables ***/
|
||||
extern u8 shutdown;
|
||||
extern u8 reset;
|
||||
extern s32 gameSelected, gameStart;
|
||||
extern u8 boothomebrew;
|
||||
|
||||
/****************************************************************************
|
||||
* ResumeGui
|
||||
@ -168,6 +166,7 @@ static void * UpdateGUI(void *arg)
|
||||
Menu_DrawRectangle(0, 0, screenwidth, screenheight, (GXColor) {0, 0, 0, i}, 1);
|
||||
Menu_Render();
|
||||
}
|
||||
|
||||
mainWindow->RemoveAll();
|
||||
ShutoffRumble();
|
||||
|
||||
@ -181,18 +180,22 @@ static void * UpdateGUI(void *arg)
|
||||
***************************************************************************/
|
||||
void InitGUIThreads()
|
||||
{
|
||||
LWP_CreateThread(&guithread, UpdateGUI, NULL, NULL, 65536, LWP_PRIO_HIGHEST);
|
||||
InitProgressThread();
|
||||
InitNetworkThread();
|
||||
ExitRequested = false;
|
||||
|
||||
if (Settings.autonetwork) ResumeNetworkThread();
|
||||
if(guithread == LWP_THREAD_NULL)
|
||||
LWP_CreateThread(&guithread, UpdateGUI, NULL, NULL, 65536, LWP_PRIO_HIGHEST);
|
||||
}
|
||||
|
||||
void ExitGUIThreads()
|
||||
{
|
||||
ExitRequested = 1;
|
||||
LWP_JoinThread(guithread, NULL);
|
||||
guithread = LWP_THREAD_NULL;
|
||||
ExitRequested = true;
|
||||
|
||||
if(guithread != LWP_THREAD_NULL)
|
||||
{
|
||||
ResumeGui();
|
||||
LWP_JoinThread(guithread, NULL);
|
||||
guithread = LWP_THREAD_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -254,6 +257,14 @@ int MainMenu(int menu)
|
||||
{
|
||||
currentMenu = menu;
|
||||
|
||||
InitGUIThreads();
|
||||
|
||||
InitProgressThread();
|
||||
InitNetworkThread();
|
||||
|
||||
if (Settings.autonetwork)
|
||||
ResumeNetworkThread();
|
||||
|
||||
pointer[0] = Resources::GetImageData("player1_point.png");
|
||||
pointer[1] = Resources::GetImageData("player2_point.png");
|
||||
pointer[2] = Resources::GetImageData("player3_point.png");
|
||||
@ -301,61 +312,8 @@ int MainMenu(int menu)
|
||||
}
|
||||
}
|
||||
|
||||
// MemInfoPrompt();
|
||||
gprintf("Exiting main GUI. mountMethod = %d\n", mountMethod);
|
||||
//! THIS SHOULD NEVER HAPPEN ANYMORE
|
||||
ExitApp();
|
||||
|
||||
CloseXMLDatabase();
|
||||
NewTitles::DestroyInstance();
|
||||
|
||||
ResumeGui();
|
||||
ExitGUIThreads();
|
||||
|
||||
bgMusic->Stop();
|
||||
delete bgMusic;
|
||||
delete background;
|
||||
delete bgImg;
|
||||
delete mainWindow;
|
||||
for (int i = 0; i < 4; i++)
|
||||
delete pointer[i];
|
||||
delete GameRegionTxt;
|
||||
delete GameIDTxt;
|
||||
delete cover;
|
||||
delete coverImg;
|
||||
delete fontSystem;
|
||||
ShutdownAudio();
|
||||
StopGX();
|
||||
gettextCleanUp();
|
||||
|
||||
if (mountMethod == 3)
|
||||
{
|
||||
struct discHdr *header = gameList[gameSelected];
|
||||
char tmp[20];
|
||||
u32 tid;
|
||||
sprintf(tmp, "%c%c%c%c", header->id[0], header->id[1], header->id[2], header->id[3]);
|
||||
memcpy(&tid, tmp, 4);
|
||||
gprintf("\nBooting title %016llx", TITLE_ID( ( header->id[5] == '1' ? 0x00010001 : 0x00010002 ), tid ));
|
||||
WII_Initialize();
|
||||
WII_LaunchTitle(TITLE_ID( ( header->id[5] == '1' ? 0x00010001 : 0x00010002 ), tid ));
|
||||
}
|
||||
if (mountMethod == 2)
|
||||
{
|
||||
gprintf("\nLoading BC for GameCube");
|
||||
WII_Initialize();
|
||||
WII_LaunchTitle(0x0000000100000100ULL);
|
||||
}
|
||||
|
||||
if (boothomebrew == 1)
|
||||
{
|
||||
gprintf("\nBootHomebrew");
|
||||
BootHomebrew(Settings.selected_homebrew);
|
||||
return 0;
|
||||
}
|
||||
else if (boothomebrew == 2)
|
||||
{
|
||||
gprintf("\nBootHomebrew from Menu");
|
||||
BootHomebrewFromMem();
|
||||
return 0;
|
||||
}
|
||||
|
||||
return BootGame((const char *) gameList[gameSelected]->id);
|
||||
return -1;
|
||||
}
|
||||
|
@ -10,6 +10,8 @@
|
||||
#define _MENU_H_
|
||||
|
||||
#include <ogcsys.h>
|
||||
#include "libwiigui/gui.h"
|
||||
#include "libwiigui/gui_bgm.h"
|
||||
#include "settings/CSettings.h"
|
||||
#include "main.h"
|
||||
|
||||
@ -30,8 +32,21 @@ enum
|
||||
BOOTHOMEBREW,
|
||||
MENU_THEMEDOWNLOADER
|
||||
};
|
||||
class GuiImageData;
|
||||
|
||||
void ResumeGui();
|
||||
void HaltGui();
|
||||
GuiImageData *LoadCoverImage(struct discHdr *header, bool Prefere3D = true, bool noCover = true);
|
||||
class GuiSound;
|
||||
|
||||
extern GuiSound *btnClick2;
|
||||
extern GuiBGM *bgMusic;
|
||||
extern GuiImageData *pointer[4];
|
||||
extern GuiImageData *background;
|
||||
extern GuiImage *bgImg;
|
||||
extern GuiWindow *mainWindow;
|
||||
extern GuiText *GameRegionTxt;
|
||||
extern GuiText *GameIDTxt;
|
||||
extern GuiImageData *cover;
|
||||
extern GuiImage *coverImg;
|
||||
extern FreeTypeGX *fontSystem;
|
||||
|
||||
#endif
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "settings/CGameStatistics.h"
|
||||
#include "settings/GameTitles.h"
|
||||
#include "themes/CTheme.h"
|
||||
#include "GameBootProcess.h"
|
||||
#include "wpad.h"
|
||||
#include "sys.h"
|
||||
|
||||
@ -1472,9 +1473,8 @@ int MenuDiscList()
|
||||
header->id[3], header->id[4], header->id[5], GameStatistics.GetPlayCount(header->id));
|
||||
|
||||
}
|
||||
menu = MENU_EXIT;
|
||||
break;
|
||||
|
||||
//Just calling that shuts down everything and starts game
|
||||
BootGame((const char *) header->id);
|
||||
}
|
||||
bool returnHere = true;// prompt to start game
|
||||
while (returnHere)
|
||||
@ -1494,7 +1494,7 @@ int MenuDiscList()
|
||||
if (exeFile == NULL)
|
||||
{
|
||||
gprintf("\n\tTried to load alt dol that isn't there");
|
||||
sprintf(nipple, "%s %s", nipple, tr( "does not exist! You Messed something up, Idiot." ));
|
||||
sprintf(nipple, "%s %s", nipple, tr( "does not exist! You messed something up." ));
|
||||
WindowPrompt(tr( "Error" ), nipple, tr( "OK" ));
|
||||
menu = MENU_DISCLIST;
|
||||
wiilight(0);
|
||||
@ -1524,8 +1524,8 @@ int MenuDiscList()
|
||||
}
|
||||
wiilight(0);
|
||||
returnHere = false;
|
||||
menu = MENU_EXIT;
|
||||
|
||||
//Just calling that shuts down everything and starts game
|
||||
BootGame((const char *) gameList[gameSelected]->id);
|
||||
}
|
||||
else if (choice == 2)
|
||||
{
|
||||
|
@ -10,10 +10,6 @@
|
||||
#include "filelist.h"
|
||||
#include "sys.h"
|
||||
|
||||
extern void ResumeGui();
|
||||
extern void HaltGui();
|
||||
extern GuiWindow * mainWindow;
|
||||
extern GuiBGM * bgMusic;
|
||||
extern u8 shutdown;
|
||||
extern u8 reset;
|
||||
|
||||
|
@ -1,6 +1,10 @@
|
||||
#ifndef GAMEPATCHES_H_
|
||||
#define GAMEPATCHES_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <gccore.h>
|
||||
|
||||
bool Anti_002_fix(u8 * Address, int Size);
|
||||
@ -10,4 +14,8 @@ bool Search_and_patch_Video_Modes(u8 * Address, u32 Size, GXRModeObj* Table[]);
|
||||
void VideoModePatcher(u8 * dst, int len, u8 videoSelected);
|
||||
bool PatchReturnTo(void *Address, int Size, u32 id);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -20,7 +20,7 @@
|
||||
#include "sys.h"
|
||||
#include "settings/GameTitles.h"
|
||||
#include "themes/CTheme.h"
|
||||
#include "memory.h"
|
||||
#include "memory/memory.h"
|
||||
#include "../gecko.h"
|
||||
#include "../patches/dvd_broadway.h"
|
||||
|
||||
@ -32,7 +32,6 @@ extern void HaltGui();
|
||||
extern GuiWindow * mainWindow;
|
||||
extern u8 shutdown;
|
||||
extern u8 reset;
|
||||
extern u8 mountMethod;
|
||||
|
||||
/********************************************************************************
|
||||
*Disk Browser
|
||||
|
@ -51,8 +51,6 @@ int cntMissFiles = 0;
|
||||
static char missingFiles[500][12];
|
||||
|
||||
/*** Extern variables ***/
|
||||
extern GuiWindow * mainWindow;
|
||||
extern GuiSound * bgMusic;
|
||||
s32 gameSelected = 0, gameStart = 0;
|
||||
extern float gamesize;
|
||||
extern u8 shutdown;
|
||||
@ -61,10 +59,6 @@ extern u8 mountMethod;
|
||||
extern struct discHdr *dvdheader;
|
||||
extern char game_partition[6];
|
||||
|
||||
/*** Extern functions ***/
|
||||
extern void ResumeGui();
|
||||
extern void HaltGui();
|
||||
|
||||
/****************************************************************************
|
||||
* OnScreenNumpad
|
||||
*
|
||||
|
@ -585,14 +585,18 @@ bool CSettings::FindConfig()
|
||||
if (i == 1) strcpy(BootDevice, "USB:");
|
||||
if (!found)
|
||||
{
|
||||
snprintf(ConfigPath, sizeof(ConfigPath), "%s/config/GXGlobal.cfg", BootDevice);
|
||||
snprintf(ConfigPath, sizeof(ConfigPath), "%s/apps/usbloader_gx/", BootDevice);
|
||||
CreateSubfolder(ConfigPath);
|
||||
strcat(ConfigPath, "GXGlobal.cfg");
|
||||
testFp = fopen(ConfigPath, "wb");
|
||||
found = (testFp != NULL);
|
||||
fclose(testFp);
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
snprintf(ConfigPath, sizeof(ConfigPath), "%s/apps/usbloader_gx/GXGlobal.cfg", BootDevice);
|
||||
snprintf(ConfigPath, sizeof(ConfigPath), "%s/config/", BootDevice);
|
||||
CreateSubfolder(ConfigPath);
|
||||
strcat(ConfigPath, "GXGlobal.cfg");
|
||||
testFp = fopen(ConfigPath, "wb");
|
||||
found = (testFp != NULL);
|
||||
fclose(testFp);
|
||||
|
@ -4,12 +4,17 @@
|
||||
|
||||
#include "mload/mload.h"
|
||||
#include "settings/CSettings.h"
|
||||
#include "settings/newtitles.h"
|
||||
#include "language/gettext.h"
|
||||
#include "utils/ResourceManager.h"
|
||||
#include "FontSystem.h"
|
||||
#include "audio.h"
|
||||
#include "fatmounter.h"
|
||||
#include "lstub.h"
|
||||
#include "menu.h"
|
||||
#include "video.h"
|
||||
#include "gecko.h"
|
||||
#include "xml/xml.h"
|
||||
|
||||
extern char game_partition[6];
|
||||
extern u8 load_from_fs;
|
||||
@ -49,25 +54,50 @@ void Sys_Init(void)
|
||||
SYS_SetPowerCallback(__Sys_PowerCallback);
|
||||
}
|
||||
|
||||
static void _ExitApp()
|
||||
void AppCleanUp(void)
|
||||
{
|
||||
extern u8 mountMethod;
|
||||
gprintf("Exiting main GUI. mountMethod = %d\n", mountMethod);
|
||||
|
||||
ExitGUIThreads();
|
||||
|
||||
delete bgMusic;
|
||||
delete background;
|
||||
delete bgImg;
|
||||
delete mainWindow;
|
||||
for (int i = 0; i < 4; i++)
|
||||
delete pointer[i];
|
||||
delete GameRegionTxt;
|
||||
delete GameIDTxt;
|
||||
delete cover;
|
||||
delete coverImg;
|
||||
gettextCleanUp();
|
||||
CloseXMLDatabase();
|
||||
ClearFontData();
|
||||
NewTitles::DestroyInstance();
|
||||
|
||||
StopGX();
|
||||
ShutdownAudio();
|
||||
|
||||
ResourceManager::DestroyInstance();
|
||||
|
||||
WPAD_Flush(0);
|
||||
WPAD_Disconnect(0);
|
||||
WPAD_Shutdown();
|
||||
}
|
||||
|
||||
void ExitApp(void)
|
||||
{
|
||||
AppCleanUp();
|
||||
UnmountNTFS();
|
||||
SDCard_deInit();
|
||||
USBDevice_deInit();
|
||||
mload_set_ES_ioctlv_vector(NULL);
|
||||
mload_close();
|
||||
}
|
||||
|
||||
void Sys_Reboot(void)
|
||||
{
|
||||
/* Restart console */
|
||||
_ExitApp();
|
||||
ExitApp();
|
||||
STM_RebootSystem();
|
||||
}
|
||||
|
||||
@ -77,10 +107,7 @@ void Sys_Reboot(void)
|
||||
|
||||
static void _Sys_Shutdown(int SHUTDOWN_MODE)
|
||||
{
|
||||
_ExitApp();
|
||||
WPAD_Flush(0);
|
||||
WPAD_Disconnect(0);
|
||||
WPAD_Shutdown();
|
||||
ExitApp();
|
||||
|
||||
/* Poweroff console */
|
||||
if ((CONF_GetShutdownMode() == CONF_SHUTDOWN_IDLE && SHUTDOWN_MODE != ShutdownToStandby) || SHUTDOWN_MODE
|
||||
@ -118,7 +145,7 @@ void Sys_ShutdownToStandby(void)
|
||||
|
||||
void Sys_LoadMenu(void)
|
||||
{
|
||||
_ExitApp();
|
||||
ExitApp();
|
||||
/* Return to the Wii system menu */
|
||||
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
|
||||
}
|
||||
@ -128,7 +155,7 @@ void Sys_BackToLoader(void)
|
||||
|
||||
if (hbcStubAvailable())
|
||||
{
|
||||
_ExitApp();
|
||||
ExitApp();
|
||||
exit(0);
|
||||
}
|
||||
// Channel Version
|
||||
|
@ -4,6 +4,8 @@
|
||||
void wiilight(int enable);
|
||||
|
||||
/* Prototypes */
|
||||
void AppCleanUp(void); //! Deletes all allocated space for everything
|
||||
void ExitApp(void); //! Like AppCleanUp() and additional device unmount
|
||||
void Sys_Init(void);
|
||||
void Sys_Reboot(void);
|
||||
void Sys_Shutdown(void);
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "../fatmounter.h"
|
||||
#include "../usbloader/usbstorage2.h"
|
||||
#include "../usbloader/disc.h"
|
||||
#include "../usbloader/wdvd.h"
|
||||
#include "../wad/nandtitle.h"
|
||||
#include "../mload/mload_modules.h"
|
||||
#include "../settings/CSettings.h"
|
||||
@ -66,6 +67,35 @@ s32 IosLoader::LoadAppCios()
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Loads a CIOS before a game start.
|
||||
* @return 0 if a cios has been successfully loaded. Else a value below 0 is returned.
|
||||
*/
|
||||
s32 IosLoader::LoadGameCios(s32 ios)
|
||||
{
|
||||
if(ios == IOS_GetVersion())
|
||||
return 0;
|
||||
|
||||
s32 ret = -1;
|
||||
|
||||
// Unmount fat before reloading IOS.
|
||||
SDCard_deInit();
|
||||
USBDevice_deInit();
|
||||
WDVD_Close();
|
||||
__io_usbstorage.shutdown(); // libogc usb
|
||||
__io_usbstorage2.shutdown(); // cios usb
|
||||
USB_Deinitialize(); // main usb handle
|
||||
|
||||
ret = ReloadIosSafe(ios);
|
||||
|
||||
// Remount devices after reloading IOS.
|
||||
SDCard_Init();
|
||||
USBDevice_Init();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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.
|
||||
|
@ -7,6 +7,7 @@ class IosLoader
|
||||
{
|
||||
public:
|
||||
static s32 LoadAppCios();
|
||||
static s32 LoadGameCios(s32 ios);
|
||||
static s32 ReloadIosSafe(s32 ios);
|
||||
private:
|
||||
static void LoadIOSModules(s32 ios, s32 ios_rev);
|
||||
|
@ -25,14 +25,7 @@
|
||||
#include "ZipFile.h"
|
||||
#include "gecko.h"
|
||||
|
||||
/*** Extern functions ***/
|
||||
extern void ResumeGui();
|
||||
extern void HaltGui();
|
||||
|
||||
/*** Extern variables ***/
|
||||
extern GuiWindow * mainWindow;
|
||||
extern GuiSound * bgMusic;
|
||||
extern GuiImage * bgImg;
|
||||
extern u8 shutdown;
|
||||
extern u8 reset;
|
||||
|
||||
|
@ -33,7 +33,7 @@
|
||||
#include "xml/xml.h"
|
||||
#include "FreeTypeGX.h"
|
||||
#include "GameList.h"
|
||||
#include "memory.h"
|
||||
#include "memory/memory.h"
|
||||
|
||||
GameList gameList;
|
||||
|
||||
|
@ -37,23 +37,24 @@ void gamepatches( u8 * dst, int len, u8 videoSelected, u8 languageChoice, u8 pat
|
||||
VideoModePatcher( dst, len, videoSelected );
|
||||
|
||||
if ( cheat )
|
||||
dogamehooks( dst, len );
|
||||
dogamehooks( dst, len );
|
||||
|
||||
if ( vipatch )
|
||||
vidolpatcher( dst, len );
|
||||
vidolpatcher( dst, len );
|
||||
|
||||
/*LANGUAGE PATCH - FISHEARS*/
|
||||
langpatcher( dst, len, languageChoice );
|
||||
|
||||
/*Thanks to WiiPower*/
|
||||
if ( patchcountrystring == 1 ) PatchCountryStrings( dst, len );
|
||||
if ( patchcountrystring == 1 )
|
||||
PatchCountryStrings( dst, len );
|
||||
|
||||
NSMBPatch( dst, len );
|
||||
|
||||
do_wip_code( ( u8 * ) dst, len );
|
||||
|
||||
if ( fix002 == 2 )
|
||||
Anti_002_fix( dst, len );
|
||||
Anti_002_fix( dst, len );
|
||||
|
||||
PatchReturnTo( dst, len, returnTo );
|
||||
}
|
||||
@ -108,10 +109,10 @@ s32 Apploader_Run(entry_point *entry, char * dolpath, u8 cheat, u8 videoSelected
|
||||
/* Read data from DVD */
|
||||
WDVD_Read(dst, len, (u64) (offset << 2));
|
||||
|
||||
if( !alternatedol )
|
||||
gamepatches(dst, len, videoSelected, languageChoice, patchcountrystring, vipatch, cheat, returnTo, fix002 );
|
||||
if( !alternatedol )
|
||||
gamepatches(dst, len, videoSelected, languageChoice, patchcountrystring, vipatch, cheat, returnTo, fix002 );
|
||||
|
||||
DCFlushRange(dst, len);
|
||||
DCFlushRange(dst, len);
|
||||
}
|
||||
|
||||
*entry = appldr_final();
|
||||
@ -123,7 +124,7 @@ s32 Apploader_Run(entry_point *entry, char * dolpath, u8 cheat, u8 videoSelected
|
||||
void *dolbuffer = NULL;
|
||||
int dollen = 0;
|
||||
|
||||
bool dolloaded = Load_Dol(&dolbuffer, &dollen, dolpath, videoSelected, languageChoice, patchcountrystring, vipatch, cheat, returnTo);
|
||||
bool dolloaded = Load_Dol(&dolbuffer, &dollen, dolpath, videoSelected, languageChoice, patchcountrystring, vipatch, cheat, returnTo);
|
||||
if (dolloaded)
|
||||
{
|
||||
*entry = (entry_point) load_dol_image(dolbuffer);
|
||||
@ -136,10 +137,8 @@ s32 Apploader_Run(entry_point *entry, char * dolpath, u8 cheat, u8 videoSelected
|
||||
wip_reset_counter();
|
||||
FST_ENTRY *fst = (FST_ENTRY *) *(u32 *) 0x80000038;
|
||||
|
||||
*entry = (entry_point) Load_Dol_from_disc(fst[alternatedoloffset].fileoffset, videoSelected, languageChoice,
|
||||
*entry = (entry_point) Load_Dol_from_disc(fst[alternatedoloffset].fileoffset, videoSelected, languageChoice,
|
||||
patchcountrystring, vipatch, cheat, returnTo);
|
||||
|
||||
if (*entry == 0) SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -13,7 +13,7 @@
|
||||
#include "video.h"
|
||||
#include "wdvd.h"
|
||||
#include "alternatedol.h"
|
||||
#include "memory.h"
|
||||
#include "memory/memory.h"
|
||||
#include "wbfs.h"
|
||||
#include "../settings/SettingsEnums.h"
|
||||
#include "../gecko.h"
|
||||
@ -23,9 +23,6 @@
|
||||
#define PTABLE_OFFSET 0x40000
|
||||
#define WII_MAGIC 0x5D1C9EA3
|
||||
|
||||
//appentrypoint
|
||||
u32 appentrypoint;
|
||||
|
||||
/* Disc pointers */
|
||||
static u32 *buffer = (u32 *) 0x93000000;
|
||||
static u8 *diskid = (u8 *) Disc_ID;
|
||||
@ -48,11 +45,7 @@ void __Disc_SetLowMem(void)
|
||||
*(vu32 *) 0xCD00643C = 0x00000000; // 32Mhz on Bus
|
||||
|
||||
//If the game is sam & max: season 1 put this shit in
|
||||
char gameid[8];
|
||||
memset(gameid, 0, 8);
|
||||
memcpy(gameid, (char*) Disc_ID, 6);
|
||||
|
||||
if ((strcmp(gameid, "R3XE6U") == 0) || (strcmp(gameid, "R3XP6V") == 0))
|
||||
if ((strncmp((char*) Disc_ID, "R3XE6U", 6) == 0) || (strncmp((char*) Disc_ID, "R3XP6V", 6) == 0))
|
||||
{
|
||||
*GameID_Address = 0x80000000; // Game ID Address
|
||||
}
|
||||
@ -284,84 +277,33 @@ s32 Disc_IsWii(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
s32 Disc_BootPartition(u64 offset, char * dolpath, u8 videoselected, u8 languageChoice, u8 cheat, u8 vipatch, u8 patchcountrystring,
|
||||
u8 alternatedol, u32 alternatedoloffset, u32 returnTo, u8 fix002)
|
||||
s32 Disc_JumpToEntrypoint(u8 videoselected, bool enablecheat)
|
||||
{
|
||||
gprintf("booting partition IOS %u v%u\n", IOS_GetVersion(), IOS_GetRevision());
|
||||
entry_point p_entry;
|
||||
|
||||
s32 ret;
|
||||
|
||||
/* Open specified partition */
|
||||
ret = WDVD_OpenPartition(offset);
|
||||
if (ret < 0) return ret;
|
||||
|
||||
/* Setup low memory */
|
||||
__Disc_SetLowMem();
|
||||
|
||||
char gameid[8];
|
||||
memset(gameid, 0, 8);
|
||||
memcpy(gameid, (char*) Disc_ID, 6);
|
||||
|
||||
load_wip_code((u8 *) &gameid);
|
||||
|
||||
/* If a wip file is loaded for this game this does nothing - Dimok */
|
||||
PoPPatch();
|
||||
|
||||
/* Run apploader */
|
||||
ret = Apploader_Run(&p_entry, dolpath, cheat, videoselected, languageChoice, vipatch, patchcountrystring,
|
||||
alternatedol, alternatedoloffset, returnTo, fix002);
|
||||
if (ret < 0) return ret;
|
||||
|
||||
free_wip();
|
||||
|
||||
bool cheatloaded = false;
|
||||
|
||||
if (cheat)
|
||||
{
|
||||
// OCARINA STUFF - FISHEARS
|
||||
if (ocarina_load_code((u8 *) gameid) > 0)
|
||||
{
|
||||
ocarina_do_code();
|
||||
cheatloaded = true;
|
||||
}
|
||||
}
|
||||
|
||||
//kill the USB and SD
|
||||
USBDevice_deInit();
|
||||
SDCard_deInit();
|
||||
|
||||
/* Set an appropiate video mode */
|
||||
__Disc_SetVMode(videoselected);
|
||||
|
||||
/* Set time */
|
||||
__Disc_SetTime();
|
||||
|
||||
/* Disconnect Wiimote */
|
||||
WPAD_Flush(0);
|
||||
WPAD_Disconnect(0);
|
||||
WPAD_Shutdown();
|
||||
|
||||
// Anti-green screen fix
|
||||
VIDEO_SetBlack(TRUE);
|
||||
VIDEO_Flush();
|
||||
VIDEO_WaitVSync();
|
||||
VIDEO_WaitVSync();
|
||||
gprintf("USB Loader GX is done.\n");
|
||||
|
||||
/* Shutdown IOS subsystems */
|
||||
// fix for PeppaPig (from NeoGamma)
|
||||
extern void __exception_closeall();
|
||||
IRQ_Disable();
|
||||
__IOS_ShutdownSubsystems();
|
||||
__exception_closeall();
|
||||
// fix for PeppaPig (from WiiFlow)
|
||||
u8 temp_data[4];
|
||||
memcpy(temp_data, (u8 *) 0x800000F4, 4);
|
||||
SYS_ResetSystem(SYS_SHUTDOWN, 0, 0);
|
||||
memcpy((u8 *) 0x800000F4, temp_data, 4);
|
||||
|
||||
appentrypoint = (u32) p_entry;
|
||||
|
||||
if (cheat == 1 && cheatloaded)
|
||||
if (enablecheat)
|
||||
{
|
||||
__asm__(
|
||||
"lis %r3, appentrypoint@h\n"
|
||||
"ori %r3, %r3, appentrypoint@l\n"
|
||||
"lis %r3, AppEntrypoint@h\n"
|
||||
"ori %r3, %r3, AppEntrypoint@l\n"
|
||||
"lwz %r3, 0(%r3)\n"
|
||||
"mtlr %r3\n"
|
||||
"lis %r3, 0x8000\n"
|
||||
@ -373,8 +315,8 @@ s32 Disc_BootPartition(u64 offset, char * dolpath, u8 videoselected, u8 language
|
||||
else
|
||||
{
|
||||
__asm__(
|
||||
"lis %r3, appentrypoint@h\n"
|
||||
"ori %r3, %r3, appentrypoint@l\n"
|
||||
"lis %r3, AppEntrypoint@h\n"
|
||||
"ori %r3, %r3, AppEntrypoint@l\n"
|
||||
"lwz %r3, 0(%r3)\n"
|
||||
"mtlr %r3\n"
|
||||
"blr\n"
|
||||
@ -384,21 +326,6 @@ s32 Disc_BootPartition(u64 offset, char * dolpath, u8 videoselected, u8 language
|
||||
return 0;
|
||||
}
|
||||
|
||||
s32 Disc_WiiBoot(char * dolpath, u8 videoselected, u8 languageChoice, u8 cheat, u8 vipatch, u8 patchcountrystring,
|
||||
u8 alternatedol, u32 alternatedoloffset, u32 returnTo, u8 fix002)
|
||||
{
|
||||
u64 offset;
|
||||
s32 ret;
|
||||
|
||||
/* Find game partition offset */
|
||||
ret = __Disc_FindPartition(&offset);
|
||||
if (ret < 0) return ret;
|
||||
|
||||
/* Boot partition */
|
||||
return Disc_BootPartition(offset, dolpath, videoselected, languageChoice, cheat, vipatch, patchcountrystring,
|
||||
alternatedol, alternatedoloffset, returnTo, fix002);
|
||||
}
|
||||
|
||||
void PatchCountryStrings(void *Address, int Size)
|
||||
{
|
||||
u8 SearchPattern[4] = { 0x00, 0x00, 0x00, 0x00 };
|
||||
|
@ -40,7 +40,7 @@ extern "C"
|
||||
|
||||
/* Padding */
|
||||
u8 unused3[30];
|
||||
}ATTRIBUTE_PACKED;
|
||||
} ATTRIBUTE_PACKED;
|
||||
|
||||
/* Prototypes */
|
||||
s32 Disc_Init(void);
|
||||
@ -50,11 +50,10 @@ extern "C"
|
||||
s32 Disc_SetUSB(const u8 *);
|
||||
s32 Disc_ReadHeader(void *);
|
||||
s32 Disc_IsWii(void);
|
||||
s32 Disc_BootPartition(u64, char *, u8, u8 languageChoice, u8, u8, u8, u8, u32, u32 returnTo, u8 fix002);
|
||||
s32 Disc_WiiBoot(char *, u8, u8 languageChoice, u8, u8, u8, u8, u32, u32 returnTo, u8 fix002);
|
||||
s32 __Disc_FindPartition(u64 *outbuf);
|
||||
void PatchCountryStrings(void *Address, int Size);
|
||||
s32 __Disc_FindPartition(u64 *outbuf);
|
||||
s32 Disc_JumpToEntrypoint(u8 videoselected, bool enablecheat);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include <unzip/unzip.h>
|
||||
#include <zip/unzip.h>
|
||||
|
||||
int extractZip(unzFile uf, int opt_extract_without_path, int opt_overwrite, const char* password,
|
||||
const char *basedir);
|
||||
|
@ -5,7 +5,7 @@
|
||||
*/
|
||||
|
||||
#include <malloc.h>
|
||||
#include <unzip/unzip.h>
|
||||
#include <zip/unzip.h>
|
||||
#include "settings/CSettings.h"
|
||||
#include "settings/CGameSettings.h"
|
||||
#include "settings/GameTitles.h"
|
||||
@ -321,7 +321,7 @@ void LoadTitlesFromXML(char *langtxt, bool forcejptoen)
|
||||
}
|
||||
|
||||
/* if enabled, force English title for all games set to Japanese */
|
||||
if (forcejptoen && (!strcmp(langcode, "JA"))) strcpy(langcode, "EN");
|
||||
if (forcejptoen && (strcmp(langcode, "JA")) == 0) strcpy(langcode, "EN");
|
||||
|
||||
/* load title from nodes */
|
||||
nodefound = mxmlFindElement(nodeid, nodedata, "locale", "lang", "EN", MXML_NO_DESCEND);
|
||||
|
Loading…
Reference in New Issue
Block a user