CSPspEmu.Hle.Vfs.Iso.HleIoDriverIso.IoIoctl C# (CSharp) Method

IoIoctl() public method

public IoIoctl ( HleIoDrvFileArg HleIoDrvFileArg, uint Command, byte InputPointer, int InputLength, byte OutputPointer, int OutputLength ) : int
HleIoDrvFileArg HleIoDrvFileArg
Command uint
InputPointer byte
InputLength int
OutputPointer byte
OutputLength int
return int
        public unsafe int IoIoctl(HleIoDrvFileArg HleIoDrvFileArg, uint Command, byte* InputPointer, int InputLength, byte* OutputPointer, int OutputLength)
        {
            var IsoFileArgument = ((IsoFileArgument)HleIoDrvFileArg.FileArgument);

            ActionIntPVoid ExpectedOutputSize = (int MinimumSize) =>
            {
                if (OutputLength < MinimumSize || OutputPointer == null) throw (new SceKernelException(SceKernelErrors.ERROR_INVALID_ARGUMENT));
                return OutputPointer;
            };

            ActionIntPVoid ExpectedInputSize = (int MinimumSize) =>
            {
                if (InputLength < MinimumSize || InputPointer == null) throw (new SceKernelException(SceKernelErrors.ERROR_INVALID_ARGUMENT));
                return InputPointer;
            };

            switch ((UmdCommandEnum)Command)
            {
            #if false
                case UmdCommandEnum.DefineDecryptionKey:
                    {
                        return 0;
                    }
            #endif
                case UmdCommandEnum.FileSeekSet:
                    {
                        var In = (uint *)ExpectedInputSize(sizeof(uint));
                        IsoFileArgument.Stream.Position = *In;
                        return 0;
                    }
                case UmdCommandEnum.ReadSectors:
                    {
                        var In = (uint *)ExpectedInputSize(sizeof(uint));
                        var NumberOfSectors = *In;
                        var CopySize = (int)(IsoFile.SectorSize * NumberOfSectors);
                        var Out = (byte*)ExpectedOutputSize(CopySize);
                        var BytesReaded = IsoFileArgument.Stream.ReadBytes(CopySize);
                        PointerUtils.Memcpy(Out, BytesReaded, BytesReaded.Length);
                        return 0;
                    }
                case UmdCommandEnum.FileSeek:
                    {
                        var In = (FileSeekIn*)ExpectedInputSize(sizeof(FileSeekIn));
                        IsoFileArgument.Stream.Seek(In->Offset, (SeekOrigin)In->Whence);
                        return 0;
                    }
                case UmdCommandEnum.GetFilePointer:
                    {
                        var Out = (uint*)ExpectedOutputSize(sizeof(uint));
                        *Out = (uint)IsoFileArgument.Stream.Position;
                        return 0;
                    }
                case UmdCommandEnum.GetStartSector:
                    {
                        var Out = (uint*)ExpectedOutputSize(sizeof(uint));
                        *Out = (uint)IsoFileArgument.StartSector;
                        return 0;
                    }
                case UmdCommandEnum.GetSectorSize:
                    {
                        var Out = (uint*)ExpectedOutputSize(sizeof(uint));
                        *Out = IsoFile.SectorSize;
                        return 0;
                    }
                case UmdCommandEnum.GetLengthInBytes:
                    {
                        var Out = (ulong*)ExpectedOutputSize(sizeof(ulong));
                        *Out = (uint)IsoFileArgument.Size;
                        return 0;
                    }
                case UmdCommandEnum.GetPrimaryVolumeDescriptor:
                    {
                        var Out = (PrimaryVolumeDescriptor*)ExpectedOutputSize(sizeof(PrimaryVolumeDescriptor));
                        *Out = Iso.PrimaryVolumeDescriptor;
                        return 0;
                    }
                default:
                    throw new NotImplementedException(String.Format("Not implemented command 0x{0:X} : {1}", Command, (UmdCommandEnum)Command));
            }
        }