IStorage.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using LibHac;
  2. using LibHac.Common;
  3. using LibHac.Sf;
  4. using Ryujinx.HLE.HOS.Ipc;
  5. namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
  6. {
  7. class IStorage : DisposableIpcService
  8. {
  9. private SharedRef<LibHac.FsSrv.Sf.IStorage> _baseStorage;
  10. public IStorage(ref SharedRef<LibHac.FsSrv.Sf.IStorage> baseStorage)
  11. {
  12. _baseStorage = SharedRef<LibHac.FsSrv.Sf.IStorage>.CreateMove(ref baseStorage);
  13. }
  14. [CommandHipc(0)]
  15. // Read(u64 offset, u64 length) -> buffer<u8, 0x46, 0> buffer
  16. public ResultCode Read(ServiceCtx context)
  17. {
  18. ulong offset = context.RequestData.ReadUInt64();
  19. ulong size = context.RequestData.ReadUInt64();
  20. if (context.Request.ReceiveBuff.Count > 0)
  21. {
  22. IpcBuffDesc buffDesc = context.Request.ReceiveBuff[0];
  23. // Use smaller length to avoid overflows.
  24. if (size > buffDesc.Size)
  25. {
  26. size = buffDesc.Size;
  27. }
  28. byte[] data = new byte[size];
  29. Result result = _baseStorage.Get.Read((long)offset, new OutBuffer(data), (long)size);
  30. context.Memory.Write(buffDesc.Position, data);
  31. return (ResultCode)result.Value;
  32. }
  33. return ResultCode.Success;
  34. }
  35. [CommandHipc(4)]
  36. // GetSize() -> u64 size
  37. public ResultCode GetSize(ServiceCtx context)
  38. {
  39. Result result = _baseStorage.Get.GetSize(out long size);
  40. context.ResponseData.Write(size);
  41. return (ResultCode)result.Value;
  42. }
  43. protected override void Dispose(bool isDisposing)
  44. {
  45. if (isDisposing)
  46. {
  47. _baseStorage.Destroy();
  48. }
  49. }
  50. }
  51. }