From: Marc-Aurel Zent mzent@codeweavers.com
--- dlls/ntdll/unix/process.c | 17 +++++++++++++++++ dlls/wow64/process.c | 1 + server/process.c | 13 +++++++++++++ server/protocol.def | 6 ++++-- 4 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c index 0f6f4fe7c4c..1cfc05df6ef 100644 --- a/dlls/ntdll/unix/process.c +++ b/dlls/ntdll/unix/process.c @@ -1788,6 +1788,23 @@ NTSTATUS WINAPI NtSetInformationProcess( HANDLE handle, PROCESSINFOCLASS class, } break;
+ case ProcessPriorityBoost: + if (size != sizeof(ULONG)) return STATUS_INVALID_PARAMETER; + else + { + ULONG* disable_boost = info; + + SERVER_START_REQ( set_process_info ) + { + req->handle = wine_server_obj_handle( handle ); + req->disable_boost = *disable_boost; + req->mask = SET_PROCESS_INFO_DISABLE_BOOST; + ret = wine_server_call( req ); + } + SERVER_END_REQ; + } + break; + case ProcessExecuteFlags: if ((is_win64 && !is_wow64()) || size != sizeof(ULONG)) return STATUS_INVALID_PARAMETER; if (execute_flags & MEM_EXECUTE_OPTION_PERMANENT) return STATUS_ACCESS_DENIED; diff --git a/dlls/wow64/process.c b/dlls/wow64/process.c index 3b2cd22b712..2790ce211ff 100644 --- a/dlls/wow64/process.c +++ b/dlls/wow64/process.c @@ -892,6 +892,7 @@ NTSTATUS WINAPI wow64_NtSetInformationProcess( UINT *args ) case ProcessDefaultHardErrorMode: /* ULONG */ case ProcessPriorityClass: /* PROCESS_PRIORITY_CLASS */ case ProcessBasePriority: /* ULONG */ + case ProcessPriorityBoost: /* ULONG */ case ProcessExecuteFlags: /* ULONG */ case ProcessPagePriority: /* MEMORY_PRIORITY_INFORMATION */ case ProcessPowerThrottlingState: /* PROCESS_POWER_THROTTLING_STATE */ diff --git a/server/process.c b/server/process.c index ace5d24b2ba..d54be71f2c0 100644 --- a/server/process.c +++ b/server/process.c @@ -1689,6 +1689,18 @@ static void set_process_priority( struct process *process, int priority ) set_process_base_priority( process, base_priority ); }
+static void set_process_disable_boost( struct process *process, int disable_boost ) +{ + struct thread *thread; + + process->disable_boost = disable_boost; + + LIST_FOR_EACH_ENTRY( thread, &process->thread_list, struct thread, proc_entry ) + { + set_thread_disable_boost( thread, disable_boost ); + } +} + static void set_process_affinity( struct process *process, affinity_t affinity ) { struct thread *thread; @@ -1716,6 +1728,7 @@ DECL_HANDLER(set_process_info) { if (req->mask & SET_PROCESS_INFO_PRIORITY) set_process_priority( process, req->priority ); if (req->mask & SET_PROCESS_INFO_BASE_PRIORITY) set_process_base_priority( process, req->base_priority ); + if (req->mask & SET_PROCESS_INFO_DISABLE_BOOST) set_process_disable_boost( process, req->disable_boost ); if (req->mask & SET_PROCESS_INFO_AFFINITY) set_process_affinity( process, req->affinity ); if (req->mask & SET_PROCESS_INFO_TOKEN) { diff --git a/server/protocol.def b/server/protocol.def index 1739b7059ac..361bd9c0a78 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1205,13 +1205,15 @@ struct obj_locator int mask; /* setting mask (see below) */ int priority; /* priority class */ int base_priority; /* process base priority */ + int disable_boost; /* disable process priority boost */ affinity_t affinity; /* affinity mask */ obj_handle_t token; /* primary token */ @END #define SET_PROCESS_INFO_PRIORITY 0x01 #define SET_PROCESS_INFO_BASE_PRIORITY 0x02 -#define SET_PROCESS_INFO_AFFINITY 0x04 -#define SET_PROCESS_INFO_TOKEN 0x08 +#define SET_PROCESS_INFO_DISABLE_BOOST 0x04 +#define SET_PROCESS_INFO_AFFINITY 0x08 +#define SET_PROCESS_INFO_TOKEN 0x10
/* Retrieve information about a thread */