KiExpireTimerTable
VOID __fastcall KiExpireTimerTable(
struct KPRCB *a1,
INT64 a2,
INT64 a3,
INT64 a4,
INT64 a5,
UINT64 a6,
UINT64 SpinCount,
INT64 *a8){
int v8;
unsigned int v9;
int v10;
unsigned int v11;
int v12;
__int64 v13;
unsigned __int64 v14;
UINT64 v16;
INT64 v17;
_QWORD *v18;
_QWORD *v19;
UINT64 v20;
ULONG_PTR v21;
char v22;
ULONG_PTR BugCheckParameter4;
unsigned __int64 v24;
char v25;
unsigned int v26;
unsigned int v28;
int v29;
int v30;
v8 = a3;
v9 = a3 + a4 - 1;
v10 = v9 + a5;
v28 = v9;
v30 = v9 + a5;
v11 = 0;
v12 = v8 - 1;
v29 = 0;
v13 = 0i64;
v14 = (unsigned __int64)(unsigned int)SpinCount << 8;
v24 = v14;
v25 = -64;
while( 1 )
{
v16 = a6;
v17 = a2 + 32 * ((unsigned __int8)++v12 + v14 + 16);
if( v11 <= v9 || *(_QWORD *)(v17 + 24) <= a6 )
{
v18 = (_QWORD *)(v17 + 8);
if( v18 != (_QWORD *)*v18 )
{
do
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v17, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)v17 );
}
do
{
v19 = (_QWORD *)*v18;
if( v18 == (_QWORD *)*v18 )
goto LABEL_12;
v20 = *(v19 - 1);
v21 = (ULONG_PTR)(v19 - 4);
if( v20 > v16 )
{
*(_QWORD *)(v17 + 24) = v20;
LABEL_12:
_InterlockedAnd64((volatile signed __int64 *)v17, 0i64);
goto LABEL_13;
}
v22 = (v25 ^ v13) & 0x3F ^ v25 ^ *(_BYTE *)(v21 + 3);
v25 ^= (v25 ^ v13) & 0x3F;
v26 = 0;
HIBYTE(v26) = v22;
_InterlockedXor((volatile signed __int32 *)v21, v26);
BugCheckParameter4 = _InterlockedExchange64((volatile __int64 *)(a2 + 8 * v13), v21);
KiRemoveEntryTimer((_KTIMER_TABLE *)a2, (_KTIMER *)v21, (unsigned __int8)v12);
v13 = (unsigned int)(v13 + 1);
if( BugCheckParameter4 )
KeBugCheckEx(0xC7u, 8ui64, 1ui64, v21, BugCheckParameter4);
v16 = a6;
}
while( (_DWORD)v13 != 64 );
_InterlockedAnd64((volatile signed __int64 *)v17, 0i64);
KiProcessExpiredTimerList(a1, a8, a2, 0x40ui64);
v13 = 0i64;
}
while( v18 != (_QWORD *)*v18 );
LABEL_13:
v9 = v28;
v10 = v30;
}
v11 = ++v29;
}
if( v12 == v10 )
break;
v14 = v24;
}
if( (_DWORD)v13 )
KiProcessExpiredTimerList(a1, a8, a2, (unsigned int)v13);
}Referenced by:
KiTimerExpiration