KiTimerExpiration
VOID __stdcall KiTimerExpiration(_KPRCB *Prcb, UINT64 StartHand, UINT64 CurrentTime, _KDPC_TRACKER_TABLE *DpcTracker){
unsigned int v4;
__int64 v7;
unsigned __int64 v8;
_KTIMER_TABLE *v9;
int v10;
UINT64 ExpirationTime;
unsigned int v12;
unsigned int v13;
int v14;
unsigned int PeriodicBias;
UINT64 ExtraCount;
_KDPC_TRACKER_TABLE *DpcTrackera;
char v18;
v4 = StartHand;
v18 = (char)DpcTracker;
v9 = KiSelectActiveTimerTable(Prcb, 1u);
if( v9 )
{
v10 = *(_DWORD *)(v7 + 35584);
Prcb->TimerExpirationTraceCount = ((_BYTE)v10 + 1) & 0xF;
Prcb->TimerExpirationTrace[v10].InterruptTime = v8;
Prcb->TimerExpirationTrace[v10].PerformanceCounter.QuadPart = KeQueryPerformanceCounter(0i64);
ExpirationTime = 0i64;
v12 = (CurrentTime >> 18) - v4 + 1;
if( v12 > 0x100 )
ExpirationTime = ((CurrentTime >> 18) - v12 + 1) << 18;
do
{
if( v12 <= 0x100 )
{
v13 = v12;
v14 = 256 - v12;
ExpirationTime = CurrentTime;
if( 256 - v12 > 0x18 )
v14 = 24;
}
else
{
ExpirationTime += 0x4000000i64;
v13 = 256;
v14 = 0;
}
LODWORD(DpcTrackera) = 0;
LODWORD(ExtraCount) = v14;
KiExpireTimerTable(Prcb, v9, v4, v13, ExtraCount, ExpirationTime, DpcTrackera);
if( v18 )
{
LODWORD(DpcTrackera) = 1;
LODWORD(ExtraCount) = v14;
KiExpireTimerTable(Prcb, v9, v4, v13, ExtraCount, ExpirationTime, DpcTrackera);
}
v4 += v13;
v12 -= v13;
}
while( v12 );
if( (Prcb->DpcRequestSummary & 8) == 0 )
{
Prcb->PeriodicCount = 0;
PeriodicBias = Prcb->PeriodicBias;
if( PeriodicBias >= KeTimeIncrement )
Prcb->PeriodicBias = PeriodicBias - KeTimeIncrement;
else
Prcb->PeriodicBias = 0;
}
}
}Referenced by:
KiTimerExpirationDpc