ExpTimerPause

VOID __stdcall ExpTimerPause(_ETIMER *Timer, UINT64 SystemTime, UINT64 InterruptTime){
  char v3; 
  char v4; 
  char CoalescingWindow; 
  char v9; 
  char v10; 
  UINT64 v11; 
  UINT64 v12; 
  _KDUE_TIME_TYPE *v13; 
  UINT64 *v14; 
  UINT64 DueTime; 
  INT64 a3; 

  DueTime = 0i64;
  v4 = v3;
  LODWORD(a3) = 0;
  if( !v3 )
    KxAcquireSpinLock(&Timer->Lock);
  CoalescingWindow = Timer->CoalescingWindow;
  if( (CoalescingWindow & 2) == 0 )
  {
    LOBYTE(Timer->CoalescingWindow) = CoalescingWindow | 2;
    KeCancelTimerInternal((INT64)Timer, &DueTime, (INT64)&a3, (INT64)&Timer[1].KeTimer.gap0[8], v13, v14);
    if( v9 )
    {
      v10 = a3;
      switch( (_DWORD)a3 )
      {
        case 1:
          if( DueTime <= InterruptTime )
          {
            *(_QWORD *)Timer[1].KeTimer.gap0 = 0i64;
            break;
          }
          v12 = SystemTime + DueTime - InterruptTime;
          goto LABEL_20;
        case 2:
          if( DueTime <= InterruptTime )
            v11 = 0i64;
          else
            v11 = InterruptTime - DueTime;
          *(_QWORD *)Timer[1].KeTimer.gap0 = v11;
          break;
        case 3:
          v12 = DueTime;
LABEL_20:
          *(_QWORD *)Timer[1].KeTimer.gap0 = v12;
          break;
      }
    }
    else
    {
      v10 = 0;
    }
    LOBYTE(Timer->WakeReason) = v10;
  }
  if( !v4 )
    KxReleaseSpinLock(&Timer->Lock);
}

Referenced by:

ExWakeTimersPause
PspSetProcessFreezeStateCallback