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. }