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