PopFxUpdateDeviceIdleTimer
VOID __stdcall PopFxUpdateDeviceIdleTimer(_POP_FX_DEVICE *FxDevice){
signed __int32 v2;
signed __int32 v3;
_m_prefetchw((char *)FxDevice + 32);
v2 = *((_DWORD *)FxDevice + 8);
do
{
v3 = v2;
v2 = _InterlockedCompareExchange((volatile signed __int32 *)FxDevice + 8, v2, v2);
}
while( v3 != v2 );
if( (v2 & 4) != 0 )
{
if( (unsigned __int8)KeCancelTimer((INT64)FxDevice + 368) )
{
_InterlockedAnd((volatile signed __int32 *)FxDevice + 8, 0xFFFFFFFB);
if( !PopFxScheduleDeviceIdleTimer((POP_FX_DEVICE *)FxDevice) )
{
PopDiagTraceFxDevicePowerRequirement(*((VOID **)FxDevice + 6), 0, 0);
(*((void(__fastcall **)(_QWORD))FxDevice + 18))(*((_QWORD *)FxDevice + 24));
_InterlockedOr((volatile signed __int32 *)FxDevice + 8, 0x40u);
if( _InterlockedExchangeAdd((volatile signed __int32 *)FxDevice + 10, 0xFFFFFFFF) != 1 )
PopFxAddLogEntry(*((_QWORD *)FxDevice + 6), 0, 17, 0i64);
}
}
}
}Referenced by:
PoFxSetDeviceIdleTimeout
PopFxProcessWork