KiGroupSchedulingQuantumEnd
VOID __stdcall KiGroupSchedulingQuantumEnd(
_KPRCB *Prcb,
_ETHREAD *Thread,
UINT8 RoundRobin,
_SINGLE_LIST_ENTRY *ReadyList){
_KPRCB *v4;
UINT64 TickCountQuad;
char v8;
struct _KPRCB *CurrentPrcb;
char v10;
__int64 v11;
_KSCB *v12;
__int64 v13;
_KSCHEDULING_GROUP *v14;
INT64 v15;
char v16;
char v17;
_KSCB *v18;
_ETHREAD *v19;
INT64 v20;
int v21;
_KTHREAD *v22;
_ETHREAD *v23;
struct _KPRCB *v24;
__int64 v25;
__int64 v26;
_KPRCB *v27;
__int64 v28;
__int64 v29;
char v30;
__int64 v31;
char v32;
INT64 v33;
char v34;
char v35;
__int64 v36;
INT64 v37;
bool v38;
_KSCB *v39;
_KSCB *v40;
int v41;
UINT8 ShareRankNonZero;
UINT64 SpinCount;
__int64 v44;
_ETHREAD *Threada;
char v46;
v4 = 0i64;
v44 = 0i64;
ShareRankNonZero = 0;
v46 = 0;
TickCountQuad = KUSER_SHARED_DATA.TickCountQuad;
v8 = 0;
CurrentPrcb = KeGetCurrentPrcb();
v10 = 0;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)Prcb + 12, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)Prcb + 6) );
v29 = *((_QWORD *)CurrentPrcb + 4247);
if( v29 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
++*(_DWORD *)(v29 + 24);
}
v11 = *((_QWORD *)Prcb + 2);
v12 = 0i64;
Threada = (_ETHREAD *)v11;
if( v11 )
{
v12 = *(_KSCB **)(v11 + 104);
if( v12 )
v12 = (_KSCB *)((char *)v12 + *((unsigned int *)Prcb + 54));
}
if( TickCountQuad > *((_QWORD *)Prcb + 4203) )
{
KiGroupSchedulingGenerationEnd(Prcb, TickCountQuad, 0);
return;
}
v13 = *((_QWORD *)Thread + 13);
v14 = (_KSCHEDULING_GROUP *)v13;
v44 = v13;
if( v13 )
{
v15 = *((unsigned int *)Prcb + 54) + v13;
if( v15 )
{
while( 1 )
{
v16 = *(_BYTE *)(v15 + 112);
if( (v16 & 4) != 0 )
break;
KiComputeGroupSchedulingRank(v14, Prcb, (_KSCB *)v15);
if( (*(_BYTE *)(v15 + 112) & 4) == 0 )
goto LABEL_16;
v10 = 1;
v8 = 1;
if( v12 != (_KSCB *)v15 )
goto LABEL_16;
v17 = 1;
v46 = 1;
LABEL_17:
v15 = *(_QWORD *)(v15 + 408);
if( !v15 )
{
v18 = (_KSCB *)*((_QWORD *)Thread + 13);
v19 = Threada;
if( v18 )
v18 = (_KSCB *)((char *)v18 + *((unsigned int *)Prcb + 54));
if( !v10 || Threada )
{
if( v8 && Threada && v12 )
{
if( v12 == v18 )
goto LABEL_39;
while( v12 )
{
v12 = v12->Parent;
if( v12 == v18 )
goto LABEL_39;
}
if( !v18 || v17 )
{
LABEL_39:
KiChooseLowestRankedThread(Prcb, Threada, (unsigned int)(*((char *)Threada + 195) + 1));
v28 = v26;
if( v26 )
{
*((_BYTE *)v19 + 388) = 1;
*((_DWORD *)v19 + 109) = KUSER_SHARED_DATA.TickCount.LowPart;
if( (*(_BYTE *)(v26 + 2) & 4) == 0 || (KiIsThreadRankNonZero((_ETHREAD *)v26, Prcb), v34 = 1, !v35) )
v34 = *(_BYTE *)(v28 + 195);
**((_BYTE **)Prcb + 7) = v34;
v36 = *((_QWORD *)Prcb + 4247);
if( v36 )
{
v37 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v28 != *((_QWORD *)Prcb + 3) )
v37 = (unsigned int)v34;
KiSetSchedulerAssistPriority(*((volatile INT32 **)Prcb + 4247), v37, 0);
v36 = *((_QWORD *)Prcb + 4247);
}
v38 = v28 == *((_QWORD *)Prcb + 3);
*((_QWORD *)Prcb + 2) = v28;
if( v36 )
*(_BYTE *)(v36 + 16) = v38;
if( *(_BYTE *)(v28 + 388) == 1 )
*(_DWORD *)(v28 + 132) = *(_DWORD *)(v28 + 132)
- *(_DWORD *)(v28 + 436)
+ KUSER_SHARED_DATA.TickCount.LowPart;
*(_BYTE *)(v28 + 388) = 3;
v39 = (_KSCB *)*((_QWORD *)v19 + 13);
if( v39 )
v39 = (_KSCB *)((char *)v39 + *((unsigned int *)Prcb + 54));
KiGetThreadEffectiveRankNonZero(v19, v39, v27, 1u, &ShareRankNonZero);
if( v41 )
KiAddThreadToScbQueue(Prcb, v40, (_KTHREAD *)v19, 1ui64);
else
KiAddThreadToPrcbQueue((__int64)Prcb, (__int64)v19, *((char *)v19 + 195), 1, ShareRankNonZero);
}
}
}
}
else
{
KiGetThreadEffectiveRankNonZero(Thread, v18, v4, 1u, 0i64);
v20 = (unsigned int)*((char *)Thread + 195);
if( v21 )
KiChooseLowestRankedThread(Prcb, Thread, (unsigned int)v20);
else
v22 = (_ETHREAD *)KiSelectReadyThread(v20, Prcb);
v23 = v22;
if( v22 )
{
if( (*((_BYTE *)v22 + 2) & 4) == 0 || (KiIsThreadRankNonZero(v22, Prcb), v30 = 1, !v32) )
v30 = *((_BYTE *)v23 + 195);
**((_BYTE **)Prcb + 7) = v30;
v31 = *((_QWORD *)Prcb + 4247);
if( v31 )
{
v33 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v23 != *((_ETHREAD **)Prcb + 3) )
v33 = (unsigned int)v30;
KiSetSchedulerAssistPriority(*((volatile INT32 **)Prcb + 4247), v33, 0);
v31 = *((_QWORD *)Prcb + 4247);
}
*((_QWORD *)Prcb + 2) = v23;
if( v31 )
*(_BYTE *)(v31 + 16) = v23 == *((_ETHREAD **)Prcb + 3);
if( *((_BYTE *)v23 + 388) == 1 )
*((_DWORD *)v23 + 33) = *((_DWORD *)v23 + 33)
- *((_DWORD *)v23 + 109)
+ KUSER_SHARED_DATA.TickCount.LowPart;
*((_BYTE *)v23 + 388) = 3;
}
}
if( v18 )
{
if( KiShouldPreemptionBeDeferred((__int64)Thread) )
{
if( (*((_DWORD *)Thread + 30) & 0xC00) == 0 )
{
_InterlockedAnd64((volatile signed __int64 *)Prcb + 6, 0i64);
KiInsertDeferredPreemptionApc(Prcb, (_KTHREAD *)Thread, 0);
v24 = KeGetCurrentPrcb();
HIDWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)Prcb + 12, 0i64) )
{
do
KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
while( *((_QWORD *)Prcb + 6) );
v25 = *((_QWORD *)v24 + 4247);
if( v25 )
{
if( *((_BYTE *)v24 + 32) <= 1u )
++*(_DWORD *)(v25 + 24);
}
}
}
}
else if( KiCheckForMaxOverQuotaScb((__int64)v18) && !*((_QWORD *)Prcb + 2) )
{
KiSelectNextThread(Prcb, ReadyList);
}
}
return;
}
v14 = (_KSCHEDULING_GROUP *)(v15 - *((unsigned int *)Prcb + 54));
v44 = (__int64)v14;
}
if( (v16 & 2) == 0 )
{
if( KiCheckMaxOverQuotaTransition(v15, (volatile INT64 *)v14) )
{
if( (*(_BYTE *)(v15 + 112) & 1) != 0 )
KiRemoveSchedulingGroupQueue(Prcb, (_KSCB *)v15, 1u);
}
else
{
if( *(_QWORD *)v15 < *(_QWORD *)(v15 + 24) )
{
if( RoundRobin )
v10 = 1;
goto LABEL_16;
}
KiRecomputeGroupSchedulingRank(v14, (_KSCB *)v15, Prcb);
if( v12 == (_KSCB *)v15 )
{
v10 = 1;
v46 = 1;
v8 = 1;
goto LABEL_16;
}
}
}
v10 = 1;
v8 = 1;
LABEL_16:
v17 = v46;
goto LABEL_17;
}
}
}Referenced by:
KiQuantumEnd