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));
}
}