mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Fix sceIoGetStat, memstick capacity check
This commit is contained in:
parent
13460b7aa6
commit
fede297f30
1 changed files with 34 additions and 27 deletions
|
@ -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 {
|
||||
|
|
Loading…
Add table
Reference in a new issue