KiRemoveBoostThread
CHAR __stdcall KiRemoveBoostThread(_KPRCB *Prcb, _ETHREAD *Thread){
struct _KPRCB *CurrentPrcb;
unsigned __int8 v5;
_KPRCB *v6;
char v7;
CHAR v8;
char v9;
unsigned int v10;
char v11;
char v12;
struct _KPRCB *v13;
__int64 v14;
int v15;
_KTHREAD *v16;
_ETHREAD *v17;
_KPRCB *v18;
volatile INT32 *v19;
char v21;
bool v22;
char v23;
_KSCB *v24;
UINT8 v25;
int v26;
__int64 v27;
int v28;
__int64 v29;
char v30;
__int64 v31;
char v32;
INT64 v33;
_QWORD *v34;
_QWORD *v35;
INT64 v36;
UINT64 SpinCount;
int v38;
UINT64 v39;
if( !*((_BYTE *)Thread + 564) )
return *((_BYTE *)Thread + 195) + 1;
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)Thread + 8) );
v27 = *((_QWORD *)CurrentPrcb + 4247);
if( v27 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
++*(_DWORD *)(v27 + 24);
}
v5 = *((_BYTE *)Thread + 564);
v6 = (_KPRCB *)*((unsigned __int8 *)Thread + 195);
v7 = v5 & 0xF;
v8 = (_BYTE)v6 - (v5 & 0xF);
if( (v5 & 0xF) == 0 )
v8 = *((_BYTE *)Thread + 195);
v9 = v5 >> 4;
if( v9 )
{
v10 = *((_DWORD *)Thread + 214);
v11 = (_BYTE)v6 - v9;
*((_BYTE *)Thread + 564) = v7;
v38 = 0;
if( v10 )
{
_BitScanReverse((unsigned int *)&v28, v10);
if( v11 < v28 )
v11 = v28;
v38 = v28;
}
if( v11 != (_BYTE)v6 )
{
v12 = 0;
v13 = KeGetCurrentPrcb();
LODWORD(v39) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)Prcb + 12, 0i64) )
{
do
KeYieldProcessorEx(&v39);
while( *((_QWORD *)Prcb + 6) );
v29 = *((_QWORD *)v13 + 4247);
if( v29 && *((_BYTE *)v13 + 32) <= 1u )
++*(_DWORD *)(v29 + 24);
}
if( !*((_QWORD *)Prcb + 2) )
{
if( *((_BYTE *)Thread + 195) == 31 )
goto LABEL_16;
if( (v14 = *((_QWORD *)Thread + 13), v15 = *((char *)Thread + 195), v14)
&& (v24 = (_KSCB *)(*((unsigned int *)Prcb + 54) + v14)) != 0i64
&& (Prcb == KeGetCurrentPrcb() || Thread != *((_ETHREAD **)Prcb + 1) ? (v25 = 1) : (v25 = 0),
KiGetThreadEffectiveRankNonZero(Thread, v24, v6, v25, 0i64),
v26) )
{
KiChooseLowestRankedThread(Prcb, Thread, (unsigned int)(v15 + 1));
}
else
{
v16 = (_ETHREAD *)KiSelectReadyThread((unsigned int)(v15 + 1), Prcb);
}
v17 = v16;
if( v16 )
{
if( (*((_BYTE *)v16 + 2) & 4) == 0 || (KiIsThreadRankNonZero(v16, Prcb), v30 = 1, !v32) )
v30 = *((_BYTE *)v17 + 195);
**((_BYTE **)Prcb + 7) = v30;
v31 = *((_QWORD *)Prcb + 4247);
if( v31 )
{
v33 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v17 != *((_ETHREAD **)Prcb + 3) )
v33 = (unsigned int)v30;
KiSetSchedulerAssistPriority(*((volatile INT32 **)Prcb + 4247), v33, 0);
v31 = *((_QWORD *)Prcb + 4247);
}
*((_QWORD *)Prcb + 2) = v17;
if( v31 )
*(_BYTE *)(v31 + 16) = v17 == *((_ETHREAD **)Prcb + 3);
if( *((_BYTE *)v17 + 388) == 1 )
*((_DWORD *)v17 + 33) = *((_DWORD *)v17 + 33) - *((_DWORD *)v17 + 109) + KUSER_SHARED_DATA.TickCount.LowPart;
*((_BYTE *)v17 + 388) = 3;
}
else
{
LABEL_16:
v12 = 1;
}
}
v18 = KeGetCurrentPrcb();
if( v11 > *((char *)Thread + 195) )
{
if( *((_BYTE *)Thread + 793) )
{
v34 = (_QWORD *)((char *)Thread + 808);
if( *((_QWORD *)Thread + 101) == 1i64 )
{
v35 = (_QWORD *)((char *)v18 + 34680);
if( v18 != (_KPRCB *)-34680i64 )
{
*v34 = *v35;
*v35 = v34;
_InterlockedIncrement16((volatile signed __int16 *)Thread + 434);
KiAbQueueAutoBoostDpc(v18);
}
}
}
}
*((_BYTE *)Thread + 195) = v11;
if( v12 )
{
if( (*((_BYTE *)Thread + 2) & 4) != 0 )
{
KiIsThreadRankNonZero(Thread, Prcb);
v22 = v21 == 0;
v23 = 1;
if( v22 )
v23 = *((_BYTE *)Thread + 195);
v11 = v23;
}
**((_BYTE **)Prcb + 7) = v11;
v19 = (volatile INT32 *)*((_QWORD *)Prcb + 4247);
if( v19 )
{
v36 = (unsigned int)KiVpThreadSystemWorkPriority;
if( Thread != *((_ETHREAD **)Prcb + 3) )
v36 = (unsigned int)v11;
KiSetSchedulerAssistPriority(v19, v36, 0);
}
}
if( (*((_DWORD *)Thread + 30) & 0x400000) != 0 )
KiSetSchedulerAssistPriority(*((volatile INT32 **)Thread + 121), (unsigned int)*((char *)Thread + 195), 1);
_InterlockedAnd64((volatile signed __int64 *)Prcb + 6, 0i64);
}
}
else
{
++v8;
}
*((_QWORD *)Thread + 8) = 0i64;
return v8;
}Referenced by:
CcUnpinFileDataEx
ExpReleaseResourceExclusiveForThreadLite
ExpReleaseResourceSharedForThreadLite
KeGenericProcessorCallback
KeSetEventBoostPriorityEx
KeWakeWaitChain
KiCompleteDirectSwitchThread