KiAdjustThreadTimer

VOID __fastcall KiAdjustThreadTimer(_ETHREAD *Thread, _KPRCB *Prcb, INT64 a3, INT64 a4){
  volatile signed __int32 *v4; 
  int v6; 
  char v9; 
  __int64 v10; 
  __int64 v11; 
  UINT64 SpinCount; 
  v4 = (volatile signed __int32 *)((char *)Thread + 736);
  v6 = a4;
  v9 = 0;
  KiAcquireKobjectLockSafe((char *)Thread + 736);
  if( *((char *)Thread + 644) < 1 && (*((_DWORD *)Thread + 30) & 0x4000) == 0 )
  {
    if( !KiSuspendThread((_KTHREAD *)Thread, Prcb) )
      goto LABEL_21;
    v9 = 1;
  }
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *((_QWORD *)Thread + 8) );
  }
  if( (*((_DWORD *)Thread + 29) & 0x60000) == 393216 && (*((_BYTE *)Thread + 257) & 1) == 0 )
  {
    v10 = *((_QWORD *)Thread + 35);
    if( a3 >= 0 )
    {
      if( a3 > 0 && v10 - a3 < v10 )
        v10 -= a3;
    }
    else
    {
      v11 = v10 - a3;
      v10 = 0i64;
      if( v11 <= 0 )
        v10 = v11;
    }
    *((_QWORD *)Thread + 35) = v10;
  }
  *((_DWORD *)Thread + 238) = v6;
  KiReleaseThreadLockSafe((INT64)Thread);
  if( v9 )
    KiResumeThread((_KTHREAD *)Thread, Prcb, 0);
LABEL_21:
  _InterlockedAnd(v4, 0xFFFFFF7F);
}

Referenced by:

KeAdjustTimerDelayProcess