如何像Process Lasso一样将Windows进程的I/O优先级设为High
解决调用NTSetInformationProcess设置High I/O优先级失败的问题
核心原因
直接通过ProcessIoPriority(信息类值0x10)设置I/O优先级为3(High)会被系统自动降级为2(Normal)——该信息类仅支持到Normal级别。要设置High级,必须使用扩展信息类和结构体,同时确保拥有足够的特权。
必要步骤
启用进程特权
设置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; }使用扩展信息类与结构体
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; }验证权限
打开目标进程时,确保请求的权限包含PROCESS_SET_INFORMATION(PROCESS_ALL_ACCESS已包含该权限,但需确认目标进程未受系统保护)。
注意事项
ProcessIoPriorityEx的信息类值(0x27)在不同Windows版本中可能略有变化,若失败可尝试动态查询或查阅系统头文件确认。- 部分系统进程、受保护进程无法设置High I/O优先级,即使权限足够也会返回
STATUS_ACCESS_DENIED。 - 设置后可通过
NTQueryInformationProcess搭配ProcessIoPriorityEx信息类验证是否成功。
内容的提问来源于stack exchange,提问作者Steve Wolligandt
相关产品推荐
相关产品推荐

