PSP Emulator

FLASH0
`-- vsh |-- etc |  |-- index_01g.dat |  `-- version.txt |-- module |  |-- auth_plugin.prx |  |-- auto_connect.prx |  |-- common_gui.prx |  |-- common_util.prx |  |-- dd_helper.prx |  |-- dd_helper_utility.prx |  |-- dialogmain.prx |  |-- dnas_plugin.prx |  |-- file_parser_base.prx |  |-- game_install_plugin.prx |  |-- htmlviewer_ui.prx |  |-- htmlviewer_utility.prx |  |-- hvauth_r.prx |  |-- libfont_hv.prx |  |-- libslim.prx |  |-- libwww.prx |  |-- msgdialog_plugin.prx |  |-- netconf_plugin.prx |  |-- netfront.prx |  |-- netplay_server2_utility.prx |  |-- netplay_server_plus_utility.prx |  |-- netplay_server_utility.prx |  |-- npinstaller_plugin.prx |  |-- npsignin_plugin.prx |  |-- npsignup_plugin.prx |  |-- pafmini.prx |  |-- ps3scan_plugin.prx |  |-- psn_utility.prx |  |-- savedata_auto_dialog.prx |  |-- savedata_utility.prx |  |-- screenshot_plugin.prx |  |-- store_browser_plugin.prx |  |-- store_checkout_plugin.prx |  `-- store_checkout_utility.prx `-- resource |-- auth_plugin.rco |-- dd_helper.rco |-- dnas_plugin.rco |-- game_install_plugin.rco |-- htmlviewer.res |-- msgdialog_plugin.rco |-- netconf_dialog.rco |-- netplay_plugin.rco |-- npinstaller_plugin.rco |-- npsignin_plugin.rco |-- npsignup_plugin.rco |-- ps3scan_plugin.rco |-- psn_plugin.rco |-- savedata_utility.rco |-- screenshot_plugin.rco |-- store_browser_plugin.rco |-- store_checkout_plugin.rco `-- system_plugin.rco
 * -- codepage
 * `-- cptbl.dat
 * -- data
 * `-- cert
 * `-- CA_LIST.cer
 * -- font
 * |-- arib.pgf
 * |-- gb3s1518.bwfon
 * |-- imagefont.bin
 * |-- jpn0.pgf
 * |-- kr0.pgf
 * |-- ltn0.pgf
 * |-- ltn10.pgf
 * |-- ltn11.pgf
 * |-- ltn12.pgf
 * |-- ltn13.pgf
 * |-- ltn14.pgf
 * |-- ltn15.pgf
 * |-- ltn1.pgf
 * |-- ltn2.pgf
 * |-- ltn3.pgf
 * |-- ltn4.pgf
 * |-- ltn5.pgf
 * |-- ltn6.pgf
 * |-- ltn7.pgf
 * |-- ltn8.pgf
 * `-- ltn9.pgf
 * -- kd
 * |-- amctrl.prx
 * |-- audiocodec_260.prx
 * |-- avcodec.prx
 * |-- cert_loader.prx
 * |-- chkreg.prx
 * |-- chnnlsv.prx
 * |-- dmacman.prx
 * |-- exceptionman.prx
 * |-- exitgame.prx
 * |-- g729.prx
 * |-- ge_2.prx
 * |-- ge.prx
 * |-- http_storage.prx
 * |-- ifhandle.prx
 * |-- impose_kermit.prx
 * |-- init.prx
 * |-- interruptman.prx
 * |-- iofilemgr_dnas.prx
 * |-- iofilemgr.prx
 * |-- isofs.prx
 * |-- kermit_2.prx
 * |-- kermit_audio.prx
 * |-- kermit_ctrl.prx
 * |-- kermit_display.prx
 * |-- kermit_flashfs.prx
 * |-- kermit_hpremote.prx
 * |-- kermit_idstorage.prx
 * |-- kermit_lowio.prx
 * |-- kermit_me_wrapper.prx
 * |-- kermit_msemu.prx
 * |-- kermit_msfs.prx
 * |-- kermit_netconf_dialog.prx
 * |-- kermit_osk_plugin.prx
 * |-- kermit_peripheral.prx
 * |-- kermit_power.prx
 * |-- kermit.prx
 * |-- kermit_rtc.prx
 * |-- kermit_usb.prx
 * |-- kermit_utility.prx
 * |-- kermit_wlan_2.prx
 * |-- kermit_wlan.prx
 * |-- libaac.prx
 * |-- libasfparser.prx
 * |-- libatrac3plus.prx
 * |-- libaudiocodec2.prx
 * |-- libdnas_core.prx
 * |-- libdnas.prx
 * |-- libgameupdate.prx
 * |-- libhttp.prx
 * |-- libmp3.prx
 * |-- libmp4.prx
 * |-- libparse_http.prx
 * |-- libparse_uri.prx
 * |-- libssl.prx
 * |-- libupdown.prx
 * |-- loadcore.prx
 * |-- loadexec_01g.prx
 * |-- mcctrl.prx
 * |-- mediasync.prx
 * |-- memab.prx
 * |-- memlmd_01g_2.prx
 * |-- memlmd_01g.prx
 * |-- mesg_led_01g.prx
 * |-- mgvideo.prx
 * |-- modulemgr.prx
 * |-- mp4msv.prx
 * |-- mpegbase_260.prx
 * |-- mpeg.prx
 * |-- np9660.prx
 * |-- np_auth.prx
 * |-- np_commerce2.prx
 * |-- np_commerce2_regcam.prx
 * |-- np_commerce2_store.prx
 * |-- np_core.prx
 * |-- npdrm.prx
 * |-- np_inst.prx
 * |-- np_matching2.prx
 * |-- np.prx
 * |-- np_service.prx
 * |-- openpsid.prx
 * |-- psheet.prx
 * |-- pspnet_adhoc_auth.prx
 * |-- pspnet_adhocctl.prx
 * |-- pspnet_adhoc_discover.prx
 * |-- pspnet_adhoc_download.prx
 * |-- pspnet_adhoc_matching.prx
 * |-- pspnet_adhoc.prx
 * |-- pspnet_adhoc_transfer_int.prx
 * |-- pspnet_apctl_2.prx
 * |-- pspnet_apctl.prx
 * |-- pspnet_inet_2.prx
 * |-- pspnet_inet.prx
 * |-- pspnet.prx
 * |-- pspnet_resolver.prx
 * |-- pspnet_upnp.prx
 * |-- pspnet_wispr.prx
 * |-- registry.prx
 * |-- resource
 * |  `-- impose_05g.rsc
 * |-- sc_sascore.prx
 * |-- sircs.prx
 * |-- sysmem.prx
 * |-- systimer.prx
 * |-- threadman.prx
 * |-- usbacc.prx
 * |-- usbcam.prx
 * |-- usbgps.prx
 * |-- usbmic.prx
 * |-- usbpspcm.prx
 * |-- usersystemlib.prx
 * |-- vaudio.prx
 * `-- videocodec_260.prx
 * -- pspbtcnf.bin
 * -- reboot.bin

FLASH0 1.80 changes
|-- module |-- libpspvmc.prx added
 * -- font
 * |-- arib.pgf    removed
 * -- kd
 * |-- kermit_me_wrapper_2.prx    added
 * |-- pops_01g.prx    added
 * |-- popsman.prx    added
 * -- vsh

Flash0 Dump code
Please use responsibly.

int kthread(SceSize args, void *argp) {	// Find File Manager Module SceModule2 * iofilemgr = _sceKernelFindModuleByName("sceIOFileManager"); // Find required Functions KernelIOOpen = (void *)iofilemgr->text_addr + IOFILEMGR_IO_OPEN; KernelIOWrite = (void *)iofilemgr->text_addr + IOFILEMGR_IO_WRITE; KernelIOClose = (void *)iofilemgr->text_addr + IOFILEMGR_IO_CLOSE; flashVitaDump( GAME_SAVE_PATH "h.bin"/*"flashVitaDump.zip"*/ ); return 0; }

void initKernelThread(void) {	SceModule2 *threadman = _sceKernelFindModuleByName("sceThreadManager"); _sceKernelCreateThread = (void *)((u32)threadman->text_addr + THREADMAN_CREATE_THREAD); _sceKernelStartThread = (void *)((u32)threadman->text_addr + THREADMAN_START_THREAD); SceUID kthreadID = _sceKernelCreateThread( "Kernel thread", KERNELIFY(kthread), 25, 0x10000, 0, NULL ); if (kthreadID >= 0)	_sceKernelStartThread(kthreadID, 0, NULL); else	PRTSTR1("Error: sceKernelCreateThread -> 0x%08lX\n", kthreadID); }

struct minZipHeader { char pk[2]; unsigned nb; char space[12]; unsigned fileSize; unsigned fileSizeClone; unsigned pathLen; /*	path data */ };

typedef struct{ char *name; void *content; u32 size; }VitaFlashBufferFile;

unsigned addWriteFile( SceUID packFileID, void *data, unsigned size, char *name, u8 found_nb ) {	const char *root = "flash0"; char path[256]; strcpy(path, root); // If file name has no / at first, add it	if ( name[0] != '/' ) path[strlen(path)+1] = 0, path[strlen(path)] = '/'; strcat(path, name); // If file was already dumped, add custom name suffix if ( found_nb > 1)	strcat(path, ".bakX"), path[strlen(path)-1] = '0'+found_nb-2; // Write Data struct minZipHeader zHead; strcpy(zHead.pk, "PK"); zHead.nb = 0x000A0403; memset(zHead.space, 0, sizeof(zHead.space)); zHead.fileSize = size; zHead.fileSizeClone = size; zHead.pathLen = strlen(path); KernelIOWrite(packFileID, &(zHead.pk), 2); KernelIOWrite(packFileID, &(zHead.nb), sizeof(u32)); KernelIOWrite(packFileID, &(zHead.space), sizeof(zHead.space)); KernelIOWrite(packFileID, &(zHead.fileSize), sizeof(u32)); KernelIOWrite(packFileID, &(zHead.fileSizeClone), sizeof(u32)); KernelIOWrite(packFileID, &(zHead.pathLen), sizeof(u32)); KernelIOWrite(packFileID, path, zHead.pathLen); unsigned written = KernelIOWrite(packFileID, data, size); return written; }

int findFlashIndex( const VitaFlashBufferFile *f0, void *origContent ) {	int flash0_filecount = 0; while ( origContent != f0[flash0_filecount].content && f0[flash0_filecount].name != NULL ) ++flash0_filecount; if ( f0[flash0_filecount].name == NULL )	return -1; else	return flash0_filecount; }

void flashVitaDump( char *packName ) {	uint32_t sonyF0 = 0x8B000000; uint32_t sonyF0Backup = 0x8BF00000; int flash0_fileindex = 0; uint32_t totalwrite = 0; int isValid, i;	int dummy_count = 0; int backup_count = 0; char *name = NULL; u8 found_f0[512]; for ( i=0; i<sizeof(found_f0); ++i )	found_f0[i] = 0; const VitaFlashBufferFile * f0 = (VitaFlashBufferFile *)sonyF0; SceUID packFileID = KernelIOOpen(packName, PSP_O_WRONLY | PSP_O_CREAT, 0777); if (packFileID) {		setPrintColorRGB(255, 0, 0); PRTSTR0(""); PRTSTR0("Dumping flash"); PRTSTR0(""); setPrintColorRGB(0, 255, 255); // Write all found flash files while ( f0[flash0_fileindex].name != NULL ) {			name = f0[flash0_fileindex].name; isValid = 0; if ( name[strlen(name)-3] == 'p' && name[strlen(name)-2] == 'r' && name[strlen(name)-1] == 'x' ) {				switch ( *((int*)f0[flash0_fileindex].content) ) {					case 0x5053507E: isValid = 1; break; case 0: dummy_count++; break; default: PRTSTR0("Unknown prx : %08lX", name); isValid = 1; break; }			}			else	isValid = 1; if ( isValid ) {				found_f0[flash0_fileindex]++; PRTSTR0("Writing file ..."); totalwrite += addWriteFile( packFileID, f0[flash0_fileindex].content, f0[flash0_fileindex].size, name, found_f0[flash0_fileindex] ); PRTSTR0("File dumped"); }			else {				//PRTSTR0("Invalid flash file : %08lX", name); PRTSTR0("Dummied flash file"); }			++flash0_fileindex; }		uint32_t *curf0Backup = sonyF0Backup; setPrintColorRGB(255, 0, 0); PRTSTR0(""); PRTSTR0("Dumping flash backup"); PRTSTR0(""); setPrintColorRGB(0, 255, 255); // Write all found flash backups while ( *curf0Backup != NULL ) {			uint32_t origContent = *curf0Backup; flash0_fileindex = findFlashIndex(f0, origContent); unsigned size = *(curf0Backup+1); curf0Backup += 2; if ( flash0_fileindex >= 0 ) {				found_f0[flash0_fileindex]++; name = f0[flash0_fileindex].name; PRTSTR0("Writing file ..."); totalwrite += addWriteFile( packFileID, curf0Backup, size, name, found_f0[flash0_fileindex] ); backup_count++; PRTSTR0("File dumped"); }			else {				PRTSTR0("%08lX not found", origContent); // Quit because usually means a general error break; }			curf0Backup += size/4 + 1; }		KernelIOClose(packFileID); //PRTSTR0("Dummy files: %08lX, backup files: %08lX ", dummy_count, backup_count); setPrintColorRGB(255, 0, 0); PRTSTR0(""); PRTSTR0("Flash successfully dumped"); PRTSTR0(""); setPrintColorRGB(0, 255, 255); } }