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