public unsafe int IoClose(HleIoDrvFileArg HleIoDrvFileArg) { var Stream = ((Stream)HleIoDrvFileArg.FileArgument); Stream.Close(); return 0; //throw new NotImplementedException(); }
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; }
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")); } }
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; } }
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(); }
public unsafe int IoMkdir(HleIoDrvFileArg HleIoDrvFileArg, string Name, SceMode Mode) { throw new NotImplementedException(); }
public unsafe int IoRename(HleIoDrvFileArg HleIoDrvFileArg, string OldFileName, string NewFileName) { throw new NotImplementedException(); }
public unsafe int IoDclose(HleIoDrvFileArg HleIoDrvFileArg) { //throw new NotImplementedException(); return 0; }
public unsafe int IoRead(HleIoDrvFileArg HleIoDrvFileArg, byte *OutputPointer, int OutputLength) { var FileArgument = (Stream)HleIoDrvFileArg.FileArgument; return(FileArgument.ReadToPointer(OutputPointer, OutputLength)); }
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(); }
public unsafe long IoLseek(HleIoDrvFileArg HleIoDrvFileArg, long Offset, SeekAnchor Whence) { var FileArgument = (Stream)HleIoDrvFileArg.FileArgument; return(FileArgument.Seek(Offset, (SeekOrigin)Whence)); }
public unsafe int IoWrite(HleIoDrvFileArg HleIoDrvFileArg, byte *InputPointer, int InputLength) { throw new NotImplementedException(); }
public unsafe int IoDread(HleIoDrvFileArg HleIoDrvFileArg, HleIoDirent *dir) { throw new NotImplementedException(); }
public unsafe int IoDclose(HleIoDrvFileArg HleIoDrvFileArg) { throw new NotImplementedException(); }
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; } }
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)); } }
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; }
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; }
public unsafe int IoChdir(HleIoDrvFileArg HleIoDrvFileArg, string DirectoryName) { throw new NotImplementedException(); }
public unsafe int IoRename(HleIoDrvFileArg HleIoDrvFileArg, string OldFileName, string NewFileName) { throw new NotImplementedException(); }
public unsafe int IoChstat(HleIoDrvFileArg HleIoDrvFileArg, string FileName, SceIoStat *stat, int bits) { throw new NotImplementedException(); }
public unsafe int IoUnk21(HleIoDrvFileArg HleIoDrvFileArg) { throw new NotImplementedException(); }
public unsafe int IoDevctl(HleIoDrvFileArg HleIoDrvFileArg, string DeviceName, uint Command, byte* InputPointer, int InputLength, byte* OutputPointer, int OutputLength) { throw new NotImplementedException(); }
public unsafe int IoChdir(HleIoDrvFileArg HleIoDrvFileArg, string DirectoryName) { throw new NotImplementedException(); }
public unsafe int IoGetstat(HleIoDrvFileArg HleIoDrvFileArg, string FileName, SceIoStat* Stat) { //Console.WriteLine(FileName); _IoGetstat(Iso.Root.Locate(FileName), Stat); return 0; }
public unsafe int IoIoctl(HleIoDrvFileArg HleIoDrvFileArg, uint Command, Span <byte> Input, Span <byte> Output) { throw new NotImplementedException(); }
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(); }
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; }
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; }
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; }
public unsafe int IoChstat(HleIoDrvFileArg HleIoDrvFileArg, string FileName, SceIoStat* stat, int bits) { throw new NotImplementedException(); }
/// <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); }