KiAdjustThreadTimer

VOID __stdcall KiAdjustThreadTimer(_ETHREAD *Thread, _KPRCB *Prcb, INT64 a3, UINT64 a4){
  volatile signed __int32 *v4; 
  volatile unsigned int v6; 
  char v9; 
  _ULARGE_INTEGER DueTime; 
  __int64 v11; 
  UINT64 SpinCount; 

  v4 = (volatile signed __int32 *)Thread->Tcb.gap2E0;
  v6 = a4;
  v9 = 0;
  KiAcquireKobjectLockSafe(Thread->Tcb.gap2E0);
  if( Thread->Tcb.SuspendCount < 1 && (*(&Thread->Tcb.MiscFlags + 1) & 0x4000) == 0 )
  {
    if( !KiSuspendThread(&Thread->Tcb, Prcb) )
      goto LABEL_21;
    v9 = 1;
  }
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( Thread->Tcb.ThreadLock );
  }
  if( (Thread->Tcb._bf_0 & 0x60000) == 393216 && (Thread->Tcb.Timer.gap0[1] & 1) == 0 )
  {
    DueTime = Thread->Tcb.Timer.DueTime;
    if( a3 >= 0 )
    {
      if( a3 > 0 && (signed __int64)(DueTime.QuadPart - a3) < (__int64)DueTime.QuadPart )
        DueTime.QuadPart -= a3;
    }
    else
    {
      v11 = DueTime.QuadPart - a3;
      DueTime.QuadPart = 0i64;
      if( v11 <= 0 )
        DueTime.QuadPart = v11;
    }
    Thread->Tcb.Timer.DueTime = DueTime;
  }
  Thread->Tcb.ThreadTimerDelay = v6;
  KiReleaseThreadLockSafe((INT64)Thread);
  if( v9 )
    KiResumeThread(&Thread->Tcb, Prcb, 0);
LABEL_21:
  _InterlockedAnd(v4, 0xFFFFFF7F);
}

Referenced by:

KeAdjustTimerDelayProcess