- 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)
This commit is contained in:
Eric Pouech 2005-09-06 10:25:11 +00:00 committed by Alexandre Julliard
parent 1228ce2684
commit b3badc7dd3
5 changed files with 108 additions and 17 deletions

View File

@ -2607,16 +2607,38 @@ HANDLE WINAPI CreateSocketHandle(void)
*/ */
BOOL WINAPI SetPriorityClass( HANDLE hprocess, DWORD priorityclass ) BOOL WINAPI SetPriorityClass( HANDLE hprocess, DWORD priorityclass )
{ {
BOOL ret; NTSTATUS status;
SERVER_START_REQ( set_process_info ) PROCESS_PRIORITY_CLASS ppc;
ppc.Foreground = FALSE;
switch (priorityclass)
{ {
req->handle = hprocess; case IDLE_PRIORITY_CLASS:
req->priority = priorityclass; ppc.PriorityClass = PROCESS_PRIOCLASS_IDLE; break;
req->mask = SET_PROCESS_INFO_PRIORITY; case BELOW_NORMAL_PRIORITY_CLASS:
ret = !wine_server_call_err( req ); 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 @@ DWORD WINAPI GetPriorityClass(HANDLE hProcess)
status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi,
sizeof(pbi), NULL); sizeof(pbi), NULL);
if (status == STATUS_SUCCESS) return pbi.BasePriority; if (status != STATUS_SUCCESS)
SetLastError( RtlNtStatusToDosError(status) ); {
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; return 0;
} }

View File

@ -160,7 +160,25 @@ static BOOL TOOLHELP_Process32Next( HANDLE handle, LPPROCESSENTRY32W lppe, BOOL
lppe->th32ModuleID = (DWORD)reply->module; lppe->th32ModuleID = (DWORD)reply->module;
lppe->cntThreads = reply->threads; lppe->cntThreads = reply->threads;
lppe->th32ParentProcessID = reply->ppid; 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 */ lppe->dwFlags = -1; /* FIXME */
if (unicode) if (unicode)
{ {

View File

@ -302,9 +302,36 @@ NTSTATUS WINAPI NtSetInformationProcess(
IN PVOID ProcessInformation, IN PVOID ProcessInformation,
IN ULONG ProcessInformationLength) IN ULONG ProcessInformationLength)
{ {
FIXME("(%p,0x%08x,%p,0x%08lx) stub\n", NTSTATUS ret = STATUS_SUCCESS;
ProcessHandle,ProcessInformationClass,ProcessInformation,ProcessInformationLength);
return 0; 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;
} }
/****************************************************************************** /******************************************************************************

View File

@ -932,6 +932,18 @@ typedef struct _PROCESS_BASIC_INFORMATION {
#endif #endif
} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION; } 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 { typedef struct _RTL_HEAP_DEFINITION {
ULONG Length; /* = sizeof(RTL_HEAP_DEFINITION) */ ULONG Length; /* = sizeof(RTL_HEAP_DEFINITION) */

View File

@ -37,8 +37,7 @@
#include <poll.h> #include <poll.h>
#endif #endif
#include "windef.h" #include "winternl.h"
#include "winnt.h"
#include "file.h" #include "file.h"
#include "handle.h" #include "handle.h"
@ -233,7 +232,7 @@ struct thread *create_process( int fd )
process->msg_fd = NULL; process->msg_fd = NULL;
process->exit_code = STILL_ACTIVE; process->exit_code = STILL_ACTIVE;
process->running_threads = 0; process->running_threads = 0;
process->priority = NORMAL_PRIORITY_CLASS; process->priority = PROCESS_PRIOCLASS_NORMAL;
process->affinity = 1; process->affinity = 1;
process->suspend = 0; process->suspend = 0;
process->create_flags = 0; process->create_flags = 0;