KiAdjustTimerDueTimes
VOID __stdcall KiAdjustTimerDueTimes(_KPRCB *Prcb, _KTIMER_TABLE *TimerTable, _KI_TIME_ADJUST_CONTEXT *AdjustContext){
_KTIMER_TABLE *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 QuadPart;
unsigned __int64 v17;
__int64 v18;
UINT64 v19;
_KDPC *v20;
UINT8 inserted;
_KTIMER *v22;
char v23;
__int64 **v24;
__int64 *p_TimerListEntry;
UINT64 SpinCount;
volatile signed __int64 *v27;
__int64 *v28;
__int64 **v29;
__int128 v30;
__int64 v31;
UINT8 Late;
v29 = &v28;
v3 = TimerTable;
Late = 0;
v28 = (__int64 *)&v28;
v27 = 0i64;
for( i = 0; i < 2; ++i )
{
v6 = (unsigned __int64)i << 13;
v7 = 0;
v8 = (__int64)v3->TimerEntries + v6;
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 = (_KTIMER *)(v10 - 4);
v23 = *((_BYTE *)v10 - 31);
v10 = (_QWORD *)*v10;
if( (v23 & 1) != *(_BYTE *)AdjustContext && (!*(_BYTE *)AdjustContext || (v23 & 2) == 0) )
{
KiRemoveEntryTimer(TimerTable, v22, v7);
v24 = v29;
p_TimerListEntry = (__int64 *)&v22->TimerListEntry;
if( *v29 != (__int64 *)&v28 )
goto LABEL_38;
v22->TimerListEntry.Blink = (_LIST_ENTRY *)v29;
*p_TimerListEntry = (__int64)&v28;
*v24 = p_TimerListEntry;
v29 = (__int64 **)&v22->TimerListEntry;
}
}
while( v10 != (_QWORD *)(v8 + 8) );
v9 = v27;
}
_InterlockedAnd64(v9, 0i64);
++v7;
v8 += 32i64;
}
while( v7 < 0x100 );
v3 = TimerTable;
}
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 *)AdjustContext + 3);
QuadPart = v12->DueTime.QuadPart;
v17 = QuadPart - v15;
if( v15 >= 0 )
{
if( v17 > QuadPart )
v17 = 0i64;
}
else if( v17 < QuadPart )
{
v17 = -1i64;
}
v18 = __ROL8__(KiWaitNever ^ (__int64)v12->Dpc, KiWaitNever);
v19 = (unsigned __int8)(v17 >> 18);
v30 = 0i64;
v20 = (_KDPC *)(KiWaitAlways ^ _byteswap_uint64((unsigned __int64)v12 ^ v18));
*(_DWORD *)v12->gap0 |= 0x80u;
v12->DueTime.QuadPart = v17;
v31 = 0i64;
LODWORD(v30) = *(_DWORD *)v12->gap0;
BYTE2(v30) = v17 >> 18;
*(_DWORD *)v12->gap0 = v30;
if( *((_BYTE *)AdjustContext + 32) )
inserted = KiInsertTimerTable(Prcb, v12, v20, v19, &Late);
else
inserted = KiInsertTimerTable(Prcb, v12, v20, v19, 0i64);
if( inserted )
_InterlockedAnd((volatile signed __int32 *)v12, 0xFFFFFF7F);
else
KiTimerWaitTest(Prcb, v12, 0i64);
v11 = v28;
if( v28 == (__int64 *)&v28 )
goto LABEL_27;
}
LABEL_38:
__fastfail(3u);
}
LABEL_27:
if( Prcb->ClockOwner || *((_BYTE *)AdjustContext + 32) )
KiAdjustTimer2DueTimes(AdjustContext);
}Referenced by:
KiAdjustTimersAfterDripsExit
KiSetSystemTimeDpc