KiRetireDpcList

VOID __stdcall KiRetireDpcList(_KPRCB *Prcb){
  _KPRCB *v1; 
  _ETHREAD *CurrentThread; 
  unsigned __int64 v3; 
  unsigned __int64 v4; 
  unsigned __int64 v5; 
  char v6; 
  _THREAD_ENERGY_VALUES *EnergyValues; 
  _PROC_PERF_DOMAIN *Domain; 
  _PROC_PERF_CONSTRAINT *Constraint; 
  unsigned int LatestFrequencyPercent; 
  unsigned int v11; 
  __int64 ArchitecturalEfficiencyClass; 
  __int64 v13; 
  __int64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 *v16; 
  unsigned int v17; 
  unsigned int EndTime; 
  unsigned int v19; 
  __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  char v23; 
  _PROC_PERF_DOMAIN *v24; 
  _PROC_PERF_CONSTRAINT *v25; 
  unsigned int SelectedPercent; 
  unsigned int v27; 
  unsigned __int64 *v28; 
  bool v29; 
  _KTIMER_TABLE *v30; 
  unsigned __int64 v31; 
  UINT64 *v32; 
  _KTIMER_TABLE *v33; 
  UINT64 v34; 
  PVOID v35; 
  unsigned int v36; 
  UINT8 v37; 
  int v38; 
  UINT64 v39; 
  unsigned int v40; 
  _KPRCB *v41; 
  char *v42; 
  INT64 v43; 
  __int64 v44; 
  __int64 v45; 
  __int64 v46; 
  signed __int64 v47; 
  UINT64 v48; 
  unsigned int v49; 
  int v50; 
  unsigned __int64 v51; 
  _KTIMER **v52; 
  unsigned int v53; 
  int v54; 
  unsigned int v55; 
  UINT64 v56; 
  unsigned int v57; 
  unsigned int v58; 
  int v59; 
  _KTIMER **v60; 
  unsigned int v61; 
  unsigned int v62; 
  _KTIMER **v63; 
  _QWORD *v64; 
  __int64 v65; 
  unsigned int PeriodicBias; 
  struct _KPRCB *v67; 
  int v68; 
  _QWORD *v69; 
  _KTIMER *v70; 
  unsigned __int64 v71; 
  char v72; 
  _KTIMER_TABLE *v73; 
  _KSCHEDULING_GROUP *volatile SchedulingGroup; 
  _QWORD *SparePtr; 
  _QWORD *v76; 
  _QWORD *v77; 
  _KTIMER *v78; 
  unsigned __int64 v79; 
  int v80; 
  struct _KPRCB *v81; 
  __int64 v82; 
  _QWORD *i; 
  char v84; 
  _KTIMER_TABLE *v85; 
  UINT64 v86; 
  __int64 v87; 
  __int64 v88; 
  signed __int64 v89; 
  int v90; 
  __int64 v91; 
  _DWORD *v92; 
  _BYTE *SchedulerAssist; 
  __int64 v94; 
  __int64 v95; 
  unsigned int *v96; 
  __int64 v97; 
  char *v98; 
  unsigned __int64 v99; 
  __int64 v100; 
  __int64 v101; 
  __int64 v102; 
  signed __int64 v103; 
  __int64 v104; 
  __int64 v105; 
  unsigned __int64 v106; 
  signed __int64 v107; 
  int v108; 
  __int64 v109; 
  __int64 v110; 
  unsigned __int64 v111; 
  __int64 v112; 
  __int64 v113; 
  __int64 v114; 
  unsigned __int64 v115; 
  _BYTE *v116; 
  signed __int32 v117[8]; 
  PVOID BugCheckParameter4; 
  bool v119; 
  unsigned int v120; 
  unsigned int v121; 
  _KTIMER **ExpiredTimers; 
  UINT64 v123; 
  int v124; 
  unsigned __int64 v125; 
  INT64 CurrentPrcb; 
  unsigned int v127; 
  int v128; 
  _KPRCB *Prcba; 
  unsigned int v130; 
  _KTIMER **v131; 
  _KTIMER **v132; 
  UINT64 SpinCount; 
  int v134; 
  _ETHREAD *v135; 
  UINT64 FromFrequency; 
  PVOID BugCheckParameter3; 
  __int128 v138; 
  __int64 v139; 
  __int128 v140; 
  __int64 v141; 
  __int128 v142; 
  __int64 v143; 
  __int128 v144; 
  __int64 v145; 
  __int128 v146; 
  _KDPC_TRACKER_TABLE DpcTracker[68]; 

  v1 = Prcb;
  Prcba = Prcb;
  CurrentThread = Prcb->CurrentThread;
  memset(DpcTracker, 0, sizeof(DpcTracker));
  v135 = CurrentThread;
  do
  {
    v1->NestingLevel = 1;
    v3 = __rdtsc();
    v4 = v3 - v1->StartCycles;
    v5 = v4 + CurrentThread->Tcb.CurrentRunTime;
    CurrentThread->Tcb.CycleTime += v4;
    v1->StartCycles = v3;
    if( v5 > 0xFFFFFFFF )
      LODWORD(v5) = -1;
    v6 = CurrentThread->Tcb.gap0[2];
    CurrentThread->Tcb.CurrentRunTime = v5;
    if( (v6 & 0x3E) != 0 )
    {
      if( (v6 & 0x10) != 0 )
      {
        v1->TaggedCycles[CurrentThread->Tcb.Tag] += v1->StartCycles - v1->TaggedCyclesStart;
        v6 &= ~0x10u;
        v1->TaggedCyclesStart = 0i64;
      }
      if( (v6 & 0x20) != 0 )
      {
        EnergyValues = CurrentThread->EnergyValues;
        if( EnergyValues )
        {
          Domain = v1->PowerState.CheckContext.Domain;
          Constraint = v1->PowerState.CheckContext.Constraint;
          if( Domain && Constraint )
          {
            if( Constraint->Selection.Autonomous )
            {
              LatestFrequencyPercent = Constraint->LatestFrequencyPercent;
            }
            else
            {
              LatestFrequencyPercent = Constraint->Selection.SelectedPercent;
              if( LatestFrequencyPercent >= Domain->GuaranteedPercent )
                LatestFrequencyPercent = Domain->GuaranteedPercent;
            }
          }
          else
          {
            LatestFrequencyPercent = 100;
          }
          if( LatestFrequencyPercent < 0x4B )
            v11 = LatestFrequencyPercent / 0x19;
          else
            v11 = 3;
          ArchitecturalEfficiencyClass = v1->PowerState.ArchitecturalEfficiencyClass;
          v13 = v11;
          v123 = 0i64;
          v14 = ArchitecturalEfficiencyClass + 2i64 * v11;
          v15 = EnergyValues->Cycles[0][v14];
          v16 = (unsigned __int64 *)((char *)EnergyValues + 8 * v14);
          v17 = KiTimelineBitmapTime;
          *v16 = v4 + v15;
          EndTime = EnergyValues->CpuTimeline.EndTime;
          if( v17 > EndTime )
          {
            LODWORD(v123) = v17;
            if( v17 - EndTime >= 0x20 )
              HIDWORD(v123) = 1;
            else
              HIDWORD(v123) = (EnergyValues->CpuTimeline.Bitmap << (v17 - EndTime)) | 1;
            EnergyValues->CpuTimeline.Value = v123;
          }
          else
          {
            v19 = EndTime - v17;
            if( v19 < 0x20 )
              EnergyValues->CpuTimeline.Bitmap |= 1 << v19;
          }
          if( !KiEfficiencyClassSystem && (unsigned __int8)CurrentThread->Tcb.ThreadFlags2 == 2 )
            EnergyValues->Cycles[v13][1] += v4;
          if( CurrentThread->WorkOnBehalfThread )
          {
            EnergyValues->WorkOnBehalfCycles[v13][ArchitecturalEfficiencyClass] += v4;
            _InterlockedExchangeAdd64(
              (volatile signed __int64 *)(*((_QWORD *)CurrentThread->WorkOnBehalfThread + 191)
                                        + 8 * (ArchitecturalEfficiencyClass + 2 * (v13 + 4))),
              v4);
          }
        }
        v6 &= ~0x20u;
      }
      if( (v6 & 0x40) != 0 )
      {
        SchedulerAssist = CurrentThread->Tcb.SchedulerAssist;
        if( SchedulerAssist )
          SchedulerAssist[64] = 0;
        v6 &= ~0x40u;
      }
      if( (v6 & 0x3E) != 0 )
      {
        SchedulingGroup = CurrentThread->Tcb.SchedulingGroup;
        if( SchedulingGroup )
        {
          for( i = (_QWORD *)((char *)&SchedulingGroup->Policy + v1->ScbOffset); i; i = (_QWORD *)i[51] )
            *i += v4;
        }
        if( (CurrentThread->Tcb.gap0[2] & 8) != 0
          && (CurrentThread->Tcb.Affinity.Mask & v1->ParentNode->Affinity.Mask) != v1->ParentNode->Affinity.Mask )
        {
          v1->AffinitizedCycles += v4;
        }
        if( CurrentThread->Tcb.SystemHeteroCpuPolicy )
        {
          if( (unsigned __int8)CurrentThread->Tcb.ThreadFlags2 == 2 )
            v1->UnimportantCycles += v4;
          else
            v1->ImportantCycles += v4;
        }
        SparePtr = CurrentThread->Tcb.WaitBlock[0].SparePtr;
        if( SparePtr )
        {
          v94 = SparePtr[4];
          if( v94 )
          {
            v95 = 1i64;
            if( KiHwCountersCount )
            {
              v96 = KiHwCounters;
              v97 = (unsigned int)KiHwCountersCount;
              v98 = (char *)(SparePtr + 6);
              do
              {
                if( (v94 & v95) != 0 )
                {
                  v99 = __readpmc(*v96);
                  *((_QWORD *)v98 + 1) += (unsigned int)(v99 - *(_DWORD *)v98);
                  *(_QWORD *)v98 = v99;
                }
                v95 *= 2i64;
                ++v96;
                v98 += 24;
                --v97;
              }
              while( v97 );
            }
          }
        }
      }
    }
    v20 = (unsigned __int16)v1->DpcRequestSlot[0];
    v1->DpcRequestSlot[0] = 1;
    v128 = v20;
    if( (v20 & 8) == 0 )
      goto LABEL_28;
    v30 = KiSelectActiveTimerTable(v1, 1u);
    v33 = v30;
    if( !v30 )
    {
      _enable();
      *(_QWORD *)&DpcTracker[2] = *(_QWORD *)v31;
LABEL_90:
      _disable();
      goto LABEL_28;
    }
    v34 = *v32;
    v35 = KiLastNonHrTimerExpiration;
    v36 = v30->TableState.LastTimerHand[0];
    v123 = *v32;
    LOBYTE(v31) = KiLastNonHrTimerExpiration != (PVOID)v30->TableState.LastTimerExpiration[1];
    v37 = KiLastPseudoHrTimerExpiration != v30->TableState.LastTimerExpiration[0];
    v38 = v37;
    if( (KiVelocityFlags & 0x2000) != 0 )
      v38 = (unsigned __int8)v31;
    v119 = KiLastPseudoHrTimerExpiration != v30->TableState.LastTimerExpiration[0];
    v39 = v34 >> 18;
    v124 = v38;
    if( v37 )
    {
      v30->TableState.LastTimerExpiration[0] = KiLastPseudoHrTimerExpiration;
      v30->TableState.LastTimerHand[0] = v39;
    }
    if( (_BYTE)v38 )
    {
      v40 = v30->TableState.LastTimerHand[1];
      v30->TableState.LastTimerExpiration[1] = (unsigned __int64)v35;
      v30->TableState.LastTimerHand[1] = v34 >> 18;
      if( v36 < v40 )
        v40 = v36;
      v36 = v40;
    }
    if( v37 || (_BYTE)v38 )
    {
      _enable();
      *(_QWORD *)&DpcTracker[2] = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
      v146 = 0i64;
      if( KiSerializeTimerExpiration )
      {
        if( !v1->ClockOwner )
          goto LABEL_90;
        v41 = KiProcessorBlock;
      }
      else
      {
        v41 = v1;
      }
      ExpiredTimers = v41->TimerTable.TimerExpiry;
      if( v41 == (_KPRCB *)-14656i64 )
        goto LABEL_89;
      v42 = (char *)v1 + 16 * v1->TimerExpirationTraceCount;
      v1->TimerExpirationTraceCount = ((unsigned __int8)v1->TimerExpirationTraceCount + 1) & 0xF;
      v43 = HalpPerformanceCounter;
      *((_QWORD *)v42 + 4449) = v34;
      if( *(_DWORD *)(v43 + 228) == 5 )
      {
        FromFrequency = 10000000i64;
        if( HalpTimerReferencePage )
        {
          HalpTimerGetInternalData((_KDPC *)v43, v33, v35, (PVOID)v31);
          v48 = KUSER_SHARED_DATA.QpcBias
              + (((unsigned __int64)(*(__int64(__fastcall **)(__int64))(v43 + 112))(v82)
                * (unsigned __int128)*((unsigned __int64 *)HalpTimerReferencePage + 1)) >> 64);
LABEL_66:
          if( v43 != HalpOriginalPerformanceCounter && HalpOriginalPerformanceCounter )
          {
            v86 = *(_QWORD *)(HalpOriginalPerformanceCounter + 192);
            if( *(_DWORD *)(HalpOriginalPerformanceCounter + 228) == 5 )
              v86 = 10000000i64;
            v48 = HalpTimerScaleCounter(v48, FromFrequency, v86);
          }
          *((_QWORD *)v42 + 4450) = v48;
          v49 = v39 - v36 + 1;
          v130 = v49;
          if( v49 <= 0x100 )
          {
LABEL_68:
            v127 = v49;
            v50 = 256 - v49;
            v125 = v34;
            v51 = v34;
            if( 256 - v49 > 0x18 )
              v50 = 24;
            goto LABEL_70;
          }
          v65 = (v39 - v49 + 1) << 18;
          do
          {
            if( v49 <= 0x100 )
              goto LABEL_68;
            v51 = v65 + 0x4000000;
            v127 = 256;
            v125 = v51;
            v50 = 0;
LABEL_70:
            v52 = ExpiredTimers;
            v139 = 0i64;
            v53 = 0;
            v54 = v36 + v127;
            v131 = 0i64;
            v55 = v36 - 1;
            v134 = v54;
            v56 = 0i64;
            v57 = v55;
            v138 = 0i64;
            v58 = v54 - 1;
            v120 = 0;
            v121 = v54 - 1;
            v59 = v54 - 1 + v50;
            BYTE3(v138) = -64;
            do
            {
              v60 = &v52[4 * (unsigned __int8)++v57 + 64];
              if( v53 <= v58 || (unsigned __int64)v60[3] <= v51 )
              {
                if( v60 + 1 != (_KTIMER **)v60[1] )
                {
LABEL_109:
                  CurrentPrcb = (INT64)KeGetCurrentPrcb();
                  LODWORD(SpinCount) = 0;
                  while( _interlockedbittestandset64((volatile signed __int32 *)v60, 0i64) )
                  {
                    do
                      KeYieldProcessorEx(&SpinCount);
                    while( *v60 );
                  }
                  v56 = v120;
                  v76 = v60 + 1;
                  v131 = v60;
                  while( 1 )
                  {
                    v77 = (_QWORD *)*v76;
                    v51 = v125;
                    if( v76 == (_QWORD *)*v76 )
                      goto LABEL_115;
                    v78 = (_KTIMER *)(v77 - 4);
                    v79 = *(v77 - 1);
                    BugCheckParameter3 = v78;
                    if( v79 > v125 )
                      break;
                    v143 = 0i64;
                    v84 = (BYTE3(v138) ^ v56) & 0x3F ^ BYTE3(v138) ^ v78->gap0[3];
                    BYTE3(v138) ^= (BYTE3(v138) ^ v56) & 0x3F;
                    v142 = 0i64;
                    BYTE3(v142) = v84;
                    _InterlockedXor((volatile signed __int32 *)v78, v142);
                    v85 = (_KTIMER_TABLE *)ExpiredTimers;
                    CurrentPrcb = _InterlockedExchange64(
                                    (volatile __int64 *)&ExpiredTimers[(unsigned int)v56],
                                    (__int64)v78);
                    KiRemoveEntryTimer(v85, v78, (unsigned __int8)v57);
                    v56 = ++v120;
                    if( CurrentPrcb )
                      KeBugCheckEx(0xC7u, (PVOID)8, (PVOID)1, BugCheckParameter3, (PVOID)CurrentPrcb);
                    if( (_DWORD)v56 == 64 )
                    {
                      _InterlockedAnd64((volatile signed __int64 *)v131, 0i64);
                      KiProcessExpiredTimerList(Prcba, DpcTracker, ExpiredTimers, 0x40ui64);
                      v56 = 0i64;
                      v120 = 0;
                      if( v76 == (_QWORD *)*v76 )
                        goto LABEL_200;
                      goto LABEL_109;
                    }
                  }
                  v60[3] = (_KTIMER *)v79;
LABEL_115:
                  v80 = (int)v131;
                  _InterlockedAnd64((volatile signed __int64 *)v131, 0i64);
                  v81 = KeGetCurrentPrcb();
                  if( v81->SchedulerAssist && v81->NestingLevel <= 1u && !v80 )
                  {
                    v56 = v120;
LABEL_200:
                    v51 = v125;
                  }
                  v58 = v121;
                  v52 = ExpiredTimers;
                }
                ++v53;
              }
            }
            while( v57 != v59 );
            if( (_DWORD)v56 )
            {
              KiProcessExpiredTimerList(Prcba, DpcTracker, v52, v56);
              v58 = v121;
              v52 = ExpiredTimers;
            }
            if( (_BYTE)v124 )
            {
              v132 = 0i64;
              v61 = 0;
              v141 = 0i64;
              v62 = 0;
              v140 = 0i64;
              v120 = 0;
              BYTE3(v140) = -64;
              do
              {
                v63 = &v52[4 * (unsigned __int8)++v55 + 1088];
                if( v61 <= v58 || (unsigned __int64)v63[3] <= v125 )
                {
                  v64 = v63 + 1;
                  if( v64 != (_QWORD *)*v64 )
                  {
                    do
                    {
                      v67 = KeGetCurrentPrcb();
                      HIDWORD(SpinCount) = 0;
                      while( _interlockedbittestandset64((volatile signed __int32 *)v63, 0i64) )
                      {
                        do
                          KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
                        while( *v63 );
                        v92 = v67->SchedulerAssist;
                        if( v92 && v67->NestingLevel <= 1u )
                          ++v92[6];
                      }
                      v68 = v120;
                      v132 = v63;
                      do
                      {
                        v69 = (_QWORD *)*v64;
                        if( v64 == (_QWORD *)*v64 )
                          goto LABEL_97;
                        v70 = (_KTIMER *)(v69 - 4);
                        v71 = *(v69 - 1);
                        if( v71 > v125 )
                        {
                          v63[3] = (_KTIMER *)v71;
LABEL_97:
                          _InterlockedAnd64((volatile signed __int64 *)v132, 0i64);
                          v62 = v120;
                          goto LABEL_98;
                        }
                        v145 = 0i64;
                        v72 = (BYTE3(v140) ^ v68) & 0x3F ^ BYTE3(v140) ^ v70->gap0[3];
                        BYTE3(v140) ^= (BYTE3(v140) ^ v68) & 0x3F;
                        v144 = 0i64;
                        BYTE3(v144) = v72;
                        _InterlockedXor((volatile signed __int32 *)v70, v144);
                        v73 = (_KTIMER_TABLE *)ExpiredTimers;
                        CurrentPrcb = _InterlockedExchange64((volatile __int64 *)&ExpiredTimers[v68], (__int64)v70);
                        KiRemoveEntryTimer(v73, v70, (unsigned __int8)v55);
                        v68 = ++v120;
                        if( CurrentPrcb )
                          KeBugCheckEx(0xC7u, (PVOID)8, (PVOID)1, v70, (PVOID)CurrentPrcb);
                      }
                      while( v68 != 64 );
                      _InterlockedAnd64((volatile signed __int64 *)v132, 0i64);
                      KiProcessExpiredTimerList(Prcba, DpcTracker, ExpiredTimers, 0x40ui64);
                      v62 = 0;
                      v120 = 0;
                    }
                    while( v64 != (_QWORD *)*v64 );
LABEL_98:
                    v58 = v121;
                    v52 = ExpiredTimers;
                  }
                  ++v61;
                }
              }
              while( v55 != v59 );
              v1 = Prcba;
              if( v62 )
                KiProcessExpiredTimerList(Prcba, DpcTracker, v52, v62);
            }
            else
            {
              v1 = Prcba;
            }
            v29 = v130 == v127;
            v49 = v130 - v127;
            v36 = v134;
            v65 = v125;
            v34 = v123;
            v130 -= v127;
          }
          while( !v29 );
          CurrentThread = v135;
          LOBYTE(v20) = v128;
          LOBYTE(v38) = v124;
          v37 = v119;
          if( (v1->DpcRequestSummary & 8) == 0 )
          {
            PeriodicBias = v1->PeriodicBias;
            v1->PeriodicCount = 0;
            if( PeriodicBias >= KeTimeIncrement )
              v1->PeriodicBias = PeriodicBias - KeTimeIncrement;
            else
              v1->PeriodicBias = 0;
          }
          goto LABEL_89;
        }
        if( *(_DWORD *)(v43 + 220) == 64 )
        {
          HalpTimerGetInternalData((_KDPC *)v43, v33, v35, (PVOID)v31);
          v101 = (*(__int64(__fastcall **)(__int64))(v43 + 112))(v100);
          v102 = *(_QWORD *)(v43 + 208);
          v103 = v101;
        }
        else
        {
          do
          {
            v102 = *(_QWORD *)(v43 + 208);
            do
            {
              v104 = *(_QWORD *)(v43 + 200);
              HalpTimerGetInternalData((_KDPC *)v43, v33, v35, (PVOID)v31);
              v106 = (*(__int64(__fastcall **)(__int64))(v43 + 112))(v105);
              _InterlockedOr(v117, 0);
              v107 = *(_QWORD *)(v43 + 200);
            }
            while( v104 != v107 );
          }
          while( v102 != *(_QWORD *)(v43 + 208) );
          v108 = *(_DWORD *)(v43 + 220);
          if( ((v104 ^ v106) & (1i64 << ((unsigned __int8)v108 - 1))) != 0 )
          {
            v109 = 1i64 << v108;
            v110 = -1i64;
            if( v108 != 64 )
              v110 = v109 - 1;
            v111 = v104 & v110;
            v103 = v106 | v104 ^ v111;
            if( v106 < v111 )
              v103 += v109;
            _InterlockedCompareExchange64((volatile signed __int64 *)(v43 + 200), v103, v107);
          }
          else
          {
            if( v108 == 64 )
              v112 = -1i64;
            else
              v112 = (1i64 << v108) - 1;
            v103 = v106 | v104 & ~v112;
          }
        }
        v48 = HalpTimerScaleCounter(v102 + v103, *(_QWORD *)(v43 + 192), 0x989680ui64);
      }
      else
      {
        v29 = *(_DWORD *)(v43 + 220) == 64;
        FromFrequency = *(_QWORD *)(v43 + 192);
        if( v29 )
        {
          HalpTimerGetInternalData((_KDPC *)v43, v33, v35, (PVOID)v31);
          v45 = (*(__int64(__fastcall **)(__int64))(v43 + 112))(v44);
          v46 = *(_QWORD *)(v43 + 208);
          v47 = v45;
        }
        else
        {
          do
          {
            v46 = *(_QWORD *)(v43 + 208);
            do
            {
              v87 = *(_QWORD *)(v43 + 200);
              HalpTimerGetInternalData((_KDPC *)v43, v33, v35, (PVOID)v31);
              v31 = (*(__int64(__fastcall **)(__int64))(v43 + 112))(v88);
              _InterlockedOr(v117, 0);
              v89 = *(_QWORD *)(v43 + 200);
            }
            while( v87 != v89 );
          }
          while( v46 != *(_QWORD *)(v43 + 208) );
          v90 = *(_DWORD *)(v43 + 220);
          if( ((v87 ^ v31) & (1i64 << ((unsigned __int8)v90 - 1))) != 0 )
          {
            v113 = 1i64 << v90;
            v114 = -1i64;
            if( v90 != 64 )
              v114 = v113 - 1;
            v115 = v87 & v114;
            v47 = v31 | v87 ^ v115;
            if( v31 < v115 )
              v47 += v113;
            _InterlockedCompareExchange64((volatile signed __int64 *)(v43 + 200), v47, v89);
          }
          else
          {
            if( v90 == 64 )
              v91 = -1i64;
            else
              v91 = (1i64 << v90) - 1;
            v47 = v31 | v87 & ~v91;
          }
        }
        v48 = v46 + v47;
      }
      v34 = v123;
      goto LABEL_66;
    }
    _enable();
    *(_QWORD *)&DpcTracker[2] = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
LABEL_89:
    if( !v1->ClockOwner )
      goto LABEL_90;
    BugCheckParameter4 = DpcTracker;
    KiTimer2Expiration(v1, v34, v37, (_KDPC_TRACKER_TABLE *)(unsigned __int8)v38);
    _disable();
LABEL_28:
    KiExecuteAllDpcs(v1, &CurrentThread->Tcb, DpcTracker, 0i64, (UINT64)BugCheckParameter4);
    if( (v20 & 4) != 0 )
    {
      _enable();
      KeSignalGate((_KGATE *)v1->gap7B80, 0i64);
      _disable();
    }
    v21 = __rdtsc();
    v22 = v21 - v1->StartCycles;
    v1->CycleTime += v22;
    v23 = CurrentThread->Tcb.gap0[2];
    if( (v23 & 0x20) != 0 )
    {
      v24 = v1->PowerState.CheckContext.Domain;
      v25 = v1->PowerState.CheckContext.Constraint;
      if( v24 && v25 )
      {
        if( v25->Selection.Autonomous )
        {
          SelectedPercent = v25->LatestFrequencyPercent;
        }
        else
        {
          SelectedPercent = v25->Selection.SelectedPercent;
          if( SelectedPercent >= v24->GuaranteedPercent )
            SelectedPercent = v24->GuaranteedPercent;
        }
      }
      else
      {
        SelectedPercent = 100;
      }
      if( SelectedPercent < 0x4B )
        v27 = SelectedPercent / 0x19;
      else
        v27 = 3;
      v28 = &v1->Cycles[v27][v1->PowerState.ArchitecturalEfficiencyClass];
      *v28 += v22;
      v23 = CurrentThread->Tcb.gap0[2];
    }
    if( (v23 & 0x40) != 0 )
    {
      v116 = CurrentThread->Tcb.SchedulerAssist;
      if( v116 )
        v116[64] = 1;
    }
    v1->StartCycles = v21;
    if( (CurrentThread->Tcb.gap0[2] & 0x10) != 0 )
      v1->TaggedCyclesStart = v21;
    if( (CurrentThread->Tcb.gap0[2] & 2) != 0 )
      KiBeginCounterAccumulation(&CurrentThread->Tcb, 0);
    v29 = v1->InterruptRequest == 0;
    v1->NestingLevel = 0;
    if( !v29 )
      v1->InterruptRequest = 0;
  }
  while( _InterlockedCompareExchange16((volatile signed __int16 *)&v1->12588, 0, 1) != 1 );
  v1->DpcData[0].ActiveDpc = 0i64;
}

Referenced by:

KiIdleLoop
KyRetireDpcList