KiAdjustTimerDueTimes
void __fastcall KiAdjustTimerDueTimes(__int64 a1, __int64 a2, __int64 a3){
__int64 v3;
unsigned int i;
unsigned __int64 v6;
unsigned int v7;
__int64 v8;
volatile signed __int64 *v9;
_QWORD *v10;
__int64 *v11;
_KTIMER *v12;
__int64 v13;
__int64 **v14;
__int64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
__int64 v18;
UINT64 v19;
_KDPC *v20;
UINT8 inserted;
_QWORD *v22;
char v23;
__int64 **v24;
__int64 ***v25;
UINT64 SpinCount;
volatile signed __int64 *v27;
__int64 *v28;
__int64 **v29;
__int128 v30;
__int64 v31;
UINT8 Late;
v29 = &v28;
v3 = a2;
Late = 0;
v28 = (__int64 *)&v28;
v27 = 0i64;
for( i = 0; i < 2; ++i )
{
v6 = (unsigned __int64)i << 13;
v7 = 0;
v8 = v6 + v3 + 512;
do
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v8, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)v8 );
}
v9 = (volatile signed __int64 *)v8;
v10 = *(_QWORD **)(v8 + 8);
v27 = (volatile signed __int64 *)v8;
if( v10 != (_QWORD *)(v8 + 8) )
{
do
{
v22 = v10 - 4;
v23 = *((_BYTE *)v10 - 31);
v10 = (_QWORD *)*v10;
if( (v23 & 1) != *(_BYTE *)a3 && (!*(_BYTE *)a3 || (v23 & 2) == 0) )
{
KiRemoveEntryTimer((_KTIMER_TABLE *)a2, (_KTIMER *)v22, v7);
v24 = v29;
v25 = (__int64 ***)(v22 + 4);
if( *v29 != (__int64 *)&v28 )
goto LABEL_38;
v22[5] = v29;
*v25 = &v28;
*v24 = (__int64 *)v25;
v29 = (__int64 **)(v22 + 4);
}
}
while( v10 != (_QWORD *)(v8 + 8) );
v9 = v27;
}
_InterlockedAnd64(v9, 0i64);
++v7;
v8 += 32i64;
}
while( v7 < 0x100 );
v3 = a2;
}
v11 = v28;
if( v28 != (__int64 *)&v28 )
{
while( 1 )
{
v12 = (_KTIMER *)(v11 - 4);
v13 = *v11;
v14 = (__int64 **)v11[1];
if( *(__int64 **)(*v11 + 8) != v11 || *v14 != v11 )
break;
*v14 = (__int64 *)v13;
*(_QWORD *)(v13 + 8) = v14;
v15 = *(_QWORD *)(a3 + 24);
v16 = *((_QWORD *)v12 + 3);
v17 = v16 - v15;
if( v15 >= 0 )
{
if( v17 > v16 )
v17 = 0i64;
}
else if( v17 < v16 )
{
v17 = -1i64;
}
v18 = __ROL8__(KiWaitNever ^ *((_QWORD *)v12 + 6), KiWaitNever);
v19 = (unsigned __int8)(v17 >> 18);
v30 = 0i64;
v20 = (_KDPC *)(KiWaitAlways ^ _byteswap_uint64((unsigned __int64)v12 ^ v18));
*(_DWORD *)v12 |= 0x80u;
*((_QWORD *)v12 + 3) = v17;
v31 = 0i64;
LODWORD(v30) = *(_DWORD *)v12;
BYTE2(v30) = v17 >> 18;
*(_DWORD *)v12 = v30;
if( *(_BYTE *)(a3 + 32) )
inserted = KiInsertTimerTable((_KPRCB *)a1, v12, v20, v19, &Late);
else
inserted = KiInsertTimerTable((_KPRCB *)a1, v12, v20, v19, 0i64);
if( inserted )
_InterlockedAnd((volatile signed __int32 *)v12, 0xFFFFFF7F);
else
KiTimerWaitTest((_KPRCB *)a1, v12, 0i64);
v11 = v28;
if( v28 == (__int64 *)&v28 )
goto LABEL_27;
}
LABEL_38:
__fastfail(3u);
}
LABEL_27:
if( *(_BYTE *)(a1 + 33) || *(_BYTE *)(a3 + 32) )
KiAdjustTimer2DueTimes(a3);
}Referenced by:
KiAdjustTimersAfterDripsExit
KiSetSystemTimeDpc