KiForceIdleUpdateSchedulerParkState
NTSTATUS __stdcall KiForceIdleUpdateSchedulerParkState(UINT8 a1){
VOID *v1;
struct _KPRCB *CurrentPrcb;
unsigned int v3;
NTSTATUS v4;
NTSTATUS result;
_KPRCB *Prcb;
UINT64 ProcIndex;
_KAFFINITY_ENUMERATION_CONTEXT ProcIndex_8;
_KAFFINITY_EX Dest;
v1 = (VOID *)a1;
memset(&ProcIndex_8, 0, sizeof(ProcIndex_8));
memset(&Dest, 0i64, sizeof(Dest));
LODWORD(ProcIndex) = 0;
CurrentPrcb = KeGetCurrentPrcb();
while( KiForceIdlePendingDpcCount )
_mm_pause();
if( (_BYTE)v1 )
{
KeCopyAffinityEx(&Dest, &KeActiveProcessors);
}
else
{
KeCopyAffinityEx(&Dest, &KiForceIdleUnparkRestoreMask);
KeOrAffinityEx((INT8 *)&Dest, &KiForceIdleSoftParkRestoreMask.Count, (INT8 *)&Dest);
}
v3 = KiProcessorIndexToNumberMappingTable[CurrentPrcb->Number];
v4 = KeCountSetBitsAffinityEx(&Dest.Count);
if( ((Dest.Bitmap[v3 >> 6] >> (v3 & 0x3F)) & 1) != 0 )
--v4;
KiForceIdlePendingDpcCount = v4;
ProcIndex_8.CurrentMask = Dest.Bitmap[0];
ProcIndex_8.Affinity = &Dest;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &ProcIndex_8);
if( result )
break;
Prcb = KeGetPrcb((unsigned int)ProcIndex);
if( Prcb == KeGetCurrentPrcb() )
KiForceIdleParkUnparkProcessor(Prcb, (INT8)v1);
else
KiInsertQueueDpc(&Prcb->ForceIdleDpc, v1, 0i64, 0i64, 0);
}
return result;
}Referenced by:
KiForceIdleStartDpcRoutine
KiForceIdleStopDpcRoutine