PoExecuteIdleCheck
NTSTATUS __stdcall PoExecuteIdleCheck(UINT64 a1){
NTSTATUS result;
unsigned int v3;
_KPRCB *Prcb;
INT64 v5;
UINT16 *v6[2];
__int16 v7;
int v8;
__int16 v9;
_KAFFINITY_EX Affinity;
_KAFFINITY_EX IdleConstrainedMask;
v8 = 0;
v9 = 0;
memset(&IdleConstrainedMask, 0i64, sizeof(IdleConstrainedMask));
memset(Affinity.Bitmap, 0i64, sizeof(Affinity.Bitmap));
result = PpmIdleDurationExpirationTimeout;
if( PpmIdleDurationExpirationTimeout )
{
if( PpmIdleDurationExpirationTimeout + PpmIdleLastIdleDurationExpirationTime < a1 )
{
LOBYTE(result) = PpmGetIdleConstrainedMask(&IdleConstrainedMask);
if( (_BYTE)result )
{
PpmIdleLastIdleDurationExpirationTime = a1;
*(_DWORD *)&Affinity.Count = 1310721;
memset(&Affinity.Reserved, 0i64, 0xA4u);
v6[1] = (UINT16 *)IdleConstrainedMask.Bitmap[0];
v6[0] = (UINT16 *)&IdleConstrainedMask;
v7 = 0;
while( 1 )
{
LODWORD(v5) = 0;
if( KiEnumerateNextProcessorNumber((INT64)&v5, v6) < 0 )
break;
v3 = KiProcessorNumberToIndexMappingTable[64 * (unsigned __int16)v5 + BYTE2(v5)];
Prcb = KeGetPrcb(v3);
if( Prcb != KeGetCurrentPrcb() && Prcb->PowerState.IdleTimeExpiration <= a1 )
KeAddProcessorAffinityEx(&Affinity.Count, v3);
}
result = KeIsEmptyAffinityEx(&Affinity.Count);
if( !result )
{
PpmEventIdleDurationExpiration(&Affinity);
HalRequestIpi(IpiAffinity, &Affinity);
}
}
}
}
return result;
}Referenced by:
KeClockInterruptNotify
KiUpdateTime