KiTimer2Expiration

VOID __stdcall KiTimer2Expiration(
        _KPRCB *Prcb,
        UINT64 CurrentTime,
        UINT8 ExpireNonHrTimers,
        _KDPC_TRACKER_TABLE *DpcTracker){
  char v4; 
  __int64 v8; 
  __int64 v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 ***v14; 
  __int64 *v15; 
  _KDPC_TRACKER_TABLE *v16; 
  char v17; 
  _KTIMER2 *v18; 
  char v19; 
  signed __int32 v20; 
  signed __int32 v21; 
  __int64 **v22; 
  __int64 v23; 
  UINT64 v24; 
  _KTIMER2 *v25; 
  UINT64 v26; 
  signed __int32 v27; 
  char WasLate[8]; 
  __int64 *v29; 
  __int64 **v30; 
  _KDPC_TRACKER_TABLE *DpcTrackera; 
  __int128 v32; 
  _KDPC_TRACKER_TABLE *v33; 

  DpcTrackera = v33;
  v4 = (char)DpcTracker;
  WasLate[0] = 0;
  v32 = 0i64;
  if( CurrentTime < KiNextTimer2DueTime )
    return;
  v30 = &v29;
  v29 = (__int64 *)&v29;
  KxAcquireSpinLock(&KiTimer2CollectionLock);
  v8 = 0i64;
  v9 = 5i64;
  if( !v4 )
  {
    v8 = 1i64;
    v9 = 2i64;
    if( ExpireNonHrTimers )
      v9 = 3i64;
  }
  v10 = (unsigned __int64)&KiTimer2Collections[3 * v8];
  do
  {
    v11 = *(_QWORD *)(v10 + 8);
    if( (v11 & 1) != 0 )
    {
      if( v11 == 1 )
        goto LABEL_10;
      v12 = v11 ^ (v10 | 1);
    }
    else
    {
      v12 = *(_QWORD *)(v10 + 8);
    }
    if( v12 )
    {
      v13 = 0i64;
      if( v8 >= 2 )
        v13 = 24i64;
      do
      {
        v14 = (__int64 ***)(v12 - v13);
        if( CurrentTime < (unsigned __int64)v14[6] )
          break;
        KiRemoveTimer2((_KTIMER2 *)(v14 - 3));
        v20 = *((_DWORD *)v14 - 6);
        v21 = _InterlockedCompareExchange((volatile signed __int32 *)v14 - 6, v20 & 0xFFFFF0FF | 0x200, v20);
        if( v20 != v21 )
        {
          do
          {
            v27 = v21;
            v21 = _InterlockedCompareExchange((volatile signed __int32 *)v14 - 6, v21 & 0xFFFFF0FF | 0x200, v21);
          }
          while( v27 != v21 );
        }
        v22 = v30;
        if( *v30 != (__int64 *)&v29 )
          __fastfail(3u);
        v14[1] = v30;
        *v14 = &v29;
        *v22 = (__int64 *)v14;
        v23 = *(_QWORD *)(v10 + 8);
        v30 = (__int64 **)v14;
        if( (v23 & 1) != 0 )
        {
          if( v23 == 1 )
            break;
          v12 = v23 ^ (v10 | 1);
        }
        else
        {
          v12 = v23;
        }
      }
      while( v12 );
    }
LABEL_10:
    ++v8;
    v10 += 24i64;
  }
  while( v8 < v9 );
  KxReleaseSpinLock(&KiTimer2CollectionLock);
  v15 = v29;
  if( v29 == (__int64 *)&v29 )
    goto LABEL_20;
  v16 = DpcTrackera;
  v17 = 0;
  while( 2 )
  {
    v18 = (_KTIMER2 *)(v15 - 3);
    v15 = (__int64 *)*v15;
    KiAcquireKobjectLockSafe(v18);
    v19 = v18->gap0[1];
    if( (v19 & 2) != 0 )
    {
      if( (v18->TypeFlags & 2) != 0 )
        v17 = 1;
      goto LABEL_16;
    }
    v24 = 0i64;
    v25 = v18;
    if( (v19 & 8) != 0 )
    {
      if( KiInsertTimer2(v18, 0, (UINT8 *)WasLate) )
      {
        v26 = 0i64;
        v25 = v18;
        v24 = 1i64;
        goto LABEL_40;
      }
      if( (v18->TypeFlags & 2) != 0 )
        v17 = 1;
LABEL_16:
      KiExpireTimer2(v18, Prcb, CurrentTime, v16);
    }
    else
    {
      v26 = 4i64;
LABEL_40:
      KiUpdateTimer2Flags(v25, v24, v26);
    }
    if( v15 != (__int64 *)&v29 )
      continue;
    break;
  }
  if( v17 )
    KiCheckAndRearmForceIdle();
LABEL_20:
  if( Prcb->DeferredReadyListHead.Next )
    KiProcessThreadWaitList(Prcb, AdjustUnwait, 0i64, 2ui64);
  if( KiShouldActivateHRTimerClock(*(UINT64 *)&KUSER_SHARED_DATA.InterruptTime.LowPart, DueTime) )
    KiSendClockInterruptToClockOwner();
}

Referenced by:

KiRetireDpcList
KiTimerExpirationDpc