KiDeferGroupSchedulingPreemption
VOID __stdcall KiDeferGroupSchedulingPreemption(_ETHREAD *CurrentThread, _KPRCB *CurrentPrcb){
int v4;
__int64 v5;
_KPRCB *v6;
_KSCB *v7;
char v8;
char v9;
int v10;
INT64 v11;
UINT8 ShareRankNonZero;
UINT64 SpinCount;
if( *((_QWORD *)CurrentThread + 13) && KiShouldPreemptionBeDeferred((__int64)CurrentThread) )
{
v4 = 0;
LODWORD(SpinCount) = 0;
ShareRankNonZero = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)CurrentPrcb + 6) );
}
v5 = *((_QWORD *)CurrentPrcb + 2);
if( *((_QWORD *)CurrentThread + 13)
&& v5 != *((_QWORD *)CurrentPrcb + 3)
&& KiPrcbInGroupAffinity((__int64)CurrentPrcb, (__int64)CurrentThread + 576)
&& ((v7 = *(_KSCB **)(v5 + 104)) != 0i64
&& (v7 = (_KSCB *)((char *)v7 + *((unsigned int *)CurrentPrcb + 54))) != 0i64
&& (KiGetThreadEffectiveRankNonZero((_ETHREAD *)v5, v7, v6, 1u, &ShareRankNonZero), (v4 = v10) != 0)
|| *(_BYTE *)(v5 + 195) <= *((_BYTE *)CurrentThread + 195)) )
{
*((_QWORD *)CurrentPrcb + 2) = 0i64;
if( (*((_BYTE *)CurrentThread + 2) & 4) == 0 || (KiIsThreadRankNonZero(CurrentThread, CurrentPrcb), v8 = 1, !v9) )
v8 = *((_BYTE *)CurrentThread + 195);
**((_BYTE **)CurrentPrcb + 7) = v8;
if( *((_QWORD *)CurrentPrcb + 4247) )
{
v11 = (unsigned int)KiVpThreadSystemWorkPriority;
if( CurrentThread != *((_ETHREAD **)CurrentPrcb + 3) )
v11 = (unsigned int)v8;
KiSetSchedulerAssistPriority(*((volatile INT32 **)CurrentPrcb + 4247), v11, 0);
}
*(_BYTE *)(v5 + 388) = 1;
if( v4 )
KiAddThreadToScbQueue(CurrentPrcb, v7, (_KTHREAD *)v5, 1ui64);
else
KiAddThreadToPrcbQueue((__int64)CurrentPrcb, v5, *(char *)(v5 + 195), 1, ShareRankNonZero);
_InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
KiInsertDeferredPreemptionApc(CurrentPrcb, (_KTHREAD *)CurrentThread, 0);
}
else
{
_InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
}
}
}Referenced by:
KiDispatchInterrupt