KiResetForceIdle
VOID __fastcall KiResetForceIdle(INT64 a1, CHAR a2){
bool v2;
unsigned int v4;
__int16 v5;
INT64 v6;
EVENT_DESCRIPTOR *v7;
__int64 v8;
__int64 v9;
INT64 v10;
EVENT_DESCRIPTOR *v11;
__int16 v12;
UINT64 SpinCount;
INT64 CurrentQpc;
CurrentQpc = 0i64;
v2 = 0;
v4 = a1;
if( !a2 )
{
v5 = v12;
_disable();
v2 = (v5 & 0x200) != 0;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&KiForceIdleLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( KiForceIdleLock );
}
}
if( KeIsForceIdleEngaged() )
{
KiSetForceIdleState(3i64, v6, v7);
if( v4 == 3 )
{
v8 = 0i64;
}
else
{
LODWORD(v9) = RtlGetInterruptTimePrecise(&CurrentQpc);
v8 = 10000000i64 * (unsigned int)KiForceIdleGracePeriodInSec + v9;
}
KiForceIdleStartTime = v8;
if( !KiForceIdleStopDpc.DpcData )
KiForceIdleStopDpc.Number = KiClockTimerOwner + 1280;
KeInsertQueueDpc(&KiForceIdleStopDpc, 0i64, 0i64);
PoTraceForceIdleReset(v4, v10, v11);
}
if( !a2 )
{
_InterlockedAnd64(&KiForceIdleLock, 0i64);
if( v2 )
_enable();
}
}Referenced by:
KeClearForceIdle
KeClockInterruptNotify
KeResumeClockTimerFromIdle
KiCallInterruptServiceRoutine