KiRemoveBoostThread
VOID __fastcall KiRemoveBoostThread(_KPRCB *Prcb, _ETHREAD *Thread){
struct _KPRCB *CurrentPrcb;
unsigned __int8 PriorityDecrement;
_SINGLE_LIST_ENTRY *Priority;
char v7;
char v8;
unsigned int PriorityFloorSummary;
char v10;
char v11;
struct _KPRCB *v12;
_KSCHEDULING_GROUP *volatile SchedulingGroup;
int v14;
_ETHREAD *v15;
_ETHREAD *v16;
_KPRCB *v17;
INT32 *v18;
bool v19;
char v20;
_KSCB *v21;
UINT8 v22;
int v23;
_DWORD *SchedulerAssist;
int v25;
_DWORD *v26;
char v27;
_BYTE *v28;
UINT8 IsThreadRankNonZero;
INT64 v30;
_SINGLE_LIST_ENTRY *p_PropagateBoostsEntry;
INT64 v32;
UINT64 SpinCount;
int v34;
UINT64 v35;
if( Thread->Tcb.PriorityDecrement )
{
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Thread->Tcb.ThreadLock );
SchedulerAssist = CurrentPrcb->SchedulerAssist;
if( SchedulerAssist && CurrentPrcb->NestingLevel <= 1u )
++SchedulerAssist[6];
}
PriorityDecrement = Thread->Tcb.PriorityDecrement;
Priority = (_SINGLE_LIST_ENTRY *)(unsigned __int8)Thread->Tcb.Priority;
v7 = PriorityDecrement & 0xF;
v8 = PriorityDecrement >> 4;
if( v8 )
{
PriorityFloorSummary = Thread->Tcb.PriorityFloorSummary;
v10 = (_BYTE)Priority - v8;
Thread->Tcb.PriorityDecrement = v7;
v34 = 0;
if( PriorityFloorSummary )
{
_BitScanReverse((unsigned int *)&v25, PriorityFloorSummary);
if( v10 < v25 )
v10 = v25;
v34 = v25;
}
if( v10 != (_BYTE)Priority )
{
v11 = 0;
v12 = KeGetCurrentPrcb();
LODWORD(v35) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Prcb->PrcbLock, 0i64) )
{
do
KeYieldProcessorEx(&v35);
while( Prcb->PrcbLock );
v26 = v12->SchedulerAssist;
if( v26 && v12->NestingLevel <= 1u )
++v26[6];
}
if( !Prcb->NextThread )
{
if( Thread->Tcb.Priority != 31
&& ((SchedulingGroup = Thread->Tcb.SchedulingGroup, v14 = Thread->Tcb.Priority, !SchedulingGroup)
|| (v21 = (_KSCB *)((char *)SchedulingGroup + Prcb->ScbOffset)) == 0i64
|| (Prcb == KeGetCurrentPrcb() || Thread != Prcb->CurrentThread ? (v22 = 1) : (v22 = 0),
KiGetThreadEffectiveRankNonZero(Thread, v21, (_KPRCB *)Priority, v22, 0i64),
!v23) ? (v15 = (_ETHREAD *)KiSelectReadyThread((unsigned int)(v14 + 1), Prcb)) : (v15 = (_ETHREAD *)KiChooseLowestRankedThread(Prcb, &Thread->Tcb, (unsigned int)(v14 + 1))),
(v16 = v15) != 0i64) )
{
if( (v15->Tcb.gap0[2] & 4) == 0
|| (IsThreadRankNonZero = KiIsThreadRankNonZero(&v15->Tcb, Prcb, (_KPRCB *)Priority),
v27 = 1,
!IsThreadRankNonZero) )
{
v27 = v16->Tcb.Priority;
}
*Prcb->PriorityState = v27;
v28 = Prcb->SchedulerAssist;
if( v28 )
{
v30 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v16 != Prcb->IdleThread )
v30 = (unsigned int)v27;
KiSetSchedulerAssistPriority((INT32 *)Prcb->SchedulerAssist, v30, 0);
v28 = Prcb->SchedulerAssist;
}
Prcb->NextThread = v16;
if( v28 )
v28[16] = v16 == Prcb->IdleThread;
if( v16->Tcb.WaitBlockFill6[68] == 1 )
v16->Tcb.ReadyTime = v16->Tcb.ReadyTime
- v16->Tcb.WaitBlock[2].SpareLong
+ KUSER_SHARED_DATA.TickCount.LowPart;
v16->Tcb.WaitBlockFill6[68] = 3;
}
else
{
v11 = 1;
}
}
v17 = KeGetCurrentPrcb();
if( v10 > Thread->Tcb.Priority )
{
if( Thread->Tcb.AbWaitEntryCount )
{
p_PropagateBoostsEntry = &Thread->Tcb.PropagateBoostsEntry;
if( Thread->Tcb.PropagateBoostsEntry.Next == (_SINGLE_LIST_ENTRY *)1 )
{
Priority = &v17->AbPropagateBoostsList;
if( v17 != (_KPRCB *)-34680i64 )
{
p_PropagateBoostsEntry->Next = Priority->Next;
Priority->Next = p_PropagateBoostsEntry;
_InterlockedIncrement16(&Thread->Tcb.KeReferenceCount);
KiAbQueueAutoBoostDpc(v17);
}
}
}
}
Thread->Tcb.Priority = v10;
if( v11 )
{
if( (Thread->Tcb.gap0[2] & 4) != 0 )
{
v19 = KiIsThreadRankNonZero(&Thread->Tcb, Prcb, (_KPRCB *)Priority) == 0;
v20 = 1;
if( v19 )
v20 = Thread->Tcb.Priority;
v10 = v20;
}
*Prcb->PriorityState = v10;
v18 = (INT32 *)Prcb->SchedulerAssist;
if( v18 )
{
v32 = (unsigned int)KiVpThreadSystemWorkPriority;
if( Thread != Prcb->IdleThread )
v32 = (unsigned int)v10;
KiSetSchedulerAssistPriority(v18, v32, 0);
}
}
if( (*(&Thread->Tcb.MiscFlags + 1) & 0x400000) != 0 )
KiSetSchedulerAssistPriority((INT32 *)Thread->Tcb.SchedulerAssist, (unsigned int)Thread->Tcb.Priority, 1);
_InterlockedAnd64((volatile signed __int64 *)&Prcb->PrcbLock, 0i64);
}
}
Thread->Tcb.ThreadLock = 0i64;
}
}Referenced by:
CcUnpinFileDataEx
ExpReleaseResourceExclusiveForThreadLite
ExpReleaseResourceSharedForThreadLite
KeGenericProcessorCallback
KeSetEventBoostPriorityEx
KeWakeWaitChain
KiCompleteDirectSwitchThread