PopFxScheduleDeviceIdleTimer

UINT8 __stdcall PopFxScheduleDeviceIdleTimer(POP_FX_DEVICE *FxDevice){
  UINT8 v2; 
  ULONGLONG v3; 
  ULONGLONG v4; 
  unsigned int v5; 
  ULONGLONG pullResult; 

  v2 = 0;
  _m_prefetchw(FxDevice + 8);
  if( (_InterlockedOr(FxDevice + 8, 0) & 8) == 0 )
  {
    v3 = *((_QWORD *)FxDevice + 63);
    v4 = v3 + *((_QWORD *)FxDevice + 62);
    if( v4 >= v3 )
    {
      pullResult = v4;
      if( *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart < v4
        && RtlULongLongSub(v4, *(ULONGLONG *)&KUSER_SHARED_DATA.InterruptTime.LowPart, &pullResult) >= 0 )
      {
        v5 = -1;
        if( pullResult / 0x186A0 <= 0xFFFFFFFF )
          v5 = pullResult / 0x186A0;
        KeSetCoalescableTimer((INT64)(FxDevice + 92), -(__int64)pullResult, 0i64, v5, (INT64)(FxDevice + 108));
        _InterlockedOr(FxDevice + 8, 4u);
        return 1;
      }
    }
  }
  return v2;
}

Referenced by:

PopFxProcessWork
PopFxUpdateDeviceIdleTimer