KeSetForceIdle
VOID __stdcall KeSetForceIdle(){
int v0;
__int64 v1;
INT64 v2;
NPTEXTMETRIC *v3;
__int64 v4;
UINT64 SpinCount;
INT64 CurrentQpc;
CurrentQpc = 0i64;
_disable();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((_DWORD *)&KiSwapEvent + 42, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(&KiSwapEvent + 21) );
}
if( !KiForceIdleDisabled )
{
v0 = KiForceIdleState;
LODWORD(v1) = RtlGetInterruptTimePrecise(&CurrentQpc);
v4 = v1 + 10000000i64 * (unsigned int)KiForceIdleGracePeriodInSec;
if( !v0 )
{
KiSetForceIdleState(2i64, v2, v3);
LABEL_10:
*(&KiSwapEvent + 20) = v4;
goto LABEL_11;
}
if( v0 == 3 )
goto LABEL_10;
}
LABEL_11:
_InterlockedAnd64((_QWORD *)&KiSwapEvent + 21, 0i64);
_enable();
}Referenced by:
PopDeepSleepClearDisengageReason