#if 0 #include #include #include #include #include #include #include #include #include #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 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 #include #include #include #include #include #include #include #include #include #include "../lstub.h" #include "../sys.h" #include "../gecko.h" #include "fatmounter.h" #include "dolloader.h" void *innetbuffer = NULL; static u8 *homebrewbuffer = (u8 *) 0x92000000; u32 homebrewsize = 0; static std::vector Arguments; extern const u8 app_booter_dol[]; int AllocHomebrewMemory(u32 filesize) { innetbuffer = malloc(filesize); if (!innetbuffer) return -1; homebrewsize = filesize; return 1; } 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; if (innetbuffer) { free(innetbuffer); innetbuffer = NULL; } Arguments.clear(); } 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; } static int RunAppbooter() { if (homebrewsize == 0) return -1; struct __argv args; SetupARGV(&args); u32 cpu_isr; entrypoint entry = (entrypoint) load_dol((void*) app_booter_dol, &args); if (!entry) { FreeHomebrewBuffer(); return -1; } u64 currentStub = getStubDest(); loadStub(); if (Set_Stub_Split(0x00010001, "UNEO") < 0) { if (Set_Stub_Split(0x00010001, "ULNR") < 0) { if (!currentStub) currentStub = 0x100000002ULL; Set_Stub(currentStub); } } 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(); entry(); _CPU_ISR_Restore( cpu_isr ); return 0; } int BootHomebrew(char * filepath) { void *buffer = NULL; u32 filesize = 0; FILE *file = fopen(filepath, "rb"); if (!file) Sys_BackToLoader(); fseek(file, 0, SEEK_END); filesize = ftell(file); rewind(file); buffer = malloc(filesize); if (fread(buffer, 1, filesize, file) != filesize) { fclose(file); free(buffer); SDCard_deInit(); USBDevice_deInit(); Sys_BackToLoader(); } fclose(file); CopyHomebrewMemory((u8*) buffer, 0, filesize); if (buffer) { free(buffer); buffer = NULL; } AddBootArgument(filepath); return RunAppbooter(); } 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(); }