diff --git a/dll/win32/kernel32/client/proc.c b/dll/win32/kernel32/client/proc.c index cba4cf6a1e..23f2cd80ad 100644 --- a/dll/win32/kernel32/client/proc.c +++ b/dll/win32/kernel32/client/proc.c @@ -1659,10 +1659,24 @@ WINAPI GetPriorityClass(IN HANDLE hProcess) { NTSTATUS Status; - PROCESS_PRIORITY_CLASS PriorityClass; + PROCESS_PRIORITY_CLASS DECLSPEC_ALIGN(4) PriorityClass; + HANDLE newProcess; + + if (hProcess == (HANDLE)-1) /* Check for pseudo handle */ + { + /* Convert a pseudo handle to a real handle. + MSDN says: A process can use the OpenProcess + function to open a real handle to itself. */ + newProcess = OpenProcess( PROCESS_DUP_HANDLE, 0, (DWORD)hProcess ); + } + else + { + /* If it is not a pseudo handle, then just use the incoming handle. */ + newProcess = hProcess; + } /* Query the kernel */ - Status = NtQueryInformationProcess(hProcess, + Status = NtQueryInformationProcess(newProcess, ProcessPriorityClass, &PriorityClass, sizeof(PriorityClass), @@ -1696,7 +1710,7 @@ SetPriorityClass(IN HANDLE hProcess, { NTSTATUS Status; PVOID State = NULL; - PROCESS_PRIORITY_CLASS PriorityClass; + PROCESS_PRIORITY_CLASS DECLSPEC_ALIGN(4) PriorityClass; /* Handle conversion from Win32 to NT priority classes */ switch (dwPriorityClass) @@ -2270,7 +2284,7 @@ CreateProcessInternalW(IN HANDLE hUserToken, HANDLE DebugHandle, TokenHandle, JobHandle, KeyHandle, ThreadHandle; HANDLE FileHandle, SectionHandle, ProcessHandle; ULONG ResumeCount; - PROCESS_PRIORITY_CLASS PriorityClass; + PROCESS_PRIORITY_CLASS DECLSPEC_ALIGN(4) PriorityClass; NTSTATUS Status, AppCompatStatus, SaferStatus, IFEOStatus, ImageDbgStatus; PPEB Peb, RemotePeb; PTEB Teb;