3

我试图通过使用ProcessQuotaLimits信息类调用NtSetInformationProcess来限制进程 CPU 使用率。NtQueryInformationProcessProcessQuotaLimits类一起使用时,我得到了页面限制/工作集等的正确数字,但 CpuRateQuota 未填充

我正在使用的代码

public struct _QUOTA_LIMITS_EX
{
    public uint PagedPoolLimit;
    public uint NonPagedPoolLimit;
    public uint MinimumWorkingSetSize;
    public uint MaximumWorkingSetSize;
    public uint PagefileLimit;
    public ulong TimeLimit;
    public uint WorkingSetLimit;
    public uint Reserved2;
    public uint Reserved3;
    public uint Reserved4;
    public uint Flags;
    public _RATE_QUOTA_LIMIT CpuRate;
}

public struct _RATE_QUOTA_LIMIT
{
    public uint RateData;
    public uint RatePercent;
    public uint Reserved0;
}

[DllImport("ntdll.dll", SetLastError = true)]
private static extern int NtSetInformationProcess(IntPtr hProcess, int processInformationClass, ref _QUOTA_LIMITS_EX processInformation, int processInformationLength);

[DllImport("ntdll.dll", SetLastError = true)]
private static extern int NtQueryInformationProcess( IntPtr processHandle, int processInformationClass, ref _QUOTA_LIMITS_EX processInformation, uint processInformationLength, ref int returnLength);

public void Limit()
{
    Process.EnterDebugMode();                      

    _QUOTA_LIMITS_EX quotaLimits = new _QUOTA_LIMITS_EX();
    int size = 56;

    int returnLength = 0;
    int status = NtQueryInformationProcess(this._process.Handle, 1 /*ProcessQuotaLimits*/, ref quotaLimits, (uint)size, ref returnLength);
}

调用返回 NT_STATUS 0,表示成功。我正在 Windows server 2016 Standard 上尝试这个,它应该等同于 Windows 10。在这种情况下,使用 JobInformation 和暂停/恢复进程不是可行的选择。

4

0 回答 0