Exemple #1
0
 public unsafe int IoClose(HleIoDrvFileArg HleIoDrvFileArg)
 {
     var Stream = ((Stream)HleIoDrvFileArg.FileArgument);
     Stream.Close();
     return 0;
     //throw new NotImplementedException();
 }
Exemple #2
0
 public unsafe int IoDopen(HleIoDrvFileArg HleIoDrvFileArg, string Name)
 {
     //throw new NotImplementedException();
     var IsoNode = Iso.Root.Locate(Name);
     HleIoDrvFileArg.FileArgument = new DirectoryEnumerator<IsoNode>(IsoNode.Childs.ToArray());
     return 0;
 }
        public unsafe int IoDevctl(HleIoDrvFileArg HleIoDrvFileArg, string DeviceName, uint Command, byte* InputPointer, int InputLength, byte* OutputPointer, int OutputLength)
        {
            switch (DeviceName)
            {
                case "emulator:": break;
                case "kemulator:": break;
                default: throw (new InvalidOperationException());
            }

            //Console.Error.WriteLine("     {0}", (EmulatorDevclEnum)Command);
            switch ((EmulatorDevclEnum)Command)
            {
                case EmulatorDevclEnum.GetHasDisplay:
                    *((int*)OutputPointer) = DisplayConfig.Enabled ? 1 : 0;
                    break;
                case EmulatorDevclEnum.SendOutput:
                    var OutputString = new String((sbyte*)InputPointer, 0, InputLength, Encoding.ASCII);
                    this.HleOutputHandler.Output(OutputString);
                    //Console.Error.WriteLine("{0}", OutputString);
                    break;
                case EmulatorDevclEnum.IsEmulator:
                    return 0;
                case EmulatorDevclEnum.EmitScreenshot:
                    if (PspHleRunningConfig.FileNameBase == null || PspHleRunningConfig.FileNameBase == "") throw (new Exception("PspHleRunningConfig.FileNameBase is empty"));
                    this.PspDisplay.TakeScreenshot().Save(String.Format("{0}.lastoutput.{1}.png", PspHleRunningConfig.FileNameBase, ScreenShotCount++), ImageFormat.Png);
                    break;
                default:
                    Console.Error.WriteLine("Unknown emulator command '{0}':0x{1:X} <- {2}", DeviceName, Command, (EmulatorDevclEnum)Command);
                    return -1;
            }
            return -1;
        }
Exemple #4
0
 public unsafe int IoGetstat(HleIoDrvFileArg HleIoDrvFileArg, string FileName, SceIoStat* Stat)
 {
     try
     {
         var ZipEntry = ZipArchive[FileName];
         Stat->Attributes = IOFileModes.CanRead | IOFileModes.File;
         Stat->Mode = SceMode.All;
         Stat->Size = ZipEntry.OpenUncompressedStream().Length;
         return 0;
     }
     catch (KeyNotFoundException)
     {
         throw (new FileNotFoundException("Can't find file '" + FileName + "' on ZipFile"));
     }
 }
Exemple #5
0
        public unsafe int IoDread(HleIoDrvFileArg HleIoDrvFileArg, HleIoDirent* IoDirent)
        {
            var Enumerator = (DirectoryEnumerator<IsoNode>)HleIoDrvFileArg.FileArgument;

            // More items.
            if (Enumerator.MoveNext())
            {
                //Console.Error.WriteLine("'{0}'", Enumerator.Current.ToString());
                var IsoNode = Enumerator.Current;
                {
                    PointerUtils.StoreStringOnPtr(IsoNode.Name, Encoding.UTF8, IoDirent->Name);
                    _IoGetstat(IsoNode, &IoDirent->Stat);
                }
            }
            // No more items.
            else
            {
            }

            return Enumerator.GetLeft();
        }
		public unsafe int IoOpen(HleIoDrvFileArg HleIoDrvFileArg, string FileName, HleIoFlags Flags, SceMode Mode)
		{
			var RealFileName = GetFullNormalizedAndSanitizedPath(FileName);
			FileMode FileMode = FileMode.Open;
			FileAccess FileAccess = 0;
			bool Append = (Flags & HleIoFlags.Append) != 0;
			bool Read = (Flags & HleIoFlags.Read) != 0;
			bool Write = (Flags & HleIoFlags.Write) != 0;
			bool Truncate = (Flags & HleIoFlags.Truncate) != 0;
			bool Create = (Flags & HleIoFlags.Create) != 0;

			if (Read) FileAccess |= FileAccess.Read;
			if (Write) FileAccess |= FileAccess.Write;

			if (Append)
			{
				FileMode = FileMode.OpenOrCreate;
			}
			else if (Create)
			{
				FileMode = FileMode.Create;
			}
			else if (Truncate)
			{
				FileMode = FileMode.Truncate;
			}

			//if (Append) FileMode |= FileMode.Open;

			var Stream = File.Open(RealFileName, FileMode, FileAccess, FileShare.Delete | FileShare.ReadWrite);
			HleIoDrvFileArg.FileArgument = Stream;

			if (Append)
			{
				Stream.Position = Stream.Length;
			}

			return 0;
		}
 public unsafe int IoDopen(HleIoDrvFileArg HleIoDrvFileArg, string Name)
 {
     var RealFileName = GetFullNormalizedAndSanitizedPath(Name);
     try
     {
         //Console.Error.WriteLine("'{0}'", RealFileName);
         var FileSystemInfo = new DirectoryInfo(RealFileName).EnumerateFileSystemInfos().ToArray();
         /*
         foreach (var Info in FileSystemInfo)
         {
             Console.Error.WriteLine(Info);
         }
         */
         HleIoDrvFileArg.FileArgument = new DirectoryEnumerator<FileSystemInfo>(FileSystemInfo);
         return 0;
     }
     catch (DirectoryNotFoundException DirectoryNotFoundException)
     {
         Console.WriteLine(DirectoryNotFoundException);
         return -1;
     }
 }
        public unsafe int IoDevctl(HleIoDrvFileArg HleIoDrvFileArg, string DeviceName, uint Command, byte* InputPointer, int InputLength, byte* OutputPointer, int OutputLength)
        {
            switch (DeviceName)
            {
                case "emulator:": break;
                case "kemulator:": break;
                default: throw(new InvalidOperationException());
            }

            Console.WriteLine("     {0}", (EmulatorDevclEnum)Command);
            switch ((EmulatorDevclEnum)Command)
            {
                case EmulatorDevclEnum.GetHasDisplay:
                    *((int*)OutputPointer) = HleState.CpuProcessor.PspConfig.HasDisplay ? 1 : 0;
                    break;
                case EmulatorDevclEnum.SendOutput:
                    HleState.HleOutputHandler.Output(new String((sbyte*)InputPointer, 0, InputLength, Encoding.ASCII));
                    break;
                case EmulatorDevclEnum.IsEmulator:
                    return 0;
            }
            return 0;
        }
 public unsafe int IoDevctl(HleIoDrvFileArg HleIoDrvFileArg, string DeviceName, uint Command, Span <byte> Input,
                            Span <byte> Output, ref bool DoDleay)
 {
     throw new NotImplementedException();
 }
 public unsafe int IoRead(HleIoDrvFileArg HleIoDrvFileArg, byte* OutputPointer, int OutputLength)
 {
     try
     {
         var Buffer = new byte[OutputLength];
         var FileStream = ((FileStream)HleIoDrvFileArg.FileArgument);
         //Console.WriteLine("ReadPosition: {0}", FileStream.Position);
         int Readed = FileStream.Read(Buffer, 0, OutputLength);
         for (int n = 0; n < Readed; n++) *OutputPointer++ = Buffer[n];
         return Readed;
     }
     catch (Exception Exception)
     {
         Console.WriteLine(Exception);
         return -1;
     }
 }
Exemple #11
0
        public unsafe int IoDread(HleIoDrvFileArg HleIoDrvFileArg, HleIoDirent* IoDirent)
        {
            //var Enumerator = (DirectoryEnumerator<IsoNode>)(DisposableDummy<DirectoryEnumerator<IsoNode>>)HleIoDrvFileArg.FileArgument;
            var Enumerator = (DirectoryEnumerator<IsoNode>)HleIoDrvFileArg.FileArgument;

            // More items.
            if (Enumerator.MoveNext())
            {
                //Console.Error.WriteLine("'{0}'", Enumerator.Current.ToString());
                var IsoNode = Enumerator.Current;
                {
                    IoDirent->Name = IsoNode.Name;
                    _IoGetstat(IsoNode, &IoDirent->Stat);
                }
            }
            // No more items.
            else
            {
            }

            return Enumerator.GetLeft();
        }
Exemple #12
0
 public unsafe int IoMkdir(HleIoDrvFileArg HleIoDrvFileArg, string Name, SceMode Mode)
 {
     throw new NotImplementedException();
 }
Exemple #13
0
 public unsafe int IoRename(HleIoDrvFileArg HleIoDrvFileArg, string OldFileName, string NewFileName)
 {
     throw new NotImplementedException();
 }
Exemple #14
0
 public unsafe int IoDclose(HleIoDrvFileArg HleIoDrvFileArg)
 {
     //throw new NotImplementedException();
     return 0;
 }
Exemple #15
0
        public unsafe int IoRead(HleIoDrvFileArg HleIoDrvFileArg, byte *OutputPointer, int OutputLength)
        {
            var FileArgument = (Stream)HleIoDrvFileArg.FileArgument;

            return(FileArgument.ReadToPointer(OutputPointer, OutputLength));
        }
Exemple #16
0
 public unsafe int IoRead(HleIoDrvFileArg HleIoDrvFileArg, byte* OutputPointer, int OutputLength)
 {
     var Stream = ((Stream)HleIoDrvFileArg.FileArgument);
     var OutputData = new byte[OutputLength];
     int Readed = Stream.Read(OutputData, 0, OutputLength);
     Marshal.Copy(OutputData, 0, new IntPtr(OutputPointer), OutputLength);
     return Readed;
     //throw new NotImplementedException();
 }
Exemple #17
0
        public unsafe long IoLseek(HleIoDrvFileArg HleIoDrvFileArg, long Offset, SeekAnchor Whence)
        {
            var FileArgument = (Stream)HleIoDrvFileArg.FileArgument;

            return(FileArgument.Seek(Offset, (SeekOrigin)Whence));
        }
Exemple #18
0
 public unsafe int IoWrite(HleIoDrvFileArg HleIoDrvFileArg, byte *InputPointer, int InputLength)
 {
     throw new NotImplementedException();
 }
Exemple #19
0
 public unsafe int IoDread(HleIoDrvFileArg HleIoDrvFileArg, HleIoDirent *dir)
 {
     throw new NotImplementedException();
 }
Exemple #20
0
 public unsafe int IoDclose(HleIoDrvFileArg HleIoDrvFileArg)
 {
     throw new NotImplementedException();
 }
Exemple #21
0
 public unsafe int IoDopen(HleIoDrvFileArg HleIoDrvFileArg, string Name)
 {
     throw new NotImplementedException();
 }
        public unsafe int IoWrite(HleIoDrvFileArg HleIoDrvFileArg, byte* InputPointer, int InputLength)
        {
            try
            {
                var Buffer = new byte[InputLength];
                for (int n = 0; n < InputLength; n++) Buffer[n]  = * InputPointer++;

                var FileStream = ((FileStream)HleIoDrvFileArg.FileArgument);
                FileStream.Write(Buffer, 0, InputLength);
                FileStream.Flush();
                return InputLength;
            }
            catch (Exception)
            {
                //Console.Error.WriteLine(Exception);
                return -1;
            }
        }
Exemple #23
0
        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));
            }
        }
Exemple #24
0
        public unsafe int IoOpen(HleIoDrvFileArg HleIoDrvFileArg, string FileName, HleIoFlags Flags, SceMode Mode)
        {
            // disc0:/sce_lbn0x5fa0_size0x1428
            //Console.WriteLine(":::::::::" + FileName);
            if (FileName.StartsWith("/sce_"))
            {
                int Sector = 0, Size = 0;
                var Parts = FileName.Substring(5).Split('_');
                foreach (var Part in Parts)
                {
                    if (Part.StartsWith("lbn"))
                    {
                        var Number = Part.Substring(3);
                        Sector = NumberUtils.ParseIntegerConstant(Number);
                    }
                    else if (Part.StartsWith("size"))
                    {
                        var Number = Part.Substring(4);
                        Size = NumberUtils.ParseIntegerConstant(Number);
                    }
                    else
                    {
                        throw(new NotImplementedException("Can't handle special filename '" + FileName + "' part '" + Part + "'"));
                    }
                    //Console.WriteLine(Part);
                }
                //Console.WriteLine("SPECIAL({0}, {1})", lbn, size);
                //Console.WriteLine("SPECIAL!!!!!!!!!!!!!!!!!!!!");
                HleIoDrvFileArg.FileArgument = Iso.Stream.SliceWithLength(Sector * IsoFile.SectorSize, Size);
                return 0;
            }

            //Console.WriteLine(FileName);
            var IsoNode = Iso.Root.Locate(FileName);
            HleIoDrvFileArg.FileArgument = IsoNode.Open();
            return 0;
        }
Exemple #25
0
        public unsafe int IoOpen(HleIoDrvFileArg HleIoDrvFileArg, string FileName, HleIoFlags Flags, SceMode Mode)
        {
            // Ignore the filename in "umd0:xxx".
            // Using umd0: is always opening the whole UMD in sector block mode,
            // ignoring the file name specified after the colon.
            if (HleIoDrvFileArg.DriverName.ToLower().StartsWith("umd"))
            {
                FileName = "";
            }

            // disc0:/sce_lbn0x5fa0_size0x1428
            //Console.WriteLine(":::::::::" + FileName);
            if (FileName == "")
            {
                HleIoDrvFileArg.FileArgument = new IsoFileArgument()
                {
                    IsoNode = null,
                    StartSector = 0,
                    Size = Iso.Stream.Length,
                    Stream = Iso.Stream,
                };
                return 0;
            }

            if (FileName.StartsWith("/sce_"))
            {
                int Sector = 0, Size = 0;
                var Parts = FileName.Substring(5).Split('_');
                foreach (var Part in Parts)
                {
                    if (Part.StartsWith("lbn"))
                    {
                        var Number = Part.Substring(3);
                        Sector = NumberUtils.ParseIntegerConstant(Number, 16);
                    }
                    else if (Part.StartsWith("size"))
                    {
                        var Number = Part.Substring(4);
                        Size = NumberUtils.ParseIntegerConstant(Number, 16);
                    }
                    else
                    {
                        throw(new NotImplementedException("Can't handle special filename '" + FileName + "' part '" + Part + "'"));
                    }
                    //Console.WriteLine(Part);
                }
                //Console.WriteLine("SPECIAL({0}, {1})", lbn, size);
                //Console.WriteLine("SPECIAL!!!!!!!!!!!!!!!!!!!!");
                HleIoDrvFileArg.FileArgument = new IsoFileArgument()
                {
                    IsoNode = null,
                    StartSector = Sector,
                    Size = Size,
                    Stream = Iso.Stream.SliceWithLength(Sector * IsoFile.SectorSize, Size),
                };
                return 0;
            }

            //Console.WriteLine(FileName);
            var IsoNode = Iso.Root.Locate(FileName);
            ;
            HleIoDrvFileArg.FileArgument = new IsoFileArgument()
            {
                IsoNode = IsoNode,
                StartSector = IsoNode.DirectoryRecord.Extent,
                Size = IsoNode.DirectoryRecord.Size,
                Stream = IsoNode.Open(),
            };
            return 0;
        }
Exemple #26
0
 public unsafe int IoChdir(HleIoDrvFileArg HleIoDrvFileArg, string DirectoryName)
 {
     throw new NotImplementedException();
 }
Exemple #27
0
 public unsafe int IoRename(HleIoDrvFileArg HleIoDrvFileArg, string OldFileName, string NewFileName)
 {
     throw new NotImplementedException();
 }
Exemple #28
0
 public unsafe int IoChstat(HleIoDrvFileArg HleIoDrvFileArg, string FileName, SceIoStat *stat, int bits)
 {
     throw new NotImplementedException();
 }
Exemple #29
0
 public unsafe int IoUnk21(HleIoDrvFileArg HleIoDrvFileArg)
 {
     throw new NotImplementedException();
 }
Exemple #30
0
 public unsafe int IoDevctl(HleIoDrvFileArg HleIoDrvFileArg, string DeviceName, uint Command, byte* InputPointer, int InputLength, byte* OutputPointer, int OutputLength)
 {
     throw new NotImplementedException();
 }
Exemple #31
0
 public unsafe int IoChdir(HleIoDrvFileArg HleIoDrvFileArg, string DirectoryName)
 {
     throw new NotImplementedException();
 }
Exemple #32
0
        public unsafe int IoGetstat(HleIoDrvFileArg HleIoDrvFileArg, string FileName, SceIoStat* Stat)
        {
            //Console.WriteLine(FileName);
            _IoGetstat(Iso.Root.Locate(FileName), Stat);

            return 0;
        }
Exemple #33
0
 public unsafe int IoIoctl(HleIoDrvFileArg HleIoDrvFileArg, uint Command, Span <byte> Input, Span <byte> Output)
 {
     throw new NotImplementedException();
 }
Exemple #34
0
 public unsafe long IoLseek(HleIoDrvFileArg HleIoDrvFileArg, long Offset, SeekAnchor Whence)
 {
     var IsoFileArgument = ((IsoFileArgument)HleIoDrvFileArg.FileArgument);
     //Stream.Seek(
     return IsoFileArgument.Stream.Seek(Offset, (SeekOrigin)Whence);
 }
        public unsafe int IoDread(HleIoDrvFileArg HleIoDrvFileArg, HleIoDirent* IoDirent)
        {
            //var Enumerator = (DirectoryEnumerator<HleIoDirent>)(DisposableDummy<DirectoryEnumerator<HleIoDirent>>)HleIoDrvFileArg.FileArgument;
            var Enumerator = (DirectoryEnumerator<HleIoDirent>)HleIoDrvFileArg.FileArgument;

            // More items.
            if (Enumerator.MoveNext())
            {
                //Console.Error.WriteLine("'{0}'", Enumerator.Current.ToString());
                *IoDirent = Enumerator.Current;
                /*

                */
            }
            // No more items.
            else
            {
            }

            return Enumerator.GetLeft();
        }
Exemple #36
0
 public unsafe int IoRead(HleIoDrvFileArg HleIoDrvFileArg, byte* OutputPointer, int OutputLength)
 {
     var IsoFileArgument = ((IsoFileArgument)HleIoDrvFileArg.FileArgument);
     var OutputData = new byte[OutputLength];
     int Readed = IsoFileArgument.Stream.Read(OutputData, 0, OutputLength);
     PointerUtils.Memcpy(OutputPointer, OutputData, OutputLength);
     return Readed;
     //throw new NotImplementedException();
 }
        public unsafe int IoGetstat(HleIoDrvFileArg HleIoDrvFileArg, string FileName, SceIoStat* Stat)
        {
            var RealFileName = GetFullNormalizedAndSanitizedPath(FileName);
            //Console.WriteLine(RealFileName);

            Stat->Attributes = IOFileModes.CanExecute | IOFileModes.CanRead | IOFileModes.CanWrite;
            Stat->Mode = 0;
            Stat->Mode = SceMode.UserCanExecute | SceMode.UserCanRead | SceMode.UserCanWrite;
            Stat->Mode = SceMode.GroupCanExecute | SceMode.GroupCanRead | SceMode.GroupCanWrite;
            Stat->Mode = SceMode.OtherCanExecute | SceMode.OtherCanRead | SceMode.OtherCanWrite;

            FileSystemInfo FileSystemInfo = null;
            if (File.Exists(RealFileName))
            {
                var FileInfo = new FileInfo(RealFileName);
                FileSystemInfo = FileInfo;
                Stat->Size = FileInfo.Length;
                Stat->Mode |= SceMode.File;
                Stat->Attributes |= IOFileModes.File;
            }
            else if (Directory.Exists(RealFileName))
            {
                var DirectoryInfo = new DirectoryInfo(RealFileName);
                FileSystemInfo = DirectoryInfo;
                Stat->Mode |= SceMode.Directory;
                Stat->Attributes |= IOFileModes.Directory;
            }
            else
            {
                throw(new FileNotFoundException("Can't find file '" + RealFileName + "'"));
            }

            Stat->TimeCreation = ScePspDateTime.FromDateTime(FileSystemInfo.CreationTimeUtc);
            Stat->TimeLastAccess = ScePspDateTime.FromDateTime(FileSystemInfo.LastAccessTimeUtc);
            Stat->TimeLastModification = ScePspDateTime.FromDateTime(FileSystemInfo.LastWriteTimeUtc);

            return 0;
        }
Exemple #38
0
 public unsafe int IoRmdir(HleIoDrvFileArg HleIoDrvFileArg, string Name)
 {
     throw new NotImplementedException();
 }
 public unsafe long IoLseek(HleIoDrvFileArg HleIoDrvFileArg, long Offset, SeekAnchor Whence)
 {
     var FileStream = ((FileStream)HleIoDrvFileArg.FileArgument);
     switch (Whence)
     {
         case SeekAnchor.Set:
             FileStream.Position = Offset;
             break;
         case SeekAnchor.Cursor:
             FileStream.Position = FileStream.Position + Offset;
             break;
         case SeekAnchor.End:
             FileStream.Position = FileStream.Length + Offset;
             break;
     }
     return FileStream.Position;
 }
Exemple #40
0
 public unsafe int IoWrite(HleIoDrvFileArg HleIoDrvFileArg, byte* InputPointer, int InputLength)
 {
     throw new NotImplementedException();
 }
 public unsafe int IoMkdir(HleIoDrvFileArg HleIoDrvFileArg, string Name, SceMode Mode)
 {
     var RealFileName = GetFullNormalizedAndSanitizedPath(Name);
     Directory.CreateDirectory(RealFileName);
     //HleIoDrvFileArg.
     //throw new NotImplementedException();
     return 0;
 }
Exemple #42
0
 public unsafe int IoChstat(HleIoDrvFileArg HleIoDrvFileArg, string FileName, SceIoStat* stat, int bits)
 {
     throw new NotImplementedException();
 }
Exemple #43
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="HleIoDrvFileArg"></param>
        /// <param name="DeviceName"></param>
        /// <param name="Command"></param>
        /// <param name="Input"></param>
        /// <param name="Output"></param>
        /// <param name="DoDleay"></param>
        /// <param name="InputPointer"></param>
        /// <param name="InputLength"></param>
        /// <param name="OutputPointer"></param>
        /// <param name="OutputLength"></param>
        /// <returns></returns>
        public override int IoDevctl(HleIoDrvFileArg HleIoDrvFileArg, string DeviceName, uint Command,
                                     Span <byte> Input, Span <byte> Output, ref bool DoDleay)
        {
            //Console.Error.WriteLine("MemoryStick.IoDevctl: ({0}, 0x{1:X})", DeviceName, Command);

            switch ((CommandType)Command)
            {
            case CommandType.CheckInserted:
            {
                // 0 - Device is not assigned (callback not registered).
                // 1 - Device is assigned (callback registered).
                ReinterpretSpan <uint>(Output)[0] = 1;
                return(0);
            }

            case CommandType.MScmRegisterMSInsertEjectCallback:
            {
                var CallbackId = ReinterpretSpan <int>(Input)[0];
                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:
            {
                var SizeInfo = (SizeInfoStruct *)Memory.PspAddressToPointerSafe(ReinterpretSpan <uint>(Input)[0]);
                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:
                ReinterpretSpan <uint>(Output)[0] = 1;
                return(0);

            case CommandType.CheckMemoryStickStatus:
                // 0 <- Busy
                // 1 <- Ready
                ReinterpretSpan <uint>(Output)[0] = 4;
                break;

            default:
                Console.Error.WriteLine($"MemoryStick.IoDevctl Not Implemented! ({DeviceName}, 0x{Command:X})");
                break;
            }

            return(0);
        }