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