PopFxUpdateDeviceIdleTimer

void __fastcall PopFxUpdateDeviceIdleTimer(__int64 a1){
  signed __int32 v2; 
  signed __int32 v3; 
  _m_prefetchw((const void *)(a1 + 32));
  v2 = *(_DWORD *)(a1 + 32);
  do
  {
    v3 = v2;
    v2 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 32), v2, v2);
  }
  while( v3 != v2 );
  if( (v2 & 4) != 0 )
  {
    if( KeCancelTimer((PKTIMER)(a1 + 368)) )
    {
      _InterlockedAnd((volatile signed __int32 *)(a1 + 32), 0xFFFFFFFB);
      if( !PopFxScheduleDeviceIdleTimer(a1) )
      {
        PopDiagTraceFxDevicePowerRequirement(*(PVOID *)(a1 + 48), 0, 0);
        (*(void(__fastcall **)(_QWORD))(a1 + 144))(*(_QWORD *)(a1 + 192));
        _InterlockedOr((volatile signed __int32 *)(a1 + 32), 0x40u);
        if( _InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 40), 0xFFFFFFFF) != 1 )
          PopFxAddLogEntry(*(_QWORD *)(a1 + 48), 0, 17, 0i64);
      }
    }
  }
}

Referenced by:

PoFxSetDeviceIdleTimeout
PopFxProcessWork