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