ExpTimerPause

VOID __fastcall ExpTimerPause(INT64 Timer, INT64 a2, UINT64 r8, CHAR a4){
  char v8; 
  char v9; 
  UINT64 v10; 
  UINT64 v11; 
  UINT64 v12; 
  int v13; 
  v12 = 0i64;
  v13 = 0;
  if( !a4 )
    KxAcquireSpinLock((UINT64 *)(Timer + 64));
  v8 = *(_BYTE *)(Timer + 304);
  if( (v8 & 2) == 0 )
  {
    *(_BYTE *)(Timer + 304) = v8 | 2;
    if( KeCancelTimerInternal(Timer, &v12, &v13, (unsigned int *)(Timer + 320)) )
    {
      v9 = v13;
      switch( v13 )
      {
        case 1:
          if( v12 <= r8 )
          {
            *(_QWORD *)(Timer + 312) = 0i64;
            break;
          }
          v11 = a2 + v12 - r8;
          goto LABEL_20;
        case 2:
          if( v12 <= r8 )
            v10 = 0i64;
          else
            v10 = r8 - v12;
          *(_QWORD *)(Timer + 312) = v10;
          break;
        case 3:
          v11 = v12;
LABEL_20:
          *(_QWORD *)(Timer + 312) = v11;
          break;
      }
    }
    else
    {
      v9 = 0;
    }
    *(_BYTE *)(Timer + 248) = v9;
  }
  if( !a4 )
    KxReleaseSpinLock((UINT64 *)(Timer + 64));
}

Referenced by:

ExWakeTimersPause
PspSetProcessFreezeStateCallback