You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何像Process Lasso一样将Windows进程的I/O优先级设为High

解决调用NTSetInformationProcess设置High I/O优先级失败的问题

核心原因

直接通过ProcessIoPriority(信息类值0x10)设置I/O优先级为3(High)会被系统自动降级为2(Normal)——该信息类仅支持到Normal级别。要设置High级,必须使用扩展信息类和结构体,同时确保拥有足够的特权。

必要步骤

  1. 启用进程特权
    设置High I/O优先级需要SE_INC_BASE_PRIORITY_NAME特权。在调用NTSetInformationProcess前,必须启用当前进程的该特权:

    BOOL EnablePriorityPrivilege() {
        HANDLE hToken;
        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
            return FALSE;
        }
    
        LUID luid;
        if (!LookupPrivilegeValue(NULL, SE_INC_BASE_PRIORITY_NAME, &luid)) {
            CloseHandle(hToken);
            return FALSE;
        }
    
        TOKEN_PRIVILEGES tp = {0};
        tp.PrivilegeCount = 1;
        tp.Privileges[0].Luid = luid;
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
        BOOL result = AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
        CloseHandle(hToken);
        return result && GetLastError() == ERROR_SUCCESS;
    }
    
  2. 使用扩展信息类与结构体
    Win7+系统支持ProcessIoPriorityEx信息类(对应值0x27),搭配PROCESS_IO_PRIORITY_INFORMATION_EX结构体来设置High级别:

    // 定义未公开的枚举与结构体
    typedef enum _IO_PRIORITY_HINT {
        IoPriorityVeryLow = 0,
        IoPriorityLow = 1,
        IoPriorityNormal = 2,
        IoPriorityHigh = 3,
        IoPriorityCritical = 4
    } IO_PRIORITY_HINT;
    
    typedef struct _PROCESS_IO_PRIORITY_INFORMATION_EX {
        IO_PRIORITY_HINT IoPriority;
        ULONG Flags; // 设为0即可
    } PROCESS_IO_PRIORITY_INFORMATION_EX;
    
    // 定义NTSetInformationProcess函数指针
    typedef NTSTATUS(NTAPI* pNtSetInformationProcess)(
        HANDLE ProcessHandle,
        PROCESS_INFORMATION_CLASS ProcessInformationClass,
        PVOID ProcessInformation,
        ULONG ProcessInformationLength
    );
    
    // 设置High I/O优先级的函数
    NTSTATUS SetProcessHighIoPriority(HANDLE hProcess) {
        // 加载ntdll.dll并获取函数地址
        HMODULE hNtdll = LoadLibraryA("ntdll.dll");
        if (!hNtdll) return STATUS_DLL_NOT_FOUND;
    
        pNtSetInformationProcess NtSetInformationProcess = 
            (pNtSetInformationProcess)GetProcAddress(hNtdll, "NtSetInformationProcess");
        if (!NtSetInformationProcess) {
            FreeLibrary(hNtdll);
            return STATUS_PROCEDURE_NOT_FOUND;
        }
    
        PROCESS_IO_PRIORITY_INFORMATION_EX info = {0};
        info.IoPriority = IoPriorityHigh;
        info.Flags = 0;
    
        NTSTATUS status = NtSetInformationProcess(
            hProcess,
            (PROCESS_INFORMATION_CLASS)0x27, // ProcessIoPriorityEx
            &info,
            sizeof(info)
        );
    
        FreeLibrary(hNtdll);
        return status;
    }
    
  3. 验证权限
    打开目标进程时,确保请求的权限包含PROCESS_SET_INFORMATION(PROCESS_ALL_ACCESS已包含该权限,但需确认目标进程未受系统保护)。

注意事项

  • ProcessIoPriorityEx的信息类值(0x27)在不同Windows版本中可能略有变化,若失败可尝试动态查询或查阅系统头文件确认。
  • 部分系统进程、受保护进程无法设置High I/O优先级,即使权限足够也会返回STATUS_ACCESS_DENIED。
  • 设置后可通过NTQueryInformationProcess搭配ProcessIoPriorityEx信息类验证是否成功。

内容的提问来源于stack exchange,提问作者Steve Wolligandt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:36:29