KiExpireTimerTable
VOID __stdcall KiExpireTimerTable(
_KPRCB *Prcb,
_KTIMER_TABLE *TimerTable,
UINT64 TimerHand,
UINT64 HandCount,
UINT64 ExtraCount,
UINT64 ExpirationTime,
_KDPC_TRACKER_TABLE *DpcTracker){
int v7;
unsigned int v8;
int v9;
unsigned int v10;
int v11;
__int64 v12;
unsigned __int64 v13;
UINT64 v15;
char *v16;
_QWORD *v17;
_QWORD *v18;
UINT64 v19;
_KTIMER *v20;
char v21;
void *BugCheckParameter4;
unsigned __int64 v23;
char v24;
unsigned int v25;
unsigned int v27;
int v28;
int ExtraCounta;
_KDPC_TRACKER_TABLE *v30;
v7 = TimerHand;
v8 = TimerHand + HandCount - 1;
v9 = v8 + ExtraCount;
v27 = v8;
ExtraCounta = v8 + ExtraCount;
v10 = 0;
v11 = v7 - 1;
v28 = 0;
v12 = 0i64;
v13 = (unsigned __int64)(unsigned int)DpcTracker << 8;
v23 = v13;
v24 = -64;
while( 1 )
{
v15 = ExpirationTime;
v16 = (char *)TimerTable->TimerEntries + 32 * (unsigned __int8)++v11 + 32 * v13;
if( v10 <= v8 || *((_QWORD *)v16 + 3) <= ExpirationTime )
{
v17 = v16 + 8;
if( v17 != (_QWORD *)*v17 )
{
do
{
LODWORD(DpcTracker) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v16, 0i64) )
{
do
KeYieldProcessorEx((UINT64 *)&DpcTracker);
while( *(_QWORD *)v16 );
}
do
{
v18 = (_QWORD *)*v17;
if( v17 == (_QWORD *)*v17 )
goto LABEL_12;
v19 = *(v18 - 1);
v20 = (_KTIMER *)(v18 - 4);
if( v19 > v15 )
{
*((_QWORD *)v16 + 3) = v19;
LABEL_12:
_InterlockedAnd64((volatile signed __int64 *)v16, 0i64);
goto LABEL_13;
}
v21 = (v24 ^ v12) & 0x3F ^ v24 ^ v20->gap0[3];
v24 ^= (v24 ^ v12) & 0x3F;
v25 = 0;
HIBYTE(v25) = v21;
_InterlockedXor((volatile signed __int32 *)v20, v25);
BugCheckParameter4 = (void *)_InterlockedExchange64(
(volatile __int64 *)&TimerTable->TimerExpiry[v12],
(__int64)v20);
KiRemoveEntryTimer(TimerTable, v20, (unsigned __int8)v11);
v12 = (unsigned int)(v12 + 1);
if( BugCheckParameter4 )
KeBugCheckEx(0xC7u, (PVOID)8, (PVOID)1, v20, BugCheckParameter4);
v15 = ExpirationTime;
}
while( (_DWORD)v12 != 64 );
_InterlockedAnd64((volatile signed __int64 *)v16, 0i64);
KiProcessExpiredTimerList(Prcb, v30, TimerTable->TimerExpiry, 0x40ui64);
v12 = 0i64;
}
while( v17 != (_QWORD *)*v17 );
LABEL_13:
v8 = v27;
v9 = ExtraCounta;
}
v10 = ++v28;
}
if( v11 == v9 )
break;
v13 = v23;
}
if( (_DWORD)v12 )
KiProcessExpiredTimerList(Prcb, v30, TimerTable->TimerExpiry, (unsigned int)v12);
}Referenced by:
KiTimerExpiration