From: Marc-Aurel Zent mzent@codeweavers.com
--- dlls/ntdll/unix/process.c | 18 +++++++++++++++++- dlls/wow64/process.c | 1 + server/process.c | 2 ++ server/process.h | 1 + server/protocol.def | 3 ++- server/thread.c | 1 + 6 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c index fdb81845a7e..856f5e5b100 100644 --- a/dlls/ntdll/unix/process.c +++ b/dlls/ntdll/unix/process.c @@ -1094,7 +1094,6 @@ NTSTATUS WINAPI NtQueryInformationProcess( HANDLE handle, PROCESSINFOCLASS class UNIMPLEMENTED_INFO_CLASS(ProcessUserModeIOPL); UNIMPLEMENTED_INFO_CLASS(ProcessEnableAlignmentFaultFixup); UNIMPLEMENTED_INFO_CLASS(ProcessWx86Information); - UNIMPLEMENTED_INFO_CLASS(ProcessPriorityBoost); UNIMPLEMENTED_INFO_CLASS(ProcessDeviceMap); UNIMPLEMENTED_INFO_CLASS(ProcessForegroundInformation); UNIMPLEMENTED_INFO_CLASS(ProcessLUIDDeviceMapsEnabled); @@ -1291,6 +1290,23 @@ NTSTATUS WINAPI NtQueryInformationProcess( HANDLE handle, PROCESSINFOCLASS class } break;
+ case ProcessPriorityBoost: + len = sizeof(ULONG); + if (size != len) return STATUS_INFO_LENGTH_MISMATCH; + if (!info) ret = STATUS_ACCESS_VIOLATION; + else + { + ULONG *disable_boost = info; + SERVER_START_REQ(get_process_info) + { + req->handle = wine_server_obj_handle( handle ); + ret = wine_server_call( req ); + *disable_boost = reply->disable_boost; + } + SERVER_END_REQ; + } + break; + case ProcessDebugFlags: len = sizeof(DWORD); if (size == len) diff --git a/dlls/wow64/process.c b/dlls/wow64/process.c index f82f3f2187e..b2dad1a2685 100644 --- a/dlls/wow64/process.c +++ b/dlls/wow64/process.c @@ -577,6 +577,7 @@ NTSTATUS WINAPI wow64_NtQueryInformationProcess( UINT *args ) case ProcessTimes: /* KERNEL_USER_TIMES */ case ProcessDefaultHardErrorMode: /* ULONG */ case ProcessPriorityClass: /* PROCESS_PRIORITY_CLASS */ + case ProcessPriorityBoost: /* ULONG */ case ProcessHandleCount: /* ULONG */ case ProcessSessionInformation: /* ULONG */ case ProcessDebugFlags: /* ULONG */ diff --git a/server/process.c b/server/process.c index 37a75dc1c45..6851d437822 100644 --- a/server/process.c +++ b/server/process.c @@ -677,6 +677,7 @@ struct process *create_process( int fd, struct process *parent, unsigned int fla process->running_threads = 0; process->priority = PROCESS_PRIOCLASS_NORMAL; process->base_priority = 8; + process->disable_boost = 0; process->suspend = 0; process->is_system = 0; process->debug_children = 1; @@ -1539,6 +1540,7 @@ DECL_HANDLER(get_process_info) reply->exit_code = process->exit_code; reply->priority = process->priority; reply->base_priority = process->base_priority; + reply->disable_boost = process->disable_boost; reply->affinity = process->affinity; reply->peb = process->peb; reply->start_time = process->start_time; diff --git a/server/process.h b/server/process.h index 2564a4f96d1..251af45be79 100644 --- a/server/process.h +++ b/server/process.h @@ -58,6 +58,7 @@ struct process affinity_t affinity; /* process affinity mask */ int priority; /* priority class */ int base_priority; /* base priority to calculate thread priority */ + int disable_boost; /* disable priority boost */ int suspend; /* global process suspend count */ unsigned int is_system:1; /* is it a system process? */ unsigned int debug_children:1;/* also debug all child processes */ diff --git a/server/protocol.def b/server/protocol.def index ecc20a8e2d0..b266323fda8 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1171,8 +1171,9 @@ struct obj_locator timeout_t end_time; /* process end time */ unsigned int session_id; /* process session id */ int exit_code; /* process exit code */ - int priority; /* priority class */ + unsigned short priority; /* priority class */ unsigned short base_priority; /* process base priority */ + unsigned short disable_boost; /* disable process priority boost */ unsigned short machine; /* process architecture */ VARARG(image,pe_image_info); /* image info for main exe */ @END diff --git a/server/thread.c b/server/thread.c index 3003c4bc930..5dccc3c11b3 100644 --- a/server/thread.c +++ b/server/thread.c @@ -538,6 +538,7 @@ struct thread *create_thread( int fd, struct process *process, const struct secu thread->process = (struct process *)grab_object( process ); thread->desktop = 0; thread->affinity = process->affinity; + thread->disable_boost = process->disable_boost; if (!current) current = thread;
list_add_tail( &thread_list, &thread->entry );
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 856f5e5b100..c6bba1e17a0 100644 --- a/dlls/ntdll/unix/process.c +++ b/dlls/ntdll/unix/process.c @@ -1748,6 +1748,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 b2dad1a2685..e558db0ccb1 100644 --- a/dlls/wow64/process.c +++ b/dlls/wow64/process.c @@ -910,6 +910,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 6851d437822..e40efeb2bb0 100644 --- a/server/process.c +++ b/server/process.c @@ -1713,6 +1713,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; @@ -1740,6 +1752,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 b266323fda8..f234901117f 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1218,14 +1218,16 @@ struct obj_locator obj_handle_t handle; /* process handle */ 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 */ int mask; /* setting mask (see below) */ @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 */
From: Marc-Aurel Zent mzent@codeweavers.com
--- dlls/kernelbase/process.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c index b75963fef1d..aba35190efd 100644 --- a/dlls/kernelbase/process.c +++ b/dlls/kernelbase/process.c @@ -900,9 +900,7 @@ BOOL WINAPI /* DECLSPEC_HOTPATCH */ GetProcessMitigationPolicy( HANDLE process, */ BOOL WINAPI DECLSPEC_HOTPATCH GetProcessPriorityBoost( HANDLE process, PBOOL disable ) { - FIXME( "(%p,%p): semi-stub\n", process, disable ); - *disable = FALSE; /* report that no boost is present */ - return TRUE; + return set_ntstatus( NtQueryInformationProcess( process, ProcessPriorityBoost, disable, sizeof(*disable), NULL )); }
From: Marc-Aurel Zent mzent@codeweavers.com
--- dlls/kernelbase/process.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c index aba35190efd..0b803792790 100644 --- a/dlls/kernelbase/process.c +++ b/dlls/kernelbase/process.c @@ -1244,8 +1244,7 @@ BOOL WINAPI /* DECLSPEC_HOTPATCH */ SetProcessMitigationPolicy( PROCESS_MITIGATI */ BOOL WINAPI /* DECLSPEC_HOTPATCH */ SetProcessPriorityBoost( HANDLE process, BOOL disable ) { - FIXME( "(%p,%d): stub\n", process, disable ); - return TRUE; + return set_ntstatus( NtSetInformationProcess( process, ProcessPriorityBoost, &disable, sizeof(disable) )); }
From: Marc-Aurel Zent mzent@codeweavers.com
--- dlls/kernel32/tests/thread.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)
diff --git a/dlls/kernel32/tests/thread.c b/dlls/kernel32/tests/thread.c index 090c098bcec..ef0ae768105 100644 --- a/dlls/kernel32/tests/thread.c +++ b/dlls/kernel32/tests/thread.c @@ -77,9 +77,11 @@
static void (WINAPI *pGetCurrentThreadStackLimits)(PULONG_PTR,PULONG_PTR); static BOOL (WINAPI *pGetThreadPriorityBoost)(HANDLE,PBOOL); +static BOOL (WINAPI *pGetProcessPriorityBoost)(HANDLE,PBOOL); static HANDLE (WINAPI *pOpenThread)(DWORD,BOOL,DWORD); static BOOL (WINAPI *pQueueUserWorkItem)(LPTHREAD_START_ROUTINE,PVOID,ULONG); static BOOL (WINAPI *pSetThreadPriorityBoost)(HANDLE,BOOL); +static BOOL (WINAPI *pSetProcessPriorityBoost)(HANDLE,BOOL); static BOOL (WINAPI *pSetThreadStackGuarantee)(ULONG*); static BOOL (WINAPI *pRegisterWaitForSingleObject)(PHANDLE,HANDLE,WAITORTIMERCALLBACK,PVOID,ULONG,ULONG); static BOOL (WINAPI *pUnregisterWait)(HANDLE); @@ -786,6 +788,27 @@ static VOID test_thread_priority(void) rc = pGetThreadPriorityBoost(curthread, &disabled); ok(rc != 0 && disabled == 0, "rc=%d error=%ld disabled=%d\n", rc, GetLastError(), disabled); + + rc = pSetProcessPriorityBoost(GetCurrentProcess(), 1); + ok(rc != 0, "error=%ld\n", GetLastError()); + rc = pGetThreadPriorityBoost(curthread, &disabled); + ok(rc != 0 && disabled == 1, + "rc=%d error=%ld disabled=%d\n", rc, GetLastError(), disabled); + rc = pGetProcessPriorityBoost(GetCurrentProcess(), &disabled); + ok(rc != 0 && disabled == 1, + "rc=%d error=%ld disabled=%d\n", rc, GetLastError(), disabled); + + rc = pSetThreadPriorityBoost(curthread, 0); + ok(rc != 0, "error=%ld\n", GetLastError()); + rc = pGetThreadPriorityBoost(curthread, &disabled); + ok(rc != 0 && disabled == 0, + "rc=%d error=%ld disabled=%d\n", rc, GetLastError(), disabled); + rc = pGetProcessPriorityBoost(GetCurrentProcess(), &disabled); + ok(rc != 0 && disabled == 1, + "rc=%d error=%ld disabled=%d\n", rc, GetLastError(), disabled); + + rc = pSetProcessPriorityBoost(GetCurrentProcess(), 0); + ok(rc != 0, "error=%ld\n", GetLastError()); }
/* check the GetThreadTimes function */ @@ -2581,9 +2604,11 @@ static void init_funcs(void) #define X(f) p##f = (void*)GetProcAddress(hKernel32, #f) X(GetCurrentThreadStackLimits); X(GetThreadPriorityBoost); + X(GetProcessPriorityBoost); X(OpenThread); X(QueueUserWorkItem); X(SetThreadPriorityBoost); + X(SetProcessPriorityBoost); X(SetThreadStackGuarantee); X(RegisterWaitForSingleObject); X(UnregisterWait);