KiExpireTimerTable

VOID __fastcall KiExpireTimerTable(
        struct KPRCB *a1,
        INT64 a2,
        INT64 a3,
        INT64 a4,
        INT64 a5,
        UINT64 a6,
        UINT64 SpinCount,
        INT64 *a8){
  int v8; 
  unsigned int v9; 
  int v10; 
  unsigned int v11; 
  int v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  UINT64 v16; 
  INT64 v17; 
  _QWORD *v18; 
  _QWORD *v19; 
  UINT64 v20; 
  ULONG_PTR v21; 
  char v22; 
  ULONG_PTR BugCheckParameter4; 
  unsigned __int64 v24; 
  char v25; 
  unsigned int v26; 
  unsigned int v28; 
  int v29; 
  int v30; 
  v8 = a3;
  v9 = a3 + a4 - 1;
  v10 = v9 + a5;
  v28 = v9;
  v30 = v9 + a5;
  v11 = 0;
  v12 = v8 - 1;
  v29 = 0;
  v13 = 0i64;
  v14 = (unsigned __int64)(unsigned int)SpinCount << 8;
  v24 = v14;
  v25 = -64;
  while( 1 )
  {
    v16 = a6;
    v17 = a2 + 32 * ((unsigned __int8)++v12 + v14 + 16);
    if( v11 <= v9 || *(_QWORD *)(v17 + 24) <= a6 )
    {
      v18 = (_QWORD *)(v17 + 8);
      if( v18 != (_QWORD *)*v18 )
      {
        do
        {
          LODWORD(SpinCount) = 0;
          while( _interlockedbittestandset64((volatile signed __int32 *)v17, 0i64) )
          {
            do
              KeYieldProcessorEx(&SpinCount);
            while( *(_QWORD *)v17 );
          }
          do
          {
            v19 = (_QWORD *)*v18;
            if( v18 == (_QWORD *)*v18 )
              goto LABEL_12;
            v20 = *(v19 - 1);
            v21 = (ULONG_PTR)(v19 - 4);
            if( v20 > v16 )
            {
              *(_QWORD *)(v17 + 24) = v20;
LABEL_12:
              _InterlockedAnd64((volatile signed __int64 *)v17, 0i64);
              goto LABEL_13;
            }
            v22 = (v25 ^ v13) & 0x3F ^ v25 ^ *(_BYTE *)(v21 + 3);
            v25 ^= (v25 ^ v13) & 0x3F;
            v26 = 0;
            HIBYTE(v26) = v22;
            _InterlockedXor((volatile signed __int32 *)v21, v26);
            BugCheckParameter4 = _InterlockedExchange64((volatile __int64 *)(a2 + 8 * v13), v21);
            KiRemoveEntryTimer((_KTIMER_TABLE *)a2, (_KTIMER *)v21, (unsigned __int8)v12);
            v13 = (unsigned int)(v13 + 1);
            if( BugCheckParameter4 )
              KeBugCheckEx(0xC7u, 8ui64, 1ui64, v21, BugCheckParameter4);
            v16 = a6;
          }
          while( (_DWORD)v13 != 64 );
          _InterlockedAnd64((volatile signed __int64 *)v17, 0i64);
          KiProcessExpiredTimerList(a1, a8, a2, 0x40ui64);
          v13 = 0i64;
        }
        while( v18 != (_QWORD *)*v18 );
LABEL_13:
        v9 = v28;
        v10 = v30;
      }
      v11 = ++v29;
    }
    if( v12 == v10 )
      break;
    v14 = v24;
  }
  if( (_DWORD)v13 )
    KiProcessExpiredTimerList(a1, a8, a2, (unsigned int)v13);
}

Referenced by:

KiTimerExpiration