KiCheckAndRearmForceIdle
VOID __stdcall KiCheckAndRearmForceIdle(){
INT64 v0;
NPTEXTMETRIC *v1;
__int64 v2;
UINT64 SpinCount;
INT64 CurrentQpc;
CurrentQpc = 0i64;
if( !KiForceIdleDisabled )
{
_disable();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((_DWORD *)&KiSwapEvent + 42, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(&KiSwapEvent + 21) );
}
if( (_DWORD)KiForceIdleState == 1 )
{
KeRemoveQueueDpcEx((_KDPC *)&KiSwapEvent + 3, 0i64);
KiSetForceIdleState(2i64, v0, v1);
}
else if( (_DWORD)KiForceIdleState != 2 )
{
LABEL_6:
_InterlockedAnd64((_QWORD *)&KiSwapEvent + 21, 0i64);
_enable();
return;
}
LODWORD(v2) = RtlGetInterruptTimePrecise(&CurrentQpc);
*(&KiSwapEvent + 20) = 10000000i64 * (unsigned int)KiForceIdleGracePeriodInSec + v2;
goto LABEL_6;
}
}Referenced by:
KiCallInterruptServiceRoutine
KiTimer2Expiration