AmIStorageAccessor.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using ChocolArm64.Memory;
  2. using System;
  3. namespace Ryujinx.OsHle.Objects
  4. {
  5. class AmIStorageAccessor
  6. {
  7. public AmIStorage Storage { get; private set; }
  8. public AmIStorageAccessor(AmIStorage Storage)
  9. {
  10. this.Storage = Storage;
  11. }
  12. public static long GetSize(ServiceCtx Context)
  13. {
  14. AmIStorageAccessor Accessor = Context.GetObject<AmIStorageAccessor>();
  15. Context.ResponseData.Write((long)Accessor.Storage.Data.Length);
  16. return 0;
  17. }
  18. public static long Read(ServiceCtx Context)
  19. {
  20. AmIStorageAccessor Accessor = Context.GetObject<AmIStorageAccessor>();
  21. AmIStorage Storage = Accessor.Storage;
  22. long ReadPosition = Context.RequestData.ReadInt64();
  23. if (Context.Request.RecvListBuff.Count > 0)
  24. {
  25. long Position = Context.Request.RecvListBuff[0].Position;
  26. short Size = Context.Request.RecvListBuff[0].Size;
  27. byte[] Data;
  28. if (Storage.Data.Length > Size)
  29. {
  30. Data = new byte[Size];
  31. Buffer.BlockCopy(Storage.Data, 0, Data, 0, Size);
  32. }
  33. else
  34. {
  35. Data = Storage.Data;
  36. }
  37. AMemoryHelper.WriteBytes(Context.Memory, Position, Data);
  38. }
  39. return 0;
  40. }
  41. }
  42. }