diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 77d5b51dc8f..ebef9d0a241 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -222,6 +222,10 @@ KeRundownThread(VOID); NTSTATUS KeReleaseThread(PKTHREAD Thread); +LONG +STDCALL +KeQueryBasePriorityThread(IN PKTHREAD Thread); + VOID STDCALL KeStackAttachProcess ( diff --git a/reactos/ntoskrnl/ke/kthread.c b/reactos/ntoskrnl/ke/kthread.c index 64a9d70560b..2319661e762 100644 --- a/reactos/ntoskrnl/ke/kthread.c +++ b/reactos/ntoskrnl/ke/kthread.c @@ -1026,6 +1026,34 @@ KeSetSystemAffinityThread(IN KAFFINITY Affinity) } } +LONG +STDCALL +KeQueryBasePriorityThread(IN PKTHREAD Thread) +{ + LONG BasePriorityIncrement; + KIRQL OldIrql; + PKPROCESS Process; + + /* Lock the Dispatcher Database */ + OldIrql = KeAcquireDispatcherDatabaseLock(); + + /* Get the Process */ + Process = Thread->ApcStatePointer[0]->Process; + + /* Calculate the BPI */ + BasePriorityIncrement = Thread->BasePriority - Process->BasePriority; + + /* If saturation occured, return the SI instead */ + if (Thread->Saturation) BasePriorityIncrement = (HIGH_PRIORITY + 1) / 2 * + Thread->Saturation; + + /* Release Lock */ + KeReleaseDispatcherDatabaseLock(OldIrql); + + /* Return Increment */ + return BasePriorityIncrement; +} + /* * @implemented */ diff --git a/reactos/ntoskrnl/ps/query.c b/reactos/ntoskrnl/ps/query.c index bdf17a8ece8..3e0b25202fb 100644 --- a/reactos/ntoskrnl/ps/query.c +++ b/reactos/ntoskrnl/ps/query.c @@ -1329,7 +1329,7 @@ NtQueryInformationThread (IN HANDLE ThreadHandle, u.TBI.ClientId = Thread->Cid; u.TBI.AffinityMask = Thread->Tcb.Affinity; u.TBI.Priority = Thread->Tcb.Priority; - u.TBI.BasePriority = Thread->Tcb.BasePriority; + u.TBI.BasePriority = KeQueryBasePriorityThread(&Thread->Tcb); break; case ThreadTimes: