KiProcessExpiredTimerList

VOID __fastcall KiProcessExpiredTimerList(struct KPRCB *a1, INT64 *a2, INT64 a3, UINT64 a4){
  __int64 v4; 
  int v5; 
  unsigned int v8; 
  __int64 v9; 
  volatile signed __int32 *v10; 
  __int64 v11; 
  __int64 v12; 
  int v13; 
  ULONG_PTR v14; 
  __int64 v15; 
  INT64 v16; 
  void(__fastcall *v17)(__int64, _QWORD, _QWORD, _QWORD); 
  ULONG_PTR v18; 
  __int64 **v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 *v22; 
  __int64 *v23; 
  void *v24; 
  __int64 *v25; 
  __int64 **v26; 
  ULONG_PTR BugCheckParameter4; 
  ULONG_PTR BugCheckParameter2; 
  UINT64 SpinCount; 
  unsigned int v30; 
  __int64 v31; 
  INT64 v32; 
  __int128 v33; 
  __int128 v34; 
  LARGE_INTEGER v35[2]; 
  __int128 v36; 
  v4 = *((_QWORD *)a1 + 1);
  v30 = a4;
  v5 = BYTE4(PerfGlobalGroupMask) & 0x80;
  v31 = v4;
  BugCheckParameter2 = 0i64;
  v33 = 0i64;
  v32 = a3;
  v8 = 0;
  v34 = 0i64;
  *(_OWORD *)&v35[0].LowPart = 0i64;
  v36 = 0i64;
  HIDWORD(SpinCount) = *(_DWORD *)(v4 + 484);
  while( 1 )
  {
    v9 = v8++;
    v10 = (volatile signed __int32 *)_InterlockedExchange64((volatile __int64 *)(a3 + 8 * v9), 0i64);
    if( v10 )
    {
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset(v10, 7u) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( (*v10 & 0x80u) != 0 );
      }
      KiTimerWaitTest((_KPRCB *)a1, (_KTIMER *)v10, (_ULARGE_INTEGER *)(a2 + 1));
      v12 = v11;
      if( v11 )
      {
        if( *((_QWORD *)a1 + 1441) )
          KiProcessThreadWaitList(a1, 1, 0);
        if( v5 )
          EtwGetKernelTraceTimestamp(v35, 0x20000080ui64);
        v13 = *(_DWORD *)a2;
        BugCheckParameter2 = *(_QWORD *)(v12 + 24);
        v14 = BugCheckParameter2;
        *(_DWORD *)a2 = v13 + 1;
        v15 = 2 * ((v13 & 0xF) + 1i64);
        a2[v15] = v14;
        LODWORD(a2[v15 + 1]) = KUSER_SHARED_DATA.TickCount.LowPart;
        v16 = *((_QWORD *)a1 + 4245);
        *((_DWORD *)a1 + 8103) = 0;
        if( v16 && *((_QWORD *)a1 + 4246) != v16 && *((_DWORD *)a1 + 7931) < *((_DWORD *)a1 + 7933) )
        {
          *((_QWORD *)a1 + 4246) = v16;
          memset(v16, 0i64);
        }
        v17 = (void(__fastcall *)(__int64, _QWORD, _QWORD, _QWORD))BugCheckParameter2;
        *((_BYTE *)a1 + 12586) = 1;
        v17(v12, *(_QWORD *)(v12 + 32), *((unsigned int *)a2 + 2), *((unsigned int *)a2 + 3));
        v18 = HIDWORD(SpinCount);
        *((_BYTE *)a1 + 12586) = 0;
        HIDWORD(a2[v15 + 1]) = KUSER_SHARED_DATA.TickCount.LowPart;
        if( (_DWORD)v18 != *(_DWORD *)(v31 + 484) )
          KeBugCheckEx(0xC7u, 5ui64, BugCheckParameter2, v18, *(unsigned int *)(v31 + 484));
        if( v5 )
        {
          LODWORD(BugCheckParameter4) = 4196866;
          EtwTraceTimedEvent(3909, 0x20000080ui64, (INT64)&BugCheckParameter2, 8i64, BugCheckParameter4, (INT64)v35);
        }
      }
    }
    if( v8 >= v30 )
      break;
    a3 = v32;
  }
  v19 = (__int64 **)*((_QWORD *)a1 + 1441);
  if( v19 )
  {
    *((_QWORD *)a1 + 1441) = 0i64;
    do
    {
      v20 = *((unsigned __int8 *)v19 + 371);
      v21 = (__int64)(v19 - 27);
      v22 = *(v19 - 1);
      v19 = (__int64 **)*v19;
      v23 = &v22[6 * v20];
      do
      {
        if( *((_BYTE *)v22 + 17) < 5u )
        {
          v24 = (void *)v22[4];
          KiAcquireKobjectLockSafe(v24);
          if( *((_BYTE *)v22 + 17) == 4 )
          {
            v25 = (__int64 *)*v22;
            if( *(__int64 **)(*v22 + 8) != v22 || (v26 = (__int64 **)v22[1], *v26 != v22) )
              __fastfail(3u);
            *v26 = v25;
            v25[1] = (__int64)v26;
          }
          _InterlockedAnd((volatile signed __int32 *)v24, 0xFFFFFF7F);
        }
        v22 += 6;
      }
      while( v22 != v23 );
      *(_WORD *)(v21 + 566) = 1;
      KiReadyThread((struct _KPRCB *)a1, v21);
    }
    while( v19 );
  }
}

Referenced by:

KiExpireTimerTable
KiRetireDpcList