// Read(u64 offset, u64 length) -> buffer<u8, 0x46, 0> buffer public ResultCode Read(ServiceCtx context) { ulong offset = context.RequestData.ReadUInt64(); ulong size = context.RequestData.ReadUInt64(); 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]; Result result = _baseStorage.Read((long)offset, data); context.Memory.Write(buffDesc.Position, data); return((ResultCode)result.Value); } return(ResultCode.Success); }
// Read(u64 offset, u64 length) -> buffer<u8, 0x46, 0> buffer 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]; try { _baseStorage.Read(data, offset); } catch (HorizonResultException ex) { return(ex.ResultValue.Value); } context.Memory.WriteBytes(buffDesc.Position, data); } return(0); }
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); }
// Read(u64 offset, u64 length) -> buffer<u8, 0x46, 0> buffer 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]; lock (_baseStream) { _baseStream.Seek(offset, SeekOrigin.Begin); _baseStream.Read(data, 0, data.Length); } context.Memory.WriteBytes(buffDesc.Position, data); } return(0); }
private ClockSnapshot ReadClockSnapshotFromBuffer(ServiceCtx context, IpcBuffDesc ipcDesc) { Debug.Assert(ipcDesc.Size == Marshal.SizeOf <ClockSnapshot>()); using (BinaryReader bufferReader = new BinaryReader(new MemoryStream(context.Memory.ReadBytes(ipcDesc.Position, ipcDesc.Size)))) { return(bufferReader.ReadStruct <ClockSnapshot>()); } }
// Export() -> buffer<bytes, 6> public ResultCode Export(ServiceCtx context) { IpcBuffDesc outputBuffer = context.Request.ReceiveBuff[0]; Span <byte> data = CreateByteSpanFromBuffer(context, outputBuffer, true); ResultCode result = Export(data); context.Memory.Write((ulong)outputBuffer.Position, data.ToArray()); return(result); }
private Span <byte> CreateByteSpanFromBuffer(ServiceCtx context, IpcBuffDesc ipcBuff, bool isOutput) { byte[] rawData; if (isOutput) { rawData = new byte[ipcBuff.Size]; } else { rawData = context.Memory.ReadBytes(ipcBuff.Position, ipcBuff.Size); } return(new Span <byte>(rawData)); }
// Get1(SourceFlag flag) -> (s32 count, buffer<nn::mii::CharInfo, 6>) public ResultCode Get1(ServiceCtx context) { SourceFlag flag = (SourceFlag)context.RequestData.ReadInt32(); IpcBuffDesc outputBuffer = context.Request.ReceiveBuff[0]; Span <CharInfo> elementsSpan = CreateSpanFromBuffer <CharInfo>(context, outputBuffer, true); ResultCode result = Get1(flag, out int count, elementsSpan); elementsSpan = elementsSpan.Slice(0, count); context.ResponseData.Write(count); WriteSpanToBuffer(context, outputBuffer, elementsSpan); return(result); }
private void WriteSpanToBuffer <T>(ServiceCtx context, IpcBuffDesc ipcBuff, Span <T> span) where T : unmanaged { Span <byte> rawData = MemoryMarshal.Cast <T, byte>(span); context.Memory.Write((ulong)ipcBuff.Position, rawData); }
private Span <T> CreateSpanFromBuffer <T>(ServiceCtx context, IpcBuffDesc ipcBuff, bool isOutput) where T : unmanaged { return(MemoryMarshal.Cast <byte, T>(CreateByteSpanFromBuffer(context, ipcBuff, isOutput))); }