KiTimer2Expiration
VOID __stdcall KiTimer2Expiration(
_KPRCB *Prcb,
UINT64 CurrentTime,
UINT8 ExpireNonHrTimers,
_KDPC_TRACKER_TABLE *DpcTracker){
char v4;
__int64 v8;
__int64 v9;
unsigned __int64 v10;
__int64 v11;
__int64 v12;
__int64 v13;
__int64 ***v14;
__int64 *v15;
_KDPC_TRACKER_TABLE *v16;
char v17;
_KTIMER2 *v18;
char v19;
signed __int32 v20;
signed __int32 v21;
__int64 **v22;
__int64 v23;
UINT64 v24;
_KTIMER2 *v25;
UINT64 v26;
signed __int32 v27;
char WasLate[8];
__int64 *v29;
__int64 **v30;
_KDPC_TRACKER_TABLE *DpcTrackera;
__int128 v32;
_KDPC_TRACKER_TABLE *v33;
DpcTrackera = v33;
v4 = (char)DpcTracker;
WasLate[0] = 0;
v32 = 0i64;
if( CurrentTime < KiNextTimer2DueTime )
return;
v30 = &v29;
v29 = (__int64 *)&v29;
KxAcquireSpinLock(&KiTimer2CollectionLock);
v8 = 0i64;
v9 = 5i64;
if( !v4 )
{
v8 = 1i64;
v9 = 2i64;
if( ExpireNonHrTimers )
v9 = 3i64;
}
v10 = (unsigned __int64)&KiTimer2Collections[3 * v8];
do
{
v11 = *(_QWORD *)(v10 + 8);
if( (v11 & 1) != 0 )
{
if( v11 == 1 )
goto LABEL_10;
v12 = v11 ^ (v10 | 1);
}
else
{
v12 = *(_QWORD *)(v10 + 8);
}
if( v12 )
{
v13 = 0i64;
if( v8 >= 2 )
v13 = 24i64;
do
{
v14 = (__int64 ***)(v12 - v13);
if( CurrentTime < (unsigned __int64)v14[6] )
break;
KiRemoveTimer2((_KTIMER2 *)(v14 - 3));
v20 = *((_DWORD *)v14 - 6);
v21 = _InterlockedCompareExchange((volatile signed __int32 *)v14 - 6, v20 & 0xFFFFF0FF | 0x200, v20);
if( v20 != v21 )
{
do
{
v27 = v21;
v21 = _InterlockedCompareExchange((volatile signed __int32 *)v14 - 6, v21 & 0xFFFFF0FF | 0x200, v21);
}
while( v27 != v21 );
}
v22 = v30;
if( *v30 != (__int64 *)&v29 )
__fastfail(3u);
v14[1] = v30;
*v14 = &v29;
*v22 = (__int64 *)v14;
v23 = *(_QWORD *)(v10 + 8);
v30 = (__int64 **)v14;
if( (v23 & 1) != 0 )
{
if( v23 == 1 )
break;
v12 = v23 ^ (v10 | 1);
}
else
{
v12 = v23;
}
}
while( v12 );
}
LABEL_10:
++v8;
v10 += 24i64;
}
while( v8 < v9 );
KxReleaseSpinLock(&KiTimer2CollectionLock);
v15 = v29;
if( v29 == (__int64 *)&v29 )
goto LABEL_20;
v16 = DpcTrackera;
v17 = 0;
while( 2 )
{
v18 = (_KTIMER2 *)(v15 - 3);
v15 = (__int64 *)*v15;
KiAcquireKobjectLockSafe(v18);
v19 = v18->gap0[1];
if( (v19 & 2) != 0 )
{
if( (v18->TypeFlags & 2) != 0 )
v17 = 1;
goto LABEL_16;
}
v24 = 0i64;
v25 = v18;
if( (v19 & 8) != 0 )
{
if( KiInsertTimer2(v18, 0, (UINT8 *)WasLate) )
{
v26 = 0i64;
v25 = v18;
v24 = 1i64;
goto LABEL_40;
}
if( (v18->TypeFlags & 2) != 0 )
v17 = 1;
LABEL_16:
KiExpireTimer2(v18, Prcb, CurrentTime, v16);
}
else
{
v26 = 4i64;
LABEL_40:
KiUpdateTimer2Flags(v25, v24, v26);
}
if( v15 != (__int64 *)&v29 )
continue;
break;
}
if( v17 )
KiCheckAndRearmForceIdle();
LABEL_20:
if( Prcb->DeferredReadyListHead.Next )
KiProcessThreadWaitList(Prcb, AdjustUnwait, 0i64, 2ui64);
if( KiShouldActivateHRTimerClock(*(UINT64 *)&KUSER_SHARED_DATA.InterruptTime.LowPart, DueTime) )
KiSendClockInterruptToClockOwner();
}Referenced by:
KiRetireDpcList
KiTimerExpirationDpc