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