PspApplyTimerDelayProcess
__int64 __fastcall PspApplyTimerDelayProcess(_EPROCESS *Process, _DWORD *a2){
_ETHREAD *CurrentThread;
unsigned int v3;
unsigned __int64 v5;
unsigned __int8 v6;
unsigned __int64 All;
signed __int64 v8;
signed __int64 v9;
__int64 v10;
signed __int64 v11;
signed __int64 v12;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = 0;
--CurrentThread->Tcb.SpecialApcDisable;
_interlockedbittestandset(&Process->Pcb.ProcessFlags, 4u);
v5 = 0i64;
if( a2 )
{
v6 = 0;
v5 = (*a2 / 0x2710u) & 0x3FFFFFFF | ((unsigned __int64)((a2[1] / 0x2710u) & 0x3FFFFFFF) << 30);
}
else
{
v6 = 1;
}
All = Process->ProcessTimerDelay.All;
if( v6 )
{
if( ((All | (All >> 30)) & 0x3FFFFFFF) == 0 )
goto LABEL_22;
v5 = All & 0xFFFFFFFFFFFFFFFi64;
}
else if( (((unsigned int)v5 ^ (unsigned int)All) & 0x3FFFFFFF) == 0
&& (All & 0xFFFFFFFC0000000i64) == (v5 & 0xFFFFFFFFC0000000ui64) )
{
goto LABEL_22;
}
v8 = ((unsigned __int64)v6 << 61) | 0x8000000000000000ui64 | v5;
v10 = All & 0x7FFFFFFFFFFFFFFFi64;
v9 = _InterlockedCompareExchange64(&Process->ProcessTimerDelay._bf_0, v8, All & 0x7FFFFFFFFFFFFFFFi64);
if( v10 != v9 )
{
do
{
v11 = v9;
if( v9 < 0 )
{
if( v6 )
{
v8 = v9 & 0xFFFFFFFFFFFFFFFi64 | v8 & 0xF000000000000000ui64;
}
else if( (v9 & 0x2000000000000000i64) == 0 )
{
goto LABEL_22;
}
v8 |= 0x4000000000000000ui64;
}
else
{
v8 &= ~0x4000000000000000ui64;
if( v6 )
v8 ^= (v9 ^ v8) & 0xFFFFFFFFFFFFFFFi64;
}
v9 = _InterlockedCompareExchange64(&Process->ProcessTimerDelay._bf_0, v8, v9);
}
while( v9 != v11 );
}
if( (v8 & 0x4000000000000000i64) == 0 )
{
do
{
v12 = v8;
PspSetProcessTimerDelayForKTimers((INT64)Process);
v3 = PspSetProcessTimerDelayForWin32(Process);
v8 = _InterlockedCompareExchange64(&Process->ProcessTimerDelay._bf_0, v8 & 0x1FFFFFFFFFFFFFFFi64, v8);
}
while( v12 != v8 );
}
LABEL_22:
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return v3;
}Referenced by:
PspTimerDelayProcess
PspTimerDelayWorkerRoutine