KiGroupSchedulingGenerationEnd
VOID __stdcall KiGroupSchedulingGenerationEnd(_KPRCB *Prcb, UINT64 CurrentTick, UINT8 Parking){
__int64 v3;
__int64 v5;
__int64 v8;
int v9;
INT64 v10;
_KTHREAD *v11;
_ETHREAD *v12;
__int64 v13;
char v14;
int v15;
char v16;
__int64 v17;
bool v18;
UINT64 v19;
UINT64 v20;
char v21;
char v22;
INT64 v23;
INT64 v24;
v3 = *((_QWORD *)Prcb + 1);
v5 = *((_QWORD *)Prcb + 3);
if( !Parking )
{
_disable();
KiEndThreadCycleAccumulation(Prcb, *((_KTHREAD **)Prcb + 1), 0i64);
_enable();
}
KiTransitionSchedulingGroupGeneration((__int64)Prcb, CurrentTick, Parking);
if( !Parking )
{
v8 = *((_QWORD *)Prcb + 2);
v9 = 0;
if( v8 )
{
if( v8 == *((_QWORD *)Prcb + 3) )
goto LABEL_9;
*((_QWORD *)Prcb + 2) = 0i64;
if( (*(_BYTE *)(v3 + 2) & 4) == 0 || (KiIsThreadRankNonZero((_ETHREAD *)v3, Prcb), v14 = 1, !v22) )
v14 = *(_BYTE *)(v3 + 195);
**((_BYTE **)Prcb + 7) = v14;
if( *((_QWORD *)Prcb + 4247) )
{
v23 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v3 != *((_QWORD *)Prcb + 3) )
v23 = (unsigned int)v14;
KiSetSchedulerAssistPriority(*((volatile INT32 **)Prcb + 4247), v23, 0);
}
*(_BYTE *)(v8 + 388) = 1;
v15 = *(char *)(v8 + 195);
*(_DWORD *)(v8 + 436) = KUSER_SHARED_DATA.TickCount.LowPart;
KiAddThreadToPrcbQueue((__int64)Prcb, v8, v15, 1, 0);
v9 = 1;
}
if( v8 == *((_QWORD *)Prcb + 3) )
goto LABEL_9;
if( v3 == v5 )
{
v10 = 0i64;
}
else
{
v10 = (unsigned int)(*(char *)(v3 + 195) + 1);
if( (int)v10 > 31 )
goto LABEL_9;
}
v11 = (_ETHREAD *)KiSelectReadyThread(v10, Prcb);
v12 = v11;
if( v11 )
{
if( (*((_BYTE *)v11 + 2) & 4) != 0 )
{
KiIsThreadRankNonZero(v11, Prcb);
v16 = 1;
if( !v21 )
v16 = *((_BYTE *)v12 + 195);
}
else
{
v16 = *((_BYTE *)v11 + 195);
}
**((_BYTE **)Prcb + 7) = v16;
v17 = *((_QWORD *)Prcb + 4247);
if( v17 )
{
v24 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v12 != *((_ETHREAD **)Prcb + 3) )
v24 = (unsigned int)v16;
KiSetSchedulerAssistPriority(*((volatile INT32 **)Prcb + 4247), v24, 0);
v17 = *((_QWORD *)Prcb + 4247);
}
v18 = v12 == *((_ETHREAD **)Prcb + 3);
*((_QWORD *)Prcb + 2) = v12;
if( v17 )
*(_BYTE *)(v17 + 16) = v18;
if( *((_BYTE *)v12 + 388) == 1 )
*((_DWORD *)v12 + 33) = *((_DWORD *)v12 + 33) - *((_DWORD *)v12 + 109) + KUSER_SHARED_DATA.TickCount.LowPart;
*((_BYTE *)v12 + 388) = 3;
--v9;
}
LABEL_9:
if( v3 != v5 )
{
LABEL_10:
_disable();
KiStartThreadCycleAccumulation(Prcb, (_KTHREAD *)v3, v3 == v5);
_enable();
return;
}
if( v9 > 0 )
{
if( (*((_BYTE *)Prcb + 35) & 1) != 0 )
{
v19 = 1i64;
v20 = 1i64;
LABEL_36:
KiSetProcessorIdle(Prcb, v20, v19);
}
}
else if( v9 < 0 && (*((_BYTE *)Prcb + 35) & 1) == 0 )
{
v19 = 0i64;
v20 = 0i64;
goto LABEL_36;
}
v13 = *((_QWORD *)Prcb + 2);
if( !v13 || v13 == *((_QWORD *)Prcb + 3) )
{
if( (*((_BYTE *)Prcb + 35) & 1) == 0 )
goto LABEL_10;
}
else if( (*((_BYTE *)Prcb + 35) & 1) != 0 )
{
goto LABEL_10;
}
__fastfail(0x1Eu);
}
}Referenced by:
KeTransitionProcessorParkState
KiGroupSchedulingQuantumEnd