Пример #1
0
        private void SvcUnmapSharedMemory(AThreadState ThreadState)
        {
            int  Handle = (int)ThreadState.X0;
            long Src    = (long)ThreadState.X1;
            long Size   = (long)ThreadState.X2;

            if (!IsValidPosition(Src))
            {
                Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid address {Src:x16}!");

                ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMemRange);

                return;
            }

            HSharedMem SharedMem = Process.HandleTable.GetData <HSharedMem>(Handle);

            if (SharedMem != null)
            {
                Memory.Manager.Unmap(Src, Size, (int)MemoryType.SharedMemory);

                SharedMem.RemoveVirtualPosition(Memory, Src, Size);

                lock (MappedSharedMems)
                {
                    MappedSharedMems.Remove((SharedMem, Src, Size));
                }

                ThreadState.X0 = 0;
            }

            //TODO: Error codes.
        }