FspSrvIStorage.cs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using ChocolArm64.Memory;
  2. using Ryujinx.OsHle.Ipc;
  3. using System.IO;
  4. namespace Ryujinx.OsHle.Objects
  5. {
  6. class FspSrvIStorage
  7. {
  8. public Stream BaseStream { get; private set; }
  9. public FspSrvIStorage(Stream BaseStream)
  10. {
  11. this.BaseStream = BaseStream;
  12. }
  13. public static long Read(ServiceCtx Context)
  14. {
  15. FspSrvIStorage Storage = Context.GetObject<FspSrvIStorage>();
  16. long Offset = Context.RequestData.ReadInt64();
  17. long Size = Context.RequestData.ReadInt64();
  18. if (Context.Request.ReceiveBuff.Count > 0)
  19. {
  20. IpcBuffDesc BuffDesc = Context.Request.ReceiveBuff[0];
  21. //Use smaller length to avoid overflows.
  22. if (Size > BuffDesc.Size)
  23. {
  24. Size = BuffDesc.Size;
  25. }
  26. byte[] Data = new byte[Size];
  27. Storage.BaseStream.Seek(Offset, SeekOrigin.Begin);
  28. Storage.BaseStream.Read(Data, 0, Data.Length);
  29. AMemoryHelper.WriteBytes(Context.Memory, BuffDesc.Position, Data);
  30. }
  31. return 0;
  32. }
  33. }
  34. }