KiCheckAndRearmForceIdle
INT64 __stdcall KiCheckAndRearmForceIdle(){
INT64 result;
INT64 v1;
EVENT_DESCRIPTOR *v2;
__int64 v3;
UINT64 SpinCount;
INT64 CurrentQpc;
CurrentQpc = 0i64;
if( !KiForceIdleDisabled )
{
_disable();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&KiForceIdleLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( KiForceIdleLock );
}
result = (unsigned int)KiForceIdleState;
if( (_DWORD)KiForceIdleState == 1 )
{
KeRemoveQueueDpcEx((_KDPC *)&KiForceIdleStartDpc, 0);
KiSetForceIdleState(2i64, v1, v2);
}
else if( (_DWORD)KiForceIdleState != 2 )
{
LABEL_6:
_InterlockedAnd64(&KiForceIdleLock, 0i64);
_enable();
return result;
}
LODWORD(v3) = RtlGetInterruptTimePrecise(&CurrentQpc);
result = 10000000i64 * (unsigned int)KiForceIdleGracePeriodInSec + v3;
KiForceIdleStartTime = result;
goto LABEL_6;
}
return result;
}Referenced by:
KiCallInterruptServiceRoutine
KiTimer2Expiration