KiSetBasePriorityAndClearDecrement

NTSTATUS __stdcall KiSetBasePriorityAndClearDecrement(_ETHREAD *Thread, INT64 *NewBase, UINT64 ClearForegroundOnly){
  NTSTATUS v3; 
  int v4; 
  char v7; 
  _KPRCB *CurrentPrcb; 
  char PriorityDecrement; 
  _SINGLE_LIST_ENTRY *p_IoSelfBoostsEntry; 
  _SINGLE_LIST_ENTRY *p_AbSelfIoBoostsList; 

  v3 = 0;
  v4 = ClearForegroundOnly;
  if( NewBase )
  {
    v7 = *(_BYTE *)NewBase;
    CurrentPrcb = KeGetCurrentPrcb();
    if( *(_BYTE *)NewBase < Thread->Tcb.BasePriority )
    {
      if( Thread->Tcb.AbOwnedEntryCount )
      {
        p_IoSelfBoostsEntry = &Thread->Tcb.IoSelfBoostsEntry;
        if( Thread->Tcb.IoSelfBoostsEntry.Next == (_SINGLE_LIST_ENTRY *)1 )
        {
          p_AbSelfIoBoostsList = &CurrentPrcb->AbSelfIoBoostsList;
          if( CurrentPrcb != (_KPRCB *)-34672i64 )
          {
            p_IoSelfBoostsEntry->Next = p_AbSelfIoBoostsList->Next;
            p_AbSelfIoBoostsList->Next = p_IoSelfBoostsEntry;
            _InterlockedAdd16(&Thread->Tcb.KeReferenceCount, 1u);
            KiAbQueueAutoBoostDpc(CurrentPrcb);
            v7 = *(_BYTE *)NewBase;
          }
        }
      }
    }
    Thread->Tcb.BasePriority = v7;
    v3 = *(_DWORD *)NewBase;
  }
  PriorityDecrement = Thread->Tcb.PriorityDecrement;
  if( PriorityDecrement )
  {
    if( (PriorityDecrement & 0xF) != 0 )
      Thread->Tcb.ForegroundLossTime = KUSER_SHARED_DATA.TickCount.LowPart;
    if( v4 )
    {
      v3 = Thread->Tcb.Priority - (Thread->Tcb.PriorityDecrement & 0xF);
      Thread->Tcb.PriorityDecrement &= 0xF0u;
    }
    else
    {
      Thread->Tcb.PriorityDecrement = 0;
    }
  }
  return v3;
}

Referenced by:

KeRemovePriQueue
KeSetPriorityAndQuantumProcess
KiDeferredReadySingleThread
KiDirectSwitchThread
KiUpdateVPBackingThreadPriority
KiUpdateVpBackingThreadPriorityFromTopLevel