diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index d25d07983d..aa6e540c74 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -245,13 +245,16 @@ void __IoGetStat(SceIoStat *stat, PSPFileInfo &info) { u32 sceIoGetstat(const char *filename, u32 addr) { SceIoStat stat; PSPFileInfo info = pspFileSystem.GetFileInfo(filename); - __IoGetStat(&stat, info); - Memory::WriteStruct(addr, &stat); - - DEBUG_LOG(HLE, "sceIoGetstat(%s, %08x) : sector = %08x", filename, addr, + if (info.exists) { + __IoGetStat(&stat, info); + Memory::WriteStruct(addr, &stat); + DEBUG_LOG(HLE, "sceIoGetstat(%s, %08x) : sector = %08x", filename, addr, info.startSector); - - return 0; + return 0; + } else { + DEBUG_LOG(HLE, "sceIoGetstat(%s, %08x) : FILE NOT FOUND", filename, addr); + return SCE_KERNEL_ERROR_NOFILE; + } } //Not sure about wrapping it or not, since the log seems to take the address of the data var @@ -428,11 +431,11 @@ void sceIoSync() { } struct DeviceSize { + u32 maxClusters; + u32 freeClusters; u32 maxSectors; u32 sectorSize; - u32 sectorsPerCluster; - u32 totalClusters; - u32 freeClusters; + u32 sectorCount; }; u32 sceIoDevctl(const char *name, int cmd, u32 argAddr, int argLen, u32 outPtr, int outLen) { @@ -512,20 +515,23 @@ u32 sceIoDevctl(const char *name, int cmd, u32 argAddr, int argLen, u32 outPtr, case 0x02425818: // Get memstick size etc // Pretend we have a 2GB memory stick. - if (Memory::IsValidAddress(argAddr)) { // "Should" be outPtr but isn't + if (Memory::IsValidAddress(argAddr) && argLen >= 4) { // "Should" be outPtr but isn't u32 pointer = Memory::Read_U32(argAddr); - - u64 totalSize = (u32)2 * 1024 * 1024 * 1024; - u64 freeSize = 1 * 1024 * 1024 * 1024; + u32 sectorSize = 0x200; + u32 memStickSectorSize = 32 * 1024; + u32 sectorCount = memStickSectorSize / sectorSize; + u64 freeSize = 1 * 1024 * 1024 * 1024; DeviceSize deviceSize; - deviceSize.maxSectors = 512; - deviceSize.sectorSize = 0x200; - deviceSize.sectorsPerCluster = 0x08; - deviceSize.totalClusters = (u32)((totalSize * 95 / 100) / (deviceSize.sectorSize * deviceSize.sectorsPerCluster)); - deviceSize.freeClusters = (u32)((freeSize * 95 / 100) / (deviceSize.sectorSize * deviceSize.sectorsPerCluster)); + deviceSize.maxClusters = (freeSize * 95 / 100) / (sectorSize * sectorCount); + deviceSize.freeClusters = deviceSize.maxClusters; + deviceSize.maxSectors = deviceSize.maxClusters; + deviceSize.sectorSize = sectorSize; + deviceSize.sectorCount = sectorCount; Memory::WriteStruct(pointer, &deviceSize); + DEBUG_LOG(HLE, "Returned memstick size: maxSectors=%i", deviceSize.maxSectors); return 0; } else { + ERROR_LOG(HLE, "memstick size query: bad params"); return ERROR_MEMSTICK_DEVCTL_BAD_PARAMS; } } @@ -580,17 +586,18 @@ u32 sceIoDevctl(const char *name, int cmd, u32 argAddr, int argLen, u32 outPtr, case 0x02425818: // Get memstick size etc // Pretend we have a 2GB memory stick. { - if (Memory::IsValidAddress(argAddr)) { // "Should" be outPtr but isn't + if (Memory::IsValidAddress(argAddr) && argLen >= 4) { // NOTE: not outPtr u32 pointer = Memory::Read_U32(argAddr); - - u64 totalSize = (u32)2 * 1024 * 1024 * 1024; - u64 freeSize = 1 * 1024 * 1024 * 1024; + u32 sectorSize = 0x200; + u32 memStickSectorSize = 32 * 1024; + u32 sectorCount = memStickSectorSize / sectorSize; + u64 freeSize = 1 * 1024 * 1024 * 1024; DeviceSize deviceSize; - deviceSize.maxSectors = 512; - deviceSize.sectorSize = 0x200; - deviceSize.sectorsPerCluster = 0x08; - deviceSize.totalClusters = (u32)((totalSize * 95 / 100) / (deviceSize.sectorSize * deviceSize.sectorsPerCluster)); - deviceSize.freeClusters = (u32)((freeSize * 95 / 100) / (deviceSize.sectorSize * deviceSize.sectorsPerCluster)); + deviceSize.maxClusters = (freeSize * 95 / 100) / (sectorSize * sectorCount); + deviceSize.freeClusters = deviceSize.maxClusters; + deviceSize.maxSectors = deviceSize.maxClusters; + deviceSize.sectorSize = sectorSize; + deviceSize.sectorCount = sectorCount; Memory::WriteStruct(pointer, &deviceSize); return 0; } else {