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