Example #1
0
    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);
        }