CSPspEmu.Hle.Vfs.MemoryStick.HleIoDriverMemoryStick.IoDevctl C# (CSharp) Метод

IoDevctl() публичный Метод

public IoDevctl ( HleIoDrvFileArg HleIoDrvFileArg, string DeviceName, uint Command, byte InputPointer, int InputLength, byte OutputPointer, int OutputLength ) : int
HleIoDrvFileArg HleIoDrvFileArg
DeviceName string
Command uint
InputPointer byte
InputLength int
OutputPointer byte
OutputLength int
Результат int
        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;
        }