Hi, i have modded UMDKiller PRX edition and wish to explain, how it works
https://pastebin.com/iJsTSgST
the main part is this code
opening UMD for reading, not the file system, the media itself
fd = sceIoOpen("umd0:", PSP_O_RDONLY, 0777);
allocating buffer in memory
umdbuffer=malloc(2097152);
reading 1024 sectors in buffer
sceIoRead(fd, umdbuffer, 1024);
opening file for writing on memorystick
redump = sceIoOpen("ms0:/ISO/REDUMP.iso", PSP_O_WRONLY| PSP_O_CREAT | PSP_O_TRUNC, 0777);
writing buffer bytes to file
sceIoWrite(redump, umdbuffer, 1024*2048);
it works with sectors, not file system
working buffer is 1 or 2 megabytes doesn't affect the perfomance, ripping time is equal, PSFiller == UMDKiller (300 Mb Tron Evolution in ~3:30 minutes)
What have been modded.
the original killer reads and saves chunks of 512 sectors at once.
this is ok when the size of UMD is a multiple of 512 (my test Tron Evolution is multiple, what a luck)
and i can't understand if original source does have the routine to handle not multiple UMDs, maybe this sceIoRead is so clever and can handle it by itself?
ok, there is a function "sceIoLseek" it can show the end sector, and if we add +1, it will be the size of the UMD
there is another place, that stores complete size in sectors, 16th sector of UMD, at the offset 0x50h
16 * 2048 + 0x50h = 0x8050h
Tron Evolution (ULES-01494)
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00008000 01 43 44 30 30 31 01 00 50 53 50 20 47 41 4D 45 .CD001..PSP GAME
00008010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00008020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00008030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00008040 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 ........
00008050 00 4A 02 00 00 02 4A 00 00 00 00 00 00 00 00 00 .J....J.........
00 4A 02 00 = 024A00h = 150016
I added this check, reading 16th sector and determine the full size of UMD
then I'm splitting the dumping process in two parts there it dumps chunks multiple of 1024
and the remaining non-multiple chunk
range1 = umdFullSize / 1024;
range2 = umdFullSize % 1024;
umdbuffer=malloc(2097152);
for(i=0;i<range1;i++)
{
sceIoRead(fd, umdbuffer, 1024);
sceIoWrite(redump, umdbuffer, 1024*2048);
}
free(umdbuffer);
if(range2!=0)
{
umdbuffer=malloc(range2*2048);
sceIoRead(fd, umdbuffer, range2);
sceIoWrite(redump, umdbuffer, range2*2048);
free(umdbuffer);
}
this is more simple and clear solution
to use this PRX, your should place it in "seplugins" directory on memorystick
add the line to seplugins/vsh.txt "ms0:/seplugins/UMDKiller.prx 1" without quotes
1 means enabled
don't forget to reset the handheld, place umd in drive, wait until it appears in XMB and press NOTE button
Post's attachmentsUMDKiller.zip 30.36 kb, 27 downloads since 2018-07-17
You don't have the permssions to download the attachments of this post.