KiComputeDueTime
UINT64 __stdcall KiComputeDueTime(_KTIMER *Timer, _LARGE_INTEGER Interval, UINT8 ControlFlags, UINT64 *Hand){
__int64 v5;
LONGLONG v6;
int v7;
UINT64 result;
int v9;
v9 = *(_DWORD *)Timer;
BYTE1(v9) = ControlFlags;
if( Interval.HighPart >= 0 )
{
BYTE1(v9) = ControlFlags | 1;
Interval.QuadPart = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart - Interval.QuadPart;
if( Interval.HighPart >= 0 )
{
*(_DWORD *)Timer = v9;
result = 0i64;
*((_QWORD *)Timer + 3) = 0i64;
return result;
}
ControlFlags |= 1u;
}
v5 = 0i64;
if( (ControlFlags & 0xFC) != 0 )
v5 = (unsigned __int8)(ControlFlags & 0xFC) << 16;
v6 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - Interval.QuadPart;
*((_QWORD *)Timer + 3) = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - Interval.QuadPart;
HIBYTE(v9) |= 0x40u;
v7 = (unsigned __int8)((unsigned __int64)(v5 + v6) >> 18);
BYTE2(v9) = (unsigned __int64)(v5 + v6) >> 18;
*(_DWORD *)Timer = v9;
result = 1i64;
*(_DWORD *)Hand = v7;
return result;
}Referenced by:
KeSetTimerEx
KiCommitThreadWait
KiResumeThread
KiSetTimerEx