KeClearForceIdle
VOID __stdcall KeClearForceIdle(){
INT64 v0;
NPTEXTMETRIC *v1;
UINT64 SpinCount;
_disable();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((_DWORD *)&KiSwapEvent + 42, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(&KiSwapEvent + 21) );
}
if( KiForceIdleDisabled )
goto LABEL_16;
switch( (_DWORD)KiForceIdleState )
{
case 1:
KiSetForceIdleState(0i64, v0, v1);
KeRemoveQueueDpcEx((_KDPC *)&KiSwapEvent + 3, 0i64);
goto LABEL_15;
case 2:
KiSetForceIdleState(0i64, v0, v1);
goto LABEL_15;
case 3:
if( !*(&KiSwapEvent + 20) )
break;
LABEL_15:
*(&KiSwapEvent + 20) = 0i64;
break;
case 4:
KiResetForceIdle(3i64, 1);
break;
}
LABEL_16:
_InterlockedAnd64((_QWORD *)&KiSwapEvent + 21, 0i64);
_enable();
}Referenced by:
PopDeepSleepSetDisengageReason