KeClearForceIdle
VOID __stdcall KeClearForceIdle(){
INT64 v0;
EVENT_DESCRIPTOR *v1;
UINT64 SpinCount;
_disable();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&KiForceIdleLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( KiForceIdleLock );
}
if( KiForceIdleDisabled )
goto LABEL_16;
switch( (_DWORD)KiForceIdleState )
{
case 1:
KiSetForceIdleState(0i64, v0, v1);
KeRemoveQueueDpcEx((_KDPC *)&KiForceIdleStartDpc, 0);
goto LABEL_15;
case 2:
KiSetForceIdleState(0i64, v0, v1);
goto LABEL_15;
case 3:
if( !KiForceIdleStartTime )
break;
LABEL_15:
KiForceIdleStartTime = 0i64;
break;
case 4:
KiResetForceIdle(3i64, 1);
break;
}
LABEL_16:
_InterlockedAnd64(&KiForceIdleLock, 0i64);
_enable();
}Referenced by:
PopDeepSleepSetDisengageReason