using ChocolArm64.Memory; using Ryujinx.Core.OsHle.Ipc; using System.Collections.Generic; using System.IO; namespace Ryujinx.Core.OsHle.Objects.FspSrv { class IStorage : IIpcInterface { private Dictionary m_Commands; public IReadOnlyDictionary Commands => m_Commands; private Stream BaseStream; public IStorage(Stream BaseStream) { m_Commands = new Dictionary() { { 0, Read } }; this.BaseStream = BaseStream; } public long Read(ServiceCtx Context) { long Offset = Context.RequestData.ReadInt64(); long Size = Context.RequestData.ReadInt64(); if (Context.Request.ReceiveBuff.Count > 0) { IpcBuffDesc BuffDesc = Context.Request.ReceiveBuff[0]; //Use smaller length to avoid overflows. if (Size > BuffDesc.Size) { Size = BuffDesc.Size; } byte[] Data = new byte[Size]; BaseStream.Seek(Offset, SeekOrigin.Begin); BaseStream.Read(Data, 0, Data.Length); AMemoryHelper.WriteBytes(Context.Memory, BuffDesc.Position, Data); } return 0; } } }