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