- rewrite kernel32:{Set|Get}PriorityClass on top of ntdll equivalent
- priority for process in wineserver is now the NTDLL form (no longer
the kernel32 one)
diff --git a/dlls/kernel/process.c b/dlls/kernel/process.c
index 5ec428d..c622f24 100644
--- a/dlls/kernel/process.c
+++ b/dlls/kernel/process.c
@@ -2607,16 +2607,38 @@
*/
BOOL WINAPI SetPriorityClass( HANDLE hprocess, DWORD priorityclass )
{
- BOOL ret;
- SERVER_START_REQ( set_process_info )
+ NTSTATUS status;
+ PROCESS_PRIORITY_CLASS ppc;
+
+ ppc.Foreground = FALSE;
+ switch (priorityclass)
{
- req->handle = hprocess;
- req->priority = priorityclass;
- req->mask = SET_PROCESS_INFO_PRIORITY;
- ret = !wine_server_call_err( req );
+ case IDLE_PRIORITY_CLASS:
+ ppc.PriorityClass = PROCESS_PRIOCLASS_IDLE; break;
+ case BELOW_NORMAL_PRIORITY_CLASS:
+ ppc.PriorityClass = PROCESS_PRIOCLASS_BELOW_NORMAL; break;
+ case NORMAL_PRIORITY_CLASS:
+ ppc.PriorityClass = PROCESS_PRIOCLASS_NORMAL; break;
+ case ABOVE_NORMAL_PRIORITY_CLASS:
+ ppc.PriorityClass = PROCESS_PRIOCLASS_ABOVE_NORMAL; break;
+ case HIGH_PRIORITY_CLASS:
+ ppc.PriorityClass = PROCESS_PRIOCLASS_HIGH; break;
+ case REALTIME_PRIORITY_CLASS:
+ ppc.PriorityClass = PROCESS_PRIOCLASS_REALTIME; break;
+ default:
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
}
- SERVER_END_REQ;
- return ret;
+
+ status = NtSetInformationProcess(hprocess, ProcessPriorityClass,
+ &ppc, sizeof(ppc));
+
+ if (status != STATUS_SUCCESS)
+ {
+ SetLastError( RtlNtStatusToDosError(status) );
+ return FALSE;
+ }
+ return TRUE;
}
@@ -2630,8 +2652,21 @@
status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi,
sizeof(pbi), NULL);
- if (status == STATUS_SUCCESS) return pbi.BasePriority;
- SetLastError( RtlNtStatusToDosError(status) );
+ if (status != STATUS_SUCCESS)
+ {
+ SetLastError( RtlNtStatusToDosError(status) );
+ return 0;
+ }
+ switch (pbi.BasePriority)
+ {
+ case PROCESS_PRIOCLASS_IDLE: return IDLE_PRIORITY_CLASS;
+ case PROCESS_PRIOCLASS_BELOW_NORMAL: return BELOW_NORMAL_PRIORITY_CLASS;
+ case PROCESS_PRIOCLASS_NORMAL: return NORMAL_PRIORITY_CLASS;
+ case PROCESS_PRIOCLASS_ABOVE_NORMAL: return ABOVE_NORMAL_PRIORITY_CLASS;
+ case PROCESS_PRIOCLASS_HIGH: return HIGH_PRIORITY_CLASS;
+ case PROCESS_PRIOCLASS_REALTIME: return REALTIME_PRIORITY_CLASS;
+ }
+ SetLastError( ERROR_INVALID_PARAMETER );
return 0;
}
diff --git a/dlls/kernel/toolhelp.c b/dlls/kernel/toolhelp.c
index 0a661a2..cfbe0e3 100644
--- a/dlls/kernel/toolhelp.c
+++ b/dlls/kernel/toolhelp.c
@@ -160,7 +160,25 @@
lppe->th32ModuleID = (DWORD)reply->module;
lppe->cntThreads = reply->threads;
lppe->th32ParentProcessID = reply->ppid;
- lppe->pcPriClassBase = reply->priority;
+ switch (reply->priority)
+ {
+ case PROCESS_PRIOCLASS_IDLE:
+ lppe->pcPriClassBase = IDLE_PRIORITY_CLASS; break;
+ case PROCESS_PRIOCLASS_BELOW_NORMAL:
+ lppe->pcPriClassBase = BELOW_NORMAL_PRIORITY_CLASS; break;
+ case PROCESS_PRIOCLASS_NORMAL:
+ lppe->pcPriClassBase = NORMAL_PRIORITY_CLASS; break;
+ case PROCESS_PRIOCLASS_ABOVE_NORMAL:
+ lppe->pcPriClassBase = ABOVE_NORMAL_PRIORITY_CLASS; break;
+ case PROCESS_PRIOCLASS_HIGH:
+ lppe->pcPriClassBase = HIGH_PRIORITY_CLASS; break;
+ case PROCESS_PRIOCLASS_REALTIME:
+ lppe->pcPriClassBase = REALTIME_PRIORITY_CLASS; break;
+ default:
+ FIXME("Unknown NT priority class %d, setting to normal\n", reply->priority);
+ lppe->pcPriClassBase = NORMAL_PRIORITY_CLASS;
+ break;
+ }
lppe->dwFlags = -1; /* FIXME */
if (unicode)
{
diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c
index 75b3417..2444bc4 100644
--- a/dlls/ntdll/process.c
+++ b/dlls/ntdll/process.c
@@ -302,9 +302,36 @@
IN PVOID ProcessInformation,
IN ULONG ProcessInformationLength)
{
- FIXME("(%p,0x%08x,%p,0x%08lx) stub\n",
- ProcessHandle,ProcessInformationClass,ProcessInformation,ProcessInformationLength);
- return 0;
+ NTSTATUS ret = STATUS_SUCCESS;
+
+ switch (ProcessInformationClass)
+ {
+ case ProcessPriorityClass:
+ if (ProcessInformationLength != sizeof(PROCESS_PRIORITY_CLASS))
+ return STATUS_INVALID_PARAMETER;
+ else
+ {
+ PROCESS_PRIORITY_CLASS* ppc = ProcessInformation;
+
+ SERVER_START_REQ( set_process_info )
+ {
+ req->handle = ProcessHandle;
+ /* FIXME Foreground isn't used */
+ req->priority = ppc->PriorityClass;
+ req->mask = SET_PROCESS_INFO_PRIORITY;
+ ret = wine_server_call( req );
+ }
+ SERVER_END_REQ;
+ }
+ break;
+ default:
+ FIXME("(%p,0x%08x,%p,0x%08lx) stub\n",
+ ProcessHandle,ProcessInformationClass,ProcessInformation,
+ ProcessInformationLength);
+ ret = STATUS_NOT_IMPLEMENTED;
+ break;
+ }
+ return ret;
}
/******************************************************************************
diff --git a/include/winternl.h b/include/winternl.h
index 158531f..81f9020 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -932,6 +932,18 @@
#endif
} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
+#define PROCESS_PRIOCLASS_IDLE 1
+#define PROCESS_PRIOCLASS_NORMAL 2
+#define PROCESS_PRIOCLASS_HIGH 3
+#define PROCESS_PRIOCLASS_REALTIME 4
+#define PROCESS_PRIOCLASS_BELOW_NORMAL 5
+#define PROCESS_PRIOCLASS_ABOVE_NORMAL 6
+
+typedef struct _PROCESS_PRIORITY_CLASS {
+ BOOLEAN Foreground;
+ UCHAR PriorityClass;
+} PROCESS_PRIORITY_CLASS, *PPROCESS_PRIORITY_CLASS;
+
typedef struct _RTL_HEAP_DEFINITION {
ULONG Length; /* = sizeof(RTL_HEAP_DEFINITION) */
diff --git a/server/process.c b/server/process.c
index a1d03d3..8453f18 100644
--- a/server/process.c
+++ b/server/process.c
@@ -37,8 +37,7 @@
#include <poll.h>
#endif
-#include "windef.h"
-#include "winnt.h"
+#include "winternl.h"
#include "file.h"
#include "handle.h"
@@ -233,7 +232,7 @@
process->msg_fd = NULL;
process->exit_code = STILL_ACTIVE;
process->running_threads = 0;
- process->priority = NORMAL_PRIORITY_CLASS;
+ process->priority = PROCESS_PRIOCLASS_NORMAL;
process->affinity = 1;
process->suspend = 0;
process->create_flags = 0;