ExpTimerAdjust
INT64 __stdcall ExpTimerAdjust(PKTIMER Timer, INT64 a2){
__int64 v2;
__int64 v3;
ULONG v5;
__int64 v6;
__int64 v7;
UINT8 v8;
__int64 v9;
ULONG v10;
int v11;
ULONG v12;
unsigned int v13;
ULONG v14;
ULONG v15;
char v16;
INT64 result;
__int64 v18[9];
int v19;
unsigned int v20;
__int64 v21;
v20 = a2;
v5 = 0;
v18[0] = 0i64;
v19 = 0;
v6 = v3;
v7 = v2;
KxAcquireSpinLock((UINT64 *)Timer + 8);
v8 = KeCancelTimerInternal((__int64)Timer, v18, &v19, (unsigned int *)Timer + 80);
if( v8 )
{
v9 = 0i64;
if( v19 == 1 )
{
v9 = v6 + v7 + v18[0] - v21;
if( v9 < 0 )
v9 = v6;
}
else if( (unsigned int)(v19 - 2) <= 1 )
{
v9 = v21 - v18[0] - v7;
if( v9 > 0 )
{
v9 = -1i64;
if( v7 > 0 )
v9 = v21 - v18[0];
}
}
v10 = *((_DWORD *)Timer + 60);
v11 = *((_DWORD *)Timer + 61);
if( v10 )
{
v12 = v10 - v11;
if( !v11 )
v12 = *((_DWORD *)Timer + 60);
v10 = v12;
v13 = v20 / 0x2710;
v14 = v12 + v20 / 0x2710;
if( v14 >= v10 )
{
v10 = v14;
*((_DWORD *)Timer + 60) = v14;
*((_DWORD *)Timer + 61) = v13;
}
}
v15 = *((_DWORD *)Timer + 80);
v16 = *((_BYTE *)Timer + 304) & 1;
*((_QWORD *)Timer + 39) = v9;
if( !v16 )
v5 = v10;
KeSetCoalescableTimer(
Timer,
(LARGE_INTEGER)v9,
v5,
v15,
(PKDPC)(((unsigned __int64)Timer + 160) & -(__int64)(v16 != 0)));
}
KxReleaseSpinLock((UINT64 *)Timer + 8);
LOBYTE(result) = v8;
return result;
}Referenced by:
PspSetProcessTimerDelayForKTimers