コード例 #1
0
ファイル: StateUpdater.cs プロジェクト: yunnypuff/Ryujinx
        public ResultCode UpdateMemoryPools(Span <MemoryPoolState> memoryPools)
        {
            PoolMapper mapper = new PoolMapper(_processHandle, _behaviourContext.IsMemoryPoolForceMappingEnabled());

            if (memoryPools.Length * Unsafe.SizeOf <MemoryPoolInParameter>() != _inputHeader.MemoryPoolsSize)
            {
                return(ResultCode.InvalidUpdateInfo);
            }

            foreach (ref MemoryPoolState memoryPool in memoryPools)
            {
                MemoryPoolInParameter parameter = SpanIOHelper.Read <MemoryPoolInParameter>(ref _input);

                ref MemoryPoolOutStatus outStatus = ref SpanIOHelper.GetWriteRef <MemoryPoolOutStatus>(ref _output)[0];

                PoolMapper.UpdateResult updateResult = mapper.Update(ref memoryPool, ref parameter, ref outStatus);

                if (updateResult != PoolMapper.UpdateResult.Success &&
                    updateResult != PoolMapper.UpdateResult.MapError &&
                    updateResult != PoolMapper.UpdateResult.UnmapError)
                {
                    if (updateResult != PoolMapper.UpdateResult.InvalidParameter)
                    {
                        throw new InvalidOperationException($"{updateResult}");
                    }

                    return(ResultCode.InvalidUpdateInfo);
                }
            }
コード例 #2
0
ファイル: StateUpdater.cs プロジェクト: yunnypuff/Ryujinx
        public StateUpdater(ReadOnlyMemory <byte> input, Memory <byte> output, uint processHandle, BehaviourContext behaviourContext)
        {
            _input            = input;
            _inputOrigin      = _input;
            _output           = output;
            _outputOrigin     = _output;
            _processHandle    = processHandle;
            _behaviourContext = behaviourContext;

            _inputHeader = SpanIOHelper.Read <UpdateDataHeader>(ref _input);

            _outputHeader = SpanMemoryManager <UpdateDataHeader> .Cast(_output.Slice(0, Unsafe.SizeOf <UpdateDataHeader>()));

            OutputHeader.Initialize(_behaviourContext.UserRevision);
            _output = _output.Slice(Unsafe.SizeOf <UpdateDataHeader>());
        }
コード例 #3
0
ファイル: StateUpdater.cs プロジェクト: yunnypuff/Ryujinx
        public ResultCode UpdateBehaviourContext()
        {
            BehaviourParameter parameter = SpanIOHelper.Read <BehaviourParameter>(ref _input);

            if (!BehaviourContext.CheckValidRevision(parameter.UserRevision) || parameter.UserRevision != _behaviourContext.UserRevision)
            {
                return(ResultCode.InvalidUpdateInfo);
            }

            _behaviourContext.ClearError();
            _behaviourContext.UpdateFlags(parameter.Flags);

            if (_inputHeader.BehaviourSize != Unsafe.SizeOf <BehaviourParameter>())
            {
                return(ResultCode.InvalidUpdateInfo);
            }

            return(ResultCode.Success);
        }