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