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