KeSetForceIdle
INT64 __stdcall KeSetForceIdle(){
INT64 result;
int v1;
INT64 v2;
EVENT_DESCRIPTOR *v3;
INT64 v4;
UINT64 SpinCount;
INT64 CurrentQpc;
CurrentQpc = 0i64;
_disable();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&KiForceIdleLock, 0i64) )
{
do
{
KeYieldProcessorEx(&SpinCount);
result = KiForceIdleLock;
}
while( KiForceIdleLock );
}
if( !KiForceIdleDisabled )
{
v1 = KiForceIdleState;
LODWORD(result) = RtlGetInterruptTimePrecise(&CurrentQpc);
v4 = result + 10000000i64 * (unsigned int)KiForceIdleGracePeriodInSec;
if( !v1 )
{
result = KiSetForceIdleState(2i64, v2, v3);
LABEL_10:
KiForceIdleStartTime = v4;
goto LABEL_11;
}
if( v1 == 3 )
goto LABEL_10;
}
LABEL_11:
_InterlockedAnd64(&KiForceIdleLock, 0i64);
_enable();
return result;
}Referenced by:
PopDeepSleepClearDisengageReason