From f3d6cffd72691c73559bdd1fbe063825a449eec6 Mon Sep 17 00:00:00 2001 From: tpu Date: Thu, 2 May 2013 17:47:34 +0800 Subject: [PATCH] npdrmLseek/npdrmRead BUG fix --- Core/HLE/sceIo.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index c1a4c0063c..63f7966f40 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -416,7 +416,7 @@ u32 sceIoChstat(const char *filename, u32 iostatptr, u32 changebits) { u32 npdrmRead(FileNode *f, u8 *data, int size) { PGD_DESC *pgd = f->pgdInfo; - u32 block, offset; + u32 block, offset, blockPos; u32 remain_size, copy_size; block = pgd->file_offset/pgd->block_size; @@ -427,6 +427,8 @@ u32 npdrmRead(FileNode *f, u8 *data, int size) { while(remain_size){ if(pgd->current_block!=block){ + blockPos = block*pgd->block_size; + pspFileSystem.SeekFile(f->handle, (s32)pgd->data_offset+blockPos, FILEMOVE_BEGIN); pspFileSystem.ReadFile(f->handle, pgd->block_buf, pgd->block_size); pgd_decrypt_block(pgd, block); pgd->current_block = block; @@ -599,7 +601,7 @@ u32 sceIoCancel(int id) u32 npdrmLseek(FileNode *f, s32 where, FileMove whence) { - u32 newPos; + u32 newPos, blockPos; if(whence==FILEMOVE_BEGIN){ newPos = where; @@ -614,7 +616,8 @@ u32 npdrmLseek(FileNode *f, s32 where, FileMove whence) } f->pgdInfo->file_offset = newPos; - pspFileSystem.SeekFile(f->handle, (s32)f->pgdInfo->data_offset+newPos, whence); + blockPos = newPos&~(f->pgdInfo->block_size-1); + pspFileSystem.SeekFile(f->handle, (s32)f->pgdInfo->data_offset+blockPos, whence); return newPos; } @@ -639,15 +642,14 @@ s64 __IoLseek(SceUID id, s64 offset, int whence) { seek = FILEMOVE_END; break; } + + if(f->npdrm) + return npdrmLseek(f, (s32)offset, seek); + // Yes, -1 is the correct return code for this case. if (newPos < 0) return -1; - - if(f->npdrm){ - return npdrmLseek(f, (s32)offset, seek); - }else{ - return pspFileSystem.SeekFile(f->handle, (s32) offset, seek); - } + return pspFileSystem.SeekFile(f->handle, (s32) offset, seek); } else { return (s32) error; }