public override int IoDevctl(HleIoDrvFileArg HleIoDrvFileArg, string DeviceName, uint Command, byte* InputPointer, int InputLength, byte* OutputPointer, int OutputLength)
{
//Console.Error.WriteLine("MemoryStick.IoDevctl: ({0}, 0x{1:X})", DeviceName, Command);
switch ((CommandType)Command)
{
case CommandType.CheckInserted:
{
if (OutputPointer == null || OutputLength < 4) return (int)SceKernelErrors.ERROR_ERRNO_INVALID_ARGUMENT;
// 0 - Device is not assigned (callback not registered).
// 1 - Device is assigned (callback registered).
*(uint*)OutputPointer = 1;
return 0;
}
case CommandType.MScmRegisterMSInsertEjectCallback:
{
if (InputPointer == null || InputLength < 4) return (int)SceKernelErrors.ERROR_ERRNO_INVALID_ARGUMENT;
int CallbackId = *(int*)InputPointer;
MemoryStickEventHandler.ScheduleCallback(CallbackId, 1, 1);
//var Callback = CallbackManager.Callbacks.Get(CallbackId);
//CallbackManager.ScheduleCallback(
// HleCallback.Create(
// "RegisterInjectEjectCallback",
// Callback.Function,
// new object[] {
// 1, // a0
// 1, // a1
// Callback.Arguments[0] // a2
// }
// )
//);
return 0;
}
case CommandType.GetMemoryStickCapacity:
{
if (InputPointer == null || InputLength < 4) return (int)SceKernelErrors.ERROR_ERRNO_INVALID_ARGUMENT;
var SizeInfo = (SizeInfoStruct*)Memory.PspAddressToPointerSafe(*(uint *)InputPointer);
var MemoryStickSectorSize = (32 * 1024);
//var TotalSpaceInBytes = 2L * 1024 * 1024 * 1024;
var FreeSpaceInBytes = 1L * 1024 * 1024 * 1024;
SizeInfo->SectorSize = 0x200;
SizeInfo->SectorCount = (uint)(MemoryStickSectorSize / SizeInfo->SectorSize);
SizeInfo->MaxClusters = (uint)(FreeSpaceInBytes * 95 / 100) / (SizeInfo->SectorSize * SizeInfo->SectorCount);
SizeInfo->FreeClusters = SizeInfo->MaxClusters;
SizeInfo->MaxSectors = SizeInfo->MaxClusters;
return 0;
}
case CommandType.MScmUnregisterMSInsertEjectCallback:
// Ignore.
return 0;
case CommandType.CheckMemoryStickIsInserted:
*((uint*)OutputPointer) = 1;
return 0;
case CommandType.CheckMemoryStickStatus:
// 0 <- Busy
// 1 <- Ready
*((uint*)OutputPointer) = 4;
break;
default:
Console.Error.WriteLine("MemoryStick.IoDevctl Not Implemented! ({0}, 0x{1:X})", DeviceName, Command);
break;
}
return 0;
}