public unsafe void GetSetProcessInformationMemoryPriorityTest() { using var hProcess = Kernel32.GetCurrentProcess(); // Save current memory-priority info MEMORY_PRIORITY_INFORMATION savedInfo; Assert.True(Kernel32.GetProcessInformation( hProcess, PROCESS_INFORMATION_CLASS.ProcessMemoryPriority, &savedInfo, (uint)sizeof(MEMORY_PRIORITY_INFORMATION))); // Set low memory priority on the process var memoryPriority = new MEMORY_PRIORITY_INFORMATION { MemoryPriority = MemoryPriority.MEMORY_PRIORITY_LOW, }; Assert.True(Kernel32.SetProcessInformation( hProcess, PROCESS_INFORMATION_CLASS.ProcessMemoryPriority, &memoryPriority, (uint)sizeof(MEMORY_PRIORITY_INFORMATION))); // Now read it back and verify that we get back MEMORY_PRIORITY_LOW memoryPriority.MemoryPriority = MemoryPriority.MEMORY_PRIORITY_NORMAL; Assert.True(Kernel32.GetProcessInformation( hProcess, PROCESS_INFORMATION_CLASS.ProcessMemoryPriority, &memoryPriority, (uint)sizeof(MEMORY_PRIORITY_INFORMATION))); Assert.Equal( MemoryPriority.MEMORY_PRIORITY_LOW, memoryPriority.MemoryPriority); // Restore the saved memory-priority info if (savedInfo.MemoryPriority != MemoryPriority.MEMORY_PRIORITY_LOW) { Assert.True(Kernel32.SetProcessInformation( hProcess, PROCESS_INFORMATION_CLASS.ProcessMemoryPriority, &savedInfo, (uint)sizeof(MEMORY_PRIORITY_INFORMATION))); // Verify that the memory-priority was restore successfully memoryPriority.MemoryPriority = MemoryPriority.MEMORY_PRIORITY_LOW; Assert.True(Kernel32.GetProcessInformation( hProcess, PROCESS_INFORMATION_CLASS.ProcessMemoryPriority, &memoryPriority, (uint)sizeof(MEMORY_PRIORITY_INFORMATION))); Assert.Equal(savedInfo.MemoryPriority, memoryPriority.MemoryPriority); } }
/// <summary> /// http://msdn.microsoft.com/en-us/library/windows/desktop/hh448387(v=vs.85).aspx /// </summary> public static void SetMemoryPriority(ProcessMemoryPriority priority) { var priorityInfo = new MEMORY_PRIORITY_INFORMATION { MemoryPriority = (uint)priority }; var priorityInfoLength = Marshal.SizeOf(priorityInfo); var priorityInfoPointer = Marshal.AllocHGlobal(priorityInfoLength); Marshal.StructureToPtr(priorityInfo, priorityInfoPointer, false); NtSetInformationProcess(Process.GetCurrentProcess().Handle, PROCESS_INFORMATION_CLASS.ProcessMemoryPriority, priorityInfoPointer, (uint)priorityInfoLength); }