KiExpireTimerTable

VOID __stdcall KiExpireTimerTable(
        _KPRCB *Prcb,
        _KTIMER_TABLE *TimerTable,
        UINT64 TimerHand,
        UINT64 HandCount,
        UINT64 ExtraCount,
        UINT64 ExpirationTime,
        _KDPC_TRACKER_TABLE *DpcTracker){
  int v7; 
  unsigned int v8; 
  int v9; 
  unsigned int v10; 
  int v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  UINT64 v15; 
  char *v16; 
  _QWORD *v17; 
  _QWORD *v18; 
  UINT64 v19; 
  _KTIMER *v20; 
  char v21; 
  void *BugCheckParameter4; 
  unsigned __int64 v23; 
  char v24; 
  unsigned int v25; 
  unsigned int v27; 
  int v28; 
  int ExtraCounta; 
  _KDPC_TRACKER_TABLE *v30; 

  v7 = TimerHand;
  v8 = TimerHand + HandCount - 1;
  v9 = v8 + ExtraCount;
  v27 = v8;
  ExtraCounta = v8 + ExtraCount;
  v10 = 0;
  v11 = v7 - 1;
  v28 = 0;
  v12 = 0i64;
  v13 = (unsigned __int64)(unsigned int)DpcTracker << 8;
  v23 = v13;
  v24 = -64;
  while( 1 )
  {
    v15 = ExpirationTime;
    v16 = (char *)TimerTable->TimerEntries + 32 * (unsigned __int8)++v11 + 32 * v13;
    if( v10 <= v8 || *((_QWORD *)v16 + 3) <= ExpirationTime )
    {
      v17 = v16 + 8;
      if( v17 != (_QWORD *)*v17 )
      {
        do
        {
          LODWORD(DpcTracker) = 0;
          while( _interlockedbittestandset64((volatile signed __int32 *)v16, 0i64) )
          {
            do
              KeYieldProcessorEx((UINT64 *)&DpcTracker);
            while( *(_QWORD *)v16 );
          }
          do
          {
            v18 = (_QWORD *)*v17;
            if( v17 == (_QWORD *)*v17 )
              goto LABEL_12;
            v19 = *(v18 - 1);
            v20 = (_KTIMER *)(v18 - 4);
            if( v19 > v15 )
            {
              *((_QWORD *)v16 + 3) = v19;
LABEL_12:
              _InterlockedAnd64((volatile signed __int64 *)v16, 0i64);
              goto LABEL_13;
            }
            v21 = (v24 ^ v12) & 0x3F ^ v24 ^ v20->gap0[3];
            v24 ^= (v24 ^ v12) & 0x3F;
            v25 = 0;
            HIBYTE(v25) = v21;
            _InterlockedXor((volatile signed __int32 *)v20, v25);
            BugCheckParameter4 = (void *)_InterlockedExchange64(
                                           (volatile __int64 *)&TimerTable->TimerExpiry[v12],
                                           (__int64)v20);
            KiRemoveEntryTimer(TimerTable, v20, (unsigned __int8)v11);
            v12 = (unsigned int)(v12 + 1);
            if( BugCheckParameter4 )
              KeBugCheckEx(0xC7u, (PVOID)8, (PVOID)1, v20, BugCheckParameter4);
            v15 = ExpirationTime;
          }
          while( (_DWORD)v12 != 64 );
          _InterlockedAnd64((volatile signed __int64 *)v16, 0i64);
          KiProcessExpiredTimerList(Prcb, v30, TimerTable->TimerExpiry, 0x40ui64);
          v12 = 0i64;
        }
        while( v17 != (_QWORD *)*v17 );
LABEL_13:
        v8 = v27;
        v9 = ExtraCounta;
      }
      v10 = ++v28;
    }
    if( v11 == v9 )
      break;
    v13 = v23;
  }
  if( (_DWORD)v12 )
    KiProcessExpiredTimerList(Prcb, v30, TimerTable->TimerExpiry, (unsigned int)v12);
}

Referenced by:

KiTimerExpiration