예제 #1
0
        // 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);
        }
예제 #2
0
파일: IStorage.cs 프로젝트: amaron2/Ryujinx
        // 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);
        }
예제 #3
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);
        }
예제 #4
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);
        }
예제 #5
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>());
            }
        }
예제 #6
0
        // 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);
        }
예제 #7
0
        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));
        }
예제 #8
0
        // 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);
        }
예제 #9
0
        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);
        }
예제 #10
0
 private Span <T> CreateSpanFromBuffer <T>(ServiceCtx context, IpcBuffDesc ipcBuff, bool isOutput) where T : unmanaged
 {
     return(MemoryMarshal.Cast <byte, T>(CreateByteSpanFromBuffer(context, ipcBuff, isOutput)));
 }