KiAbThreadUnboostCpuPriority
VOID __stdcall KiAbThreadUnboostCpuPriority(_ETHREAD *Thread, _KLOCK_ENTRY *Entry){
unsigned int v2;
unsigned __int8 CurrentIrql;
int v5;
char v6;
unsigned __int8 v7;
unsigned __int8 v8;
unsigned int v9;
char Priority;
char v11;
struct _KPRCB *CurrentPrcb;
_ETHREAD *CurrentThread;
bool i;
INT64 v15;
_ETHREAD *NextThread;
char v17;
INT64 v18;
INT64 v19;
UINT64 v20;
_SINGLE_LIST_ENTRY ReadyList;
UINT64 SpinCount;
v2 = (unsigned int)Entry;
ReadyList.Next = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
for( i = !_BitScanForward((unsigned int *)&v5, (unsigned int)Entry); !i; i = !_BitScanForward(
(unsigned int *)&v5,
v2) )
{
v6 = v5 + 1;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Thread->Tcb.ThreadLock );
}
v7 = Thread->Tcb.PriorityFloorCounts[v6];
if( !v7 )
KeBugCheckEx(0x157u, Thread, (PVOID)v6, (PVOID)2, 0i64);
v8 = v7 - 1;
Thread->Tcb.PriorityFloorCounts[v6] = v8;
if( !v8 )
{
v9 = Thread->Tcb.PriorityFloorSummary ^ (1 << v6);
Thread->Tcb.PriorityFloorSummary = v9;
if( v9 < 1 << v6 )
{
Priority = Thread->Tcb.Priority;
if( Priority < 16 )
{
v11 = Thread->Tcb.BasePriority
+ (Thread->Tcb.PriorityDecrement & 0xF)
+ ((unsigned __int8)Thread->Tcb.PriorityDecrement >> 4);
if( v11 < Priority )
KiSetPriorityThread(&Thread->Tcb, &ReadyList, (unsigned int)v11);
}
}
}
KiReleaseThreadLockSafe((INT64)Thread);
v2 &= v2 - 1;
}
CurrentPrcb = KeGetCurrentPrcb();
KiReadyDeferredReadyList(CurrentPrcb, &ReadyList);
if( CurrentIrql >= 2u )
{
if( CurrentPrcb->NextThread && !CurrentPrcb->DpcRoutineActive )
KiRequestSoftwareInterrupt(CurrentPrcb, 2);
}
else
{
CurrentThread = CurrentPrcb->CurrentThread;
if( CurrentPrcb->NextThread )
{
KiAbProcessContextSwitch(&CurrentPrcb->CurrentThread->Tcb, 0i64);
LODWORD(v20) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) )
{
do
KeYieldProcessorEx(&v20);
while( CurrentPrcb->PrcbLock );
}
NextThread = CurrentPrcb->NextThread;
CurrentPrcb->NextThread = 0i64;
_disable();
KiEndThreadCycleAccumulation((INT64)CurrentPrcb, (INT64)CurrentThread, 0i64, v15, v18, v19, v20);
_enable();
CurrentPrcb->CurrentThread = NextThread;
if( NextThread->Tcb.WaitBlockFill6[68] == 1 )
NextThread->Tcb.ReadyTime = NextThread->Tcb.ReadyTime
- NextThread->Tcb.WaitBlock[2].SpareLong
+ KUSER_SHARED_DATA.TickCount.LowPart;
NextThread->Tcb.WaitBlockFill6[68] = 2;
CurrentThread->Tcb.WaitReason = 32;
CurrentThread->Tcb.WaitIrql = CurrentIrql;
KiQueueReadyThread(CurrentPrcb, &CurrentThread->Tcb);
KiSwapContext();
i = v17 == 0;
}
else
{
i = (CurrentThread->Tcb._bf_0 & 0x40) == 0;
}
if( !i )
{
__writecr8(1ui64);
CurrentThread->Tcb._bf_0 &= ~0x40u;
KiDeliverApc(0, 0i64, 0i64);
}
__writecr8(CurrentIrql);
}
}Referenced by:
ExReleasePushLockEx
ExpWorkerInitialization
KeAbPostRelease
KiAbThreadRemoveBoosts