KiForceIdleUpdateSchedulerParkState
INT64 __fastcall KiForceIdleUpdateSchedulerParkState(UINT8 a1){
void *v1;
struct _KPRCB *CurrentPrcb;
unsigned int v3;
int v4;
INT64 v5;
__int64 v6;
_DEVICE_MAP **v7;
unsigned int ProcessorNumber;
__int128 ProcessorNumber_8;
__int64 v10;
_KAFFINITY_EX result;
v1 = (void *)a1;
v10 = 0i64;
ProcessorNumber_8 = 0i64;
memset((INT64)&result, 0i64);
ProcessorNumber = 0;
CurrentPrcb = KeGetCurrentPrcb();
while( KiForceIdlePendingDpcCount )
_mm_pause();
if( (_BYTE)v1 )
{
KeCopyAffinityEx((__int64)&result, &KeActiveProcessors.Count);
}
else
{
KeCopyAffinityEx((__int64)&result, (unsigned __int16 *)&KiForceIdleUnparkRestoreMask);
KeOrAffinityEx(&result, &KiForceIdleSoftParkRestoreMask, &result);
}
v3 = KiProcessorIndexToNumberMappingTable[*((unsigned int *)CurrentPrcb + 9)];
v4 = KeCountSetBitsAffinityEx(&result);
if( ((result.Bitmap[v3 >> 6] >> (v3 & 0x3F)) & 1) != 0 )
--v4;
KiForceIdlePendingDpcCount = v4;
*((_QWORD *)&ProcessorNumber_8 + 1) = result.Bitmap[0];
*(_QWORD *)&ProcessorNumber_8 = &result;
while( 1 )
{
v5 = KeEnumerateNextProcessor(&ProcessorNumber, (unsigned __int16 **)&ProcessorNumber_8);
if( (_DWORD)v5 )
break;
KeGetPrcb(ProcessorNumber);
if( (struct _KPRCB *)v6 == KeGetCurrentPrcb() )
{
LOBYTE(v7) = (_BYTE)v1;
KiForceIdleParkUnparkProcessor((VOID *)v6, v7);
}
else
{
KiInsertQueueDpc((_KDPC *)(v6 + 33304), v1, 0i64, 0i64, 0);
}
}
return v5;
}Referenced by:
KiForceIdleStartDpcRoutine
KiForceIdleStopDpcRoutine