KiExecuteAllDpcs

__int64 __fastcall KiExecuteAllDpcs(__int64 a1, __int64 a2, _DWORD *a3, unsigned int a4){
  __int64 v4; 
  _DWORD *v5; 
  __int64 v6; 
  __int64 v7; 
  __int64 result; 
  volatile signed __int32 *v10; 
  struct _KPRCB *CurrentPrcb; 
  int v12; 
  __int64 *v13; 
  __int64 v14; 
  ULONG_PTR v15; 
  __int64 *v16; 
  _QWORD *v17; 
  __int64 v18; 
  ULONG_PTR v19; 
  __int64 v20; 
  int v21; 
  __int64 v22; 
  struct _KPRCB *v23; 
  unsigned __int64 v24; 
  __int64 v25; 
  bool v26; 
  __int64 v27; 
  __int64 v28; 
  __int64 v29; 
  unsigned __int64 v30; 
  __int64 v31; 
  _DWORD *v32; 
  INT64 v33; 
  unsigned __int64 v34; 
  unsigned __int64 v35; 
  unsigned __int64 v36; 
  unsigned __int64 v37; 
  INT64 v38; 
  INT64 v39; 
  unsigned __int64 v40; 
  ULONG_PTR v41; 
  int v42; 
  __int16 v43; 
  unsigned int v44; 
  unsigned int v45; 
  __int64 v46; 
  __int64 v47; 
  __int64 v48; 
  UINT64 v49; 
  LARGE_INTEGER PerformanceCounter; 
  INT64 SystemTimePrecise; 
  int v52; 
  ULONG_PTR v53; 
  __int64 v54; 
  __int64 v55; 
  ULONG_PTR BugCheckParameter4; 
  UINT64 Flag; 
  __int64 v59; 
  __int64 v60; 
  ULONG_PTR BugCheckParameter2; 
  ULONG_PTR v62; 
  int v63; 
  unsigned int v64; 
  __int64 v65; 
  ULONG_PTR BugCheckParameter3; 
  __int16 *v67; 
  __int64 v68; 
  __int64 v69; 
  ULONG_PTR v70; 
  ULONG_PTR v71; 
  __int64 v72; 
  __int64 v73; 
  __int128 v74; 
  ULONG_PTR v75; 
  __int128 v76; 
  __int128 v77; 
  EVENT_DATA_DESCRIPTOR EventData; 
  ULONG_PTR *p_BugCheckParameter2; 
  __int64 v80; 
  v4 = a4;
  v69 = a2;
  v5 = a3;
  BugCheckParameter2 = 0i64;
  v65 = 0i64;
  v6 = a4;
  v7 = a1 + 40 * (a4 + 312i64);
  result = *(unsigned int *)(v7 + 24);
  v74 = 0i64;
  v76 = 0i64;
  v77 = 0i64;
  if( (_DWORD)result )
  {
    v67 = 0i64;
    v73 = *(_QWORD *)(a1 + 11664);
    while( 1 )
    {
      v10 = (volatile signed __int32 *)(v7 + 16);
      CurrentPrcb = KeGetCurrentPrcb();
      if( *((_QWORD *)CurrentPrcb + 4247) && *((_BYTE *)CurrentPrcb + 32) <= 1u && *((_BYTE *)CurrentPrcb + 32) == 1 )
      {
        v5 = a3;
        v6 = v4;
      }
      if( _interlockedbittestandset64(v10, 0i64) )
      {
        KxWaitForSpinLockAndAcquire((UINT64 *)(v7 + 16));
        v5 = a3;
        v6 = v4;
      }
      v12 = 0;
      if( *(int *)(v7 + 24) <= 1 )
      {
        _InterlockedAnd16((volatile signed __int16 *)(a1 + 2 * v6 + 12588), 0xFFEDu);
        if( !*(_DWORD *)(v7 + 24) )
          break;
      }
      v13 = *(__int64 **)v7;
      v14 = **(_QWORD **)v7;
      *(_QWORD *)v7 = v14;
      if( !v14 )
        *(_QWORD *)(v7 + 8) = v7;
      v15 = v13[2];
      v16 = v13 - 1;
      BugCheckParameter2 = v15;
      v17 = (_QWORD *)v16[7];
      v18 = v16[4];
      v19 = v16[5];
      v20 = v16[6];
      v16[7] = 0i64;
      v21 = *(_DWORD *)(v7 + 24) - 1;
      v59 = v18;
      *(_DWORD *)(v7 + 24) = v21;
      *(_QWORD *)(v7 + 32) = v16;
      v22 = *(_QWORD *)(a1 + 33976);
      v62 = v19;
      v60 = v20;
      if( v22 && !(_DWORD)v4 )
      {
        v21 = *(_DWORD *)(v22 + 28) - 1;
        *(_DWORD *)(v22 + 28) = v21;
      }
      _InterlockedAnd64((volatile signed __int64 *)v10, 0i64);
      v23 = KeGetCurrentPrcb();
      v24 = *((_QWORD *)v23 + 4247);
      if( v24 && *((_BYTE *)v23 + 32) <= 1u && !v21 )
      {
        v5 = a3;
        v19 = v62;
      }
      _enable();
      if( v67 )
      {
        v25 = qword_140D238A0;
        v63 = 0;
        if( qword_140D238A0 )
        {
          v24 = *(unsigned int *)(qword_140D238A0 + 4224);
          v26 = !_BitScanForward((unsigned int *)&v27, v24);
          v63 = v27;
          if( !v26 )
          {
            do
            {
              v24 = ((_DWORD)v24 - 1) & (unsigned int)v24;
              v28 = 32i64 * (unsigned int)v27 + qword_140D238A0 + 4260;
              if( v28 && (*(_DWORD *)(v28 + 4) & 0x80u) != 0 )
                v12 |= 1 << *(_BYTE *)(qword_140D238A0 + 2 * v27 + 4209);
              v26 = !_BitScanForward((unsigned int *)&v27, v24);
            }
            while( !v26 );
            v20 = v60;
            v63 = v27;
          }
        }
        else
        {
          LOBYTE(v12) = 30;
        }
        if( (v12 & 2) != 0 )
        {
          PerformanceCounter = KeQueryPerformanceCounter(0i64);
          v5 = a3;
          v18 = v59;
          v20 = v60;
          *(LARGE_INTEGER *)&v76 = PerformanceCounter;
          v29 = 0i64;
        }
        else
        {
          v29 = 0i64;
          *(_QWORD *)&v76 = 0i64;
        }
        if( (v12 & 4) != 0 )
        {
          SystemTimePrecise = RtlGetSystemTimePrecise();
          v5 = a3;
          v18 = v59;
          v20 = v60;
          *((_QWORD *)&v76 + 1) = SystemTimePrecise;
          v29 = 0i64;
        }
        else
        {
          *((_QWORD *)&v76 + 1) = 0i64;
        }
        if( (v12 & 8) != 0 )
        {
          v30 = __rdtsc();
          v24 = (unsigned __int64)HIDWORD(v30) << 32;
          *(_QWORD *)&v77 = v30;
          v29 = 0i64;
        }
        else
        {
          *(_QWORD *)&v77 = 0i64;
        }
        if( (v12 & 0x10) != 0 )
        {
          v68 = 0i64;
          ((void(__fastcall *)(__int64 *, unsigned __int64, __int64, __int64))off_140C009E0[0])(&v68, v24, v25, v20);
          v29 = v68;
          v5 = a3;
          v18 = v59;
        }
        v19 = v62;
        *((_QWORD *)&v77 + 1) = v29;
      }
      v31 = ((*v5)++ & 0xF) + 1i64;
      v32 = &v5[4 * v31];
      *(_QWORD *)v32 = BugCheckParameter2;
      v32[2] = KUSER_SHARED_DATA.TickCount.LowPart;
      v33 = *(_QWORD *)(a1 + 33960);
      LODWORD(BugCheckParameter3) = *(_DWORD *)(v69 + 484);
      *(_DWORD *)(a1 + 32412) = 0;
      if( v33 && *(_QWORD *)(a1 + 33968) != v33 && *(_DWORD *)(a1 + 31724) < *(_DWORD *)(a1 + 31732) )
      {
        *(_QWORD *)(a1 + 33968) = v33;
        memset(v33, 0i64);
        v18 = v59;
        v19 = v62;
      }
      v34 = __rdtsc();
      *(_QWORD *)(a1 + 11664) = v17;
      v35 = v34;
      if( v17 != (_QWORD *)1 )
        v17[4] = v34;
      if( !(_DWORD)v4 )
        *(_BYTE *)(a1 + 12586) = 1;
      ((void(__fastcall *)(__int64 *, __int64, ULONG_PTR))BugCheckParameter2)(v16, v18, v19);
      v36 = __rdtsc();
      v37 = v36;
      if( !(_DWORD)v4 )
      {
        *(_BYTE *)(a1 + 12586) = 0;
        v38 = *(_QWORD *)(a1 + 12432);
        v39 = v36 - v35;
        if( v38 )
        {
          v52 = *(_DWORD *)(v38 + 4) >> 5;
          v72 = -1i64 << (*(_BYTE *)(v38 + 4) & 0x1F);
          v53 = BugCheckParameter2 & v72;
          v71 = (BugCheckParameter2 & v72) >> 56;
          v70 = (BugCheckParameter2 & v72) >> 40;
          v62 = (BugCheckParameter2 & v72) >> 16;
          if( v52 )
          {
            v75 = BugCheckParameter2 & v72;
            v54 = *(_QWORD *)(v38 + 8)
                + 8i64
                * (((unsigned int)v71
                  + 37
                  * ((unsigned __int8)((BugCheckParameter2 & v72) >> 48)
                   + 37
                   * ((unsigned __int8)v70
                    + 37
                    * ((unsigned __int8)((BugCheckParameter2 & v72) >> 32)
                     + 37
                     * ((((unsigned int)BugCheckParameter2 & (unsigned int)v72) >> 24)
                      + 37
                      * ((unsigned __int8)v62
                       + 37
                       * ((unsigned __int8)((unsigned __int16)(BugCheckParameter2 & v72) >> 8)
                        + 37 * ((unsigned __int8)v53 + 11623883)))))))) & (v52 - 1));
            while( 1 )
            {
              v54 = *(_QWORD *)v54;
              if( (v54 & 1) != 0 )
                break;
              if( v53 == (v72 & *(_QWORD *)(v54 + 8)) )
              {
                v55 = *(_QWORD *)(v54 + 16) >> 2;
                *(_BYTE *)(v54 + 24) = 1;
                *(_QWORD *)(v54 + 16) = v55 + ((unsigned __int64)(3 * v39) >> 2);
                goto LABEL_37;
              }
            }
          }
          KiInsertNewDpcRuntime(v38, BugCheckParameter2, v39);
        }
      }
LABEL_37:
      if( v17 != (_QWORD *)1 )
      {
        v40 = v37 - v17[4];
        v17[3] += v40;
        v17[10] += v40;
        ++v17[5];
        ++v17[11];
      }
      v41 = (unsigned int)BugCheckParameter3;
      v32[3] = KUSER_SHARED_DATA.TickCount.LowPart;
      if( (_DWORD)v41 != *(_DWORD *)(v69 + 484) )
        KeBugCheckEx(0xC7u, 4ui64, BugCheckParameter2, v41, *(unsigned int *)(v69 + 484));
      if( v67 )
      {
        v42 = *((_DWORD *)v67 + 1);
        v43 = *v67;
        p_BugCheckParameter2 = &BugCheckParameter2;
        v80 = 8i64;
        v44 = *(_DWORD *)(EtwpHostSiloState + 4224);
        v26 = !_BitScanForward(&v45, v44);
        v64 = v45;
        if( !v26 )
        {
          do
          {
            v44 &= v44 - 1;
            v46 = v45;
            v47 = 32i64 * v45 + EtwpHostSiloState + 4260;
            if( v47 )
            {
              if( (*(_DWORD *)(v47 + 4) & 0x80u) != 0 )
              {
                v48 = *(unsigned __int8 *)(EtwpHostSiloState + 2 * v46 + 4209);
                v49 = *(unsigned __int8 *)(EtwpHostSiloState + 2 * v46 + 4208);
                LODWORD(Flag) = v42;
                *(_QWORD *)&EventData.Size = 8i64;
                LOWORD(BugCheckParameter4) = v43;
                EventData.Ptr = (unsigned __int64)(&v75 + v48);
                EtwpLogKernelEvent(&EventData, EtwpHostSiloState, v49, 2u, BugCheckParameter4, Flag);
              }
            }
            v26 = !_BitScanForward(&v45, v44);
          }
          while( !v26 );
          v64 = v45;
        }
      }
      _disable();
      if( !*(_DWORD *)(v7 + 24) )
        goto LABEL_48;
      v5 = a3;
      v6 = v4;
    }
    KxReleaseSpinLock((UINT64 *)(v7 + 16));
LABEL_48:
    result = v73;
    *(_QWORD *)(a1 + 11664) = v73;
  }
  return result;
}

Referenced by:

KiExecuteDpc
KiRetireDpcList