KeQueryBasePriorityThread
NTSTATUS __stdcall KeQueryBasePriorityThread(_ETHREAD *Thread){
_EPROCESS *Process;
unsigned __int8 CurrentIrql;
NTSTATUS v4;
UINT64 SpinCount;
Process = Thread->Tcb.Process;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
ExAcquireSpinLockSharedAtDpcLevel((PEX_SPIN_LOCK)&Process->Pcb.ProcessLock);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Thread->Tcb.ThreadLock );
}
v4 = Thread->Tcb.BasePriority - Process->Pcb.BasePriority;
if( Thread->Tcb.Saturation )
v4 = 16 * Thread->Tcb.Saturation;
KiReleaseThreadLockSafe((INT64)Thread);
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)&Process->Pcb.ProcessLock);
__writecr8(CurrentIrql);
return v4;
}Referenced by:
NtQueryInformationThread