PpmIdleExecuteTransition
__int64 __fastcall PpmIdleExecuteTransition(
ULONG_PTR BugCheckParameter4,
unsigned int a2,
unsigned int a3,
__int64 a4,
char a5,
__int64 a6,
__int64 a7,
char a8){
__int64 v8;
unsigned __int16 v9;
UINT64 v11;
int v12;
unsigned __int16 *v13;
unsigned int v14;
__int64 v15;
unsigned int v16;
_BYTE *v17;
UINT64 v18;
INT64 v19;
KSPIN_LOCK *v20;
unsigned __int64 v21;
unsigned int v22;
unsigned __int64 v23;
unsigned __int64 v24;
unsigned __int64 v25;
__int64 v26;
unsigned __int8(__fastcall *v27)(__int64);
__int64 v28;
_RTL_PROCESS_MODULES *v29;
UINT64 v30;
UINT64 *v31;
unsigned __int8 v32;
unsigned int v33;
unsigned __int16 v34;
char v35;
char v36;
bool v37;
__int64 v38;
unsigned __int64 v39;
unsigned __int64 v40;
int v41;
unsigned int v42;
int v43;
char v44;
int v45;
__int64 v46;
__int64 v47;
unsigned __int64 v48;
unsigned __int64 v49;
int v50;
unsigned __int64 v51;
__int64 v52;
signed __int64 v53;
__int64 v54;
char v55;
unsigned int v56;
__int64 v57;
int v58;
unsigned __int64 *v59;
__int64 v60;
unsigned __int64 v61;
int v62;
int v63;
int ExitSamplingCountdown;
char v65;
int v66;
int v67;
__int64 v68;
__int64 v69;
UINT64 v70;
unsigned int v71;
__int64 v72;
__int64 v73;
char v74;
struct _KPRCB *CurrentPrcb;
int v76;
int v77;
int v78;
KSPIN_LOCK *v79;
KSPIN_LOCK *v80;
unsigned __int64 v81;
unsigned __int64 v82;
unsigned __int64 v83;
unsigned __int64 v84;
unsigned __int128 v85;
unsigned __int64 v86;
void *v87;
__int64 v88;
__int64(__fastcall *v89)(__int64, _QWORD, _QWORD, _QWORD, _QWORD);
unsigned int v90;
__int64 v91;
__int64 v92;
UINT64 v93;
UINT64 v94;
int v95;
char v96;
__int64 v97;
__int32 v98;
__int32 v99;
__int64 v100;
struct _KPRCB *v101;
__int64 v102;
unsigned __int64 v103;
unsigned __int64 v104;
unsigned __int64 v105;
unsigned __int8 v106;
unsigned __int8 v107;
__int16 v108;
unsigned __int8 v109;
__int64 v110;
signed __int16 v111;
__int64 v112;
signed __int16 v113;
char v114;
char v115;
__int64 v116;
unsigned __int64 v117;
unsigned __int64 v118;
ULONG_PTR v119;
__int64 v120;
__int64 v121;
__int64 v122;
int v123;
unsigned __int64 v124;
__int64 v125;
__int64 v126;
unsigned __int64 v127;
__int64 v128;
__int64 v129;
__int64 v130;
__int64 v131;
volatile unsigned __int64 QpcBias;
bool v133;
__int64 v134;
__int64 v135;
int v136;
unsigned __int64 v137;
__int64 v138;
__int64 v139;
unsigned __int64 v140;
__int64 v141;
UINT64 v142;
bool v143;
__int64 v144;
INT64 *v145;
INT64 v146;
unsigned __int64 v147;
unsigned __int64 v148;
unsigned __int8 v149;
int v150;
int v151;
UINT64 *v152;
INT64 v153;
_PPM_COORDINATED_SELECTION *v154;
unsigned int *Selection;
unsigned __int64 v156;
unsigned __int16 v157;
unsigned int v158;
unsigned __int64 v159;
unsigned int v160;
__int64 v161;
__int64 v162;
__int64 v163;
unsigned __int32 v164;
unsigned __int32 v165;
int v166;
int v167;
__int64 v168;
__int64 v169;
int v170;
__int64 v171;
signed __int32 v172[8];
ULONG_PTR BugCheckParameter4a;
UINT64 ExitTime;
UINT8 DeepSleepEnabled[8];
BYTE *v176;
int v177;
char v178;
char v179;
char v180;
unsigned __int8 v181;
UINT8 v182;
char v183;
char v184;
ULONG_PTR BugCheckParameter2;
__int64 v186;
__int64 v187;
unsigned int StateIndex;
int StateIndex_4;
INT64 v190;
unsigned int v191;
__int64 v192;
int v193;
PKSPIN_LOCK SpinLock;
unsigned __int16 *v195;
int v196;
__int64 v197;
unsigned __int16 *v198;
unsigned __int64 v199;
unsigned __int16 v200;
int v201;
__int16 v202;
int v203;
int v204;
__int64 v205;
__int64 v206;
UINT64 FromFrequency;
__int64 v208;
__int64 v209;
_PPM_COORDINATED_SELECTION *CoordinatedSelection;
ULONG_PTR v211;
INT64 v212[2];
__int128 v213;
__int64 v214;
_LIST_ENTRY LoadOrderListHead;
__int128 v216;
__int128 v217;
__int128 v218;
BYTE v219[16];
__int128 v220;
__int128 v221;
__int128 v222;
__int128 v223;
__int128 v224;
__int128 v225;
__int128 v226;
__int64 v227;
_KAFFINITY_EX result;
int v229;
INT64 v230;
_QWORD v231[21];
int v232;
v8 = *(_QWORD *)(BugCheckParameter4 + 0x8000);
v9 = 0;
v227 = 0i64;
v178 = 0;
v180 = 0;
LOBYTE(v193) = 0;
v11 = 0i64;
LOBYTE(StateIndex_4) = 0;
v12 = 0;
v183 = 0;
v181 = 0;
v197 = *(_QWORD *)(v8 + 488);
v211 = BugCheckParameter4;
*(_OWORD *)v219 = 0i64;
v220 = 0i64;
CoordinatedSelection = (_PPM_COORDINATED_SELECTION *)(v8 + 792);
v209 = a4;
StateIndex = a3;
LODWORD(BugCheckParameter2) = a2;
LODWORD(SpinLock) = 0;
v192 = 0i64;
v190 = 7i64;
v196 = -1;
v186 = v8;
v205 = v8 + 248i64 * a2;
v184 = 0;
LODWORD(v187) = 0;
v221 = 0i64;
v222 = 0i64;
v223 = 0i64;
v224 = 0i64;
v225 = 0i64;
v226 = 0i64;
if( !a8 || *(_BYTE *)(v8 + 539) || *(_BYTE *)(v8 + 248i64 * a2 + 1061) )
{
v179 = 0;
v182 = 3;
}
else
{
v179 = 1;
v182 = 4;
}
v191 = 3;
if( !*(_BYTE *)v8 )
{
if( a8 )
PpmIdleSetSynchronizationState((UINT32 *)(BugCheckParameter4 + 32832), 1u);
v13 = (unsigned __int16 *)(v8 + 240);
v195 = (unsigned __int16 *)(v8 + 240);
*(_QWORD *)(v8 + 240) = 1310721i64;
memset(v8 + 248, 0i64);
v14 = *(_DWORD *)(v8 + 548);
v15 = *(_QWORD *)(v8 + 552);
v214 = 0i64;
v212[1] = (INT64)&v213;
v16 = 0;
v212[0] = 1i64;
v213 = 0i64;
LOBYTE(v213) = 1;
BYTE2(v213) = 1;
if( v14 )
{
v17 = (_BYTE *)(v15 + 4);
while( 1 )
{
if( *v17 != 0xFF )
{
v18 = *((unsigned int *)v17 - 1);
DWORD1(v213) = (unsigned __int8)*v17;
KeGetPrcb(v18);
LODWORD(v187) = PpmTestAndLockProcessor(v19, v13, (INT64)v212);
v12 = v187;
if( (int)v187 < 0 )
break;
}
++v16;
v17 += 8;
if( v16 >= v14 )
goto LABEL_14;
}
}
else
{
LABEL_14:
v21 = *((_QWORD *)v13 + 1);
v199 = v21;
LoadOrderListHead = 0i64;
v201 = 0;
v216 = 0i64;
v202 = 0;
v200 = 0;
v198 = v13;
LABEL_15:
while( 1 )
{
v203 = 0;
v22 = v13 ? *v13 : v200 + 1;
if( !v21 )
break;
LABEL_21:
_BitScanForward64(&v23, v21);
v21 &= ~(1i64 << v23);
v203 = v23;
v199 = v21;
KeGetPrcb((unsigned int)KiProcessorNumberToIndexMappingTable[64 * v200 + (unsigned __int8)v23]);
v25 = v24;
v216 = v24;
v26 = *(_QWORD *)(v24 + 0x8000);
LoadOrderListHead.Flink = 0i64;
LoadOrderListHead.Blink = (_LIST_ENTRY *)PopIdleTransitionTimeout;
v27 = *(unsigned __int8(__fastcall **)(__int64))(v26 + 472);
v28 = *(_QWORD *)(v26 + 488);
BYTE12(v216) = 1;
if( !v27(v28) )
{
while( (*(_DWORD *)(v25 + 32832) & 0xFF000000) == 83886080 )
{
PpmIdleTransitionStall(&LoadOrderListHead, v29, v30, v31);
if( (*(unsigned __int8(__fastcall **)(_QWORD))(v26 + 472))(*(_QWORD *)(v26 + 488)) )
{
v21 = v199;
goto LABEL_15;
}
}
v12 = -1073741782;
LODWORD(v187) = -1073741782;
goto LABEL_27;
}
}
while( 1 )
{
v20 = (KSPIN_LOCK *)++v200;
if( v200 >= v22 )
break;
v199 = *(_QWORD *)&v13[4 * v200 + 4];
v21 = v199;
if( v199 )
goto LABEL_21;
}
v12 = 0;
LODWORD(v187) = 0;
}
LABEL_27:
if( v12 < 0 )
{
if( a8 )
PpmIdleSetSynchronizationState((UINT32 *)(BugCheckParameter4 + 32832), 0);
v32 = 0;
v33 = 1;
v191 = 1;
goto LABEL_303;
}
v8 = v186;
}
v20 = 0i64;
v34 = *(_WORD *)(v8 + 240);
v195 = (unsigned __int16 *)(v8 + 240);
if( v34 )
{
while( !*(_QWORD *)(v8 + 240 + 8i64 * (unsigned __int16)v20 + 8) )
{
LOWORD(v20) = (_WORD)v20 + 1;
if( (unsigned __int16)v20 >= v34 )
goto LABEL_37;
}
*(_WORD *)(v8 + 48) |= 0x20u;
}
LABEL_37:
v35 = 0;
v36 = 0;
v37 = 0;
v38 = 0i64;
v208 = 2i64;
if( PpmPerfQosEnabled && PpmPerfQosManageIdleProcessors && *(_DWORD *)(BugCheckParameter4 + 33264) != 2 )
{
v38 = *(_QWORD *)(BugCheckParameter4 + 33136);
if( v38 && *(_BYTE *)(v38 + 125) )
{
v36 = 1;
_disable();
v37 = (v232 & 0x200) != 0;
KxAcquireSpinLock((UINT64 *)(v38 + 128));
}
if( (*(_BYTE *)(BugCheckParameter4 + 33272) & 4) == 0 )
{
v39 = __rdtsc();
v20 = (KSPIN_LOCK *)(v39 - *(_QWORD *)(BugCheckParameter4 + 33248));
v40 = *(_QWORD *)(BugCheckParameter4 + 33256);
if( (unsigned __int64)v20 < v40 && !*(_BYTE *)(BugCheckParameter4 + 33213) )
{
v41 = *(_DWORD *)(BugCheckParameter4 + 236);
v35 = 1;
if( (v41 & 0x300) == 0 )
{
LOBYTE(v9) = 1;
v42 = v41 & 0xFFFFFCFF | 0x200;
LABEL_52:
*(_DWORD *)(BugCheckParameter4 + 236) = v42;
KeUpdatePendingQosRequest(BugCheckParameter4);
goto LABEL_53;
}
goto LABEL_53;
}
*(_QWORD *)(BugCheckParameter4 + 33248) = v39;
*(_BYTE *)(BugCheckParameter4 + 33213) = (unsigned __int64)v20 >= 2 * v40;
}
*(_DWORD *)(BugCheckParameter4 + 33264) = 2;
PpmPerfArbitratorApplyProcessorState(BugCheckParameter4, 1u, 0, 512i64);
*(_BYTE *)(BugCheckParameter4 + 236) = 2;
}
v43 = *(_DWORD *)(BugCheckParameter4 + 236);
if( (v43 & 0x300) != 0 )
{
v42 = v43 & 0xFFFFFCFF;
goto LABEL_52;
}
LABEL_53:
if( v36 )
{
KxReleaseSpinLock((UINT64 *)(v38 + 128));
if( v37 )
_enable();
}
if( (_BYTE)v9 )
{
v9 = 0;
v12 = -1073741802;
v33 = 0;
v191 = 0;
LODWORD(v187) = -1073741802;
if( a8 )
PpmIdleSetSynchronizationState((UINT32 *)(BugCheckParameter4 + 32832), 0);
v11 = 0i64;
v32 = 0;
goto LABEL_302;
}
v44 = v179;
v45 = BugCheckParameter2;
v46 = v205;
*(_BYTE *)(BugCheckParameter4 + 32816) = v179;
*(_DWORD *)(BugCheckParameter4 + 32820) = v45;
if( a8 )
{
*(_BYTE *)(BugCheckParameter4 + 32817) = *(_BYTE *)(v46 + 1058) == 0;
PpmIdleSetSynchronizationState((UINT32 *)(BugCheckParameter4 + 32832), 2u);
}
v47 = v186;
if( v35 || *(_BYTE *)(v186 + 6) || *(_BYTE *)(v186 + 7) )
{
v48 = -1i64;
v183 = 1;
if( *(_BYTE *)(v186 + 6) )
{
v49 = *(_QWORD *)(v186 + 520);
if( v49 <= KeMaximumIncrement )
v49 = KeMaximumIncrement;
v48 = a7 + KeMaximumIncrement + v49;
}
if( *(_BYTE *)(v186 + 7) )
{
v50 = *((_DWORD *)PpmCurrentProfile + 684 * dword_140C23D0C + 48);
if( v48 >= a7 + (unsigned __int64)(unsigned int)(10 * v50) )
v48 = a7 + (unsigned int)(10 * v50);
}
if( v35 && v48 >= a7 + PpmPerfQosIdleExpirationTimeout )
v48 = a7 + PpmPerfQosIdleExpirationTimeout;
*(_QWORD *)(BugCheckParameter4 + 32808) = v48;
_interlockedbittestandset64(
(volatile signed __int32 *)(*(_QWORD *)(BugCheckParameter4 + 192) + 72i64),
*(unsigned __int8 *)(BugCheckParameter4 + 209));
}
if( *(_BYTE *)(v46 + 1057) || v35 )
goto LABEL_135;
v51 = *(_QWORD *)(BugCheckParameter4 + 200);
v52 = *(_QWORD *)(BugCheckParameter4 + 192);
v180 = 1;
_m_prefetchw((const void *)(v52 + 64));
v53 = _InterlockedOr64((volatile signed __int64 *)(v52 + 64), v51);
v54 = *(_QWORD *)(BugCheckParameter4 + 0x8000);
v55 = 0;
v56 = StateIndex;
v57 = v53;
v187 = v53;
HIDWORD(v190) = 0;
if( v44 )
{
HIDWORD(v190) = 1;
}
else if( StateIndex == -1 )
{
v58 = 0;
if( *(_WORD *)(v54 + 240) )
{
v59 = (unsigned __int64 *)(v54 + 248);
v60 = *(unsigned __int16 *)(v54 + 240);
do
{
v61 = *v59++;
v58 += (unsigned int)((0x101010101010101i64
* ((((v61 - ((v61 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v61 - ((v61 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
+ ((((v61 - ((v61 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v61 - ((v61 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24;
--v60;
}
while( v60 );
v57 = v187;
v56 = StateIndex;
v47 = v186;
}
if( v58 != (_DWORD)KeNumberProcessors_0 - 1 )
goto LABEL_95;
v44 = v179;
HIDWORD(v190) = 2;
}
v62 = *(_DWORD *)(v54 + 12);
if( !v62 || (v63 = v62 - 1, (*(_DWORD *)(v54 + 12) = v63) == 0) )
{
ExitSamplingCountdown = PpmGetExitSamplingCountdown();
v55 = 0;
*(_DWORD *)(v54 + 12) = ExitSamplingCountdown;
if( ExitSamplingCountdown )
v55 = v65;
}
if( v55 )
{
*(_BYTE *)(v54 + 3) = 1;
if( !v44 )
{
LABEL_95:
LODWORD(SpinLock) = 1;
goto LABEL_96;
}
*(_QWORD *)(v54 + 56) = -1i64;
}
if( !v44 )
goto LABEL_95;
LABEL_96:
v66 = ((__int64(__fastcall *)(_QWORD))off_140C00740[0])((unsigned int)SpinLock);
v67 = *(_DWORD *)(BugCheckParameter4 + 12504);
v12 = v66;
LODWORD(v187) = v66;
if( v67 )
{
v12 = -2147483631;
goto LABEL_98;
}
if( v66 < 0 )
{
LABEL_99:
if( a8 )
PpmIdleSetSynchronizationState((UINT32 *)(BugCheckParameter4 + 32832), 0);
v9 = 0;
v33 = 0;
v191 = 0;
v32 = 0;
LABEL_292:
_interlockedbittestandreset64(
(volatile signed __int32 *)(*(_QWORD *)(BugCheckParameter4 + 192) + 64i64),
*(unsigned __int8 *)(BugCheckParameter4 + 209));
if( v178 && *(_BYTE *)(BugCheckParameter4 + 32410) )
KeWakeProcessor();
if( (_BYTE)StateIndex_4 && v12 >= 0 )
v152 = (UINT64 *)&v196;
else
v152 = 0i64;
KeResumeClockTimerFromIdle(v152);
off_140C00750();
KeAccumulateTicks(
(_KPRCB *)BugCheckParameter4,
*(unsigned int *)(BugCheckParameter4 + 12596),
KUSER_SHARED_DATA.TickCount.LowPart,
0,
0);
goto LABEL_301;
}
if( *(_BYTE *)v47 == 1 )
{
v68 = *(_QWORD *)(BugCheckParameter4 + 200) | v57;
v69 = *(unsigned __int8 *)(BugCheckParameter4 + 208);
memset((INT64)&result, 0i64);
v70 = PpmPlatformStates;
if( PpmPlatformStates )
{
*(_DWORD *)&result.Count = 1310721;
memset((INT64)&result.Reserved, 0i64);
if( result.Count <= (unsigned __int16)v69 )
result.Count = v69 + 1;
result.Bitmap[v69] |= v68;
v71 = 0;
v72 = v186;
v73 = *(_QWORD *)(v186 + 752);
if( *(_DWORD *)(v73 + 4) )
{
while( 1 )
{
if( *(_DWORD *)(v73 + 4i64 * v71 + 8) == -1 )
{
if( (unsigned int)KeIsSubsetAffinityEx(
(_KAFFINITY_EX *)(v70
+ 384i64 * *(unsigned int *)(*(_QWORD *)(v72 + 784) + 24i64 * v71 + 4)
+ 128),
&result) )
{
v12 = -1073741802;
LABEL_98:
LODWORD(v187) = v12;
goto LABEL_99;
}
v72 = v186;
}
if( ++v71 >= *(_DWORD *)(v73 + 4) )
goto LABEL_112;
}
}
v47 = v186;
}
else
{
LABEL_112:
v47 = v186;
}
}
if( v55 )
*(_WORD *)(v47 + 48) |= 0x200u;
v74 = v179;
if( v179 )
{
v184 = 1;
_InterlockedIncrement(&PpmNonInterruptibleCount);
CurrentPrcb = KeGetCurrentPrcb();
v76 = KiClockTimerOwner;
if( (*((_BYTE *)CurrentPrcb + 34) & 1) != 0 )
{
off_140C00888[0]();
*((_BYTE *)CurrentPrcb + 34) &= ~1u;
v74 = v179;
}
if( *((_DWORD *)CurrentPrcb + 9) == v76 )
++dword_140C31348;
if( *((_BYTE *)CurrentPrcb + 33) )
*((_BYTE *)CurrentPrcb + 33) = 0;
}
if( *(_BYTE *)(v47 + 540) )
{
if( v55 )
{
v77 = (unsigned __int8)StateIndex_4;
if( !v74 )
v77 = 1;
StateIndex_4 = v77;
}
if( a5 && v56 != -1 && PpmDripsStateIndex != -1 )
{
v78 = (unsigned __int8)v193;
if( *(_BYTE *)v47 == 1 )
v78 = 1;
v193 = v78;
}
KePrepareClockTimerForIdle(a5, (unsigned __int8)v193, *(_QWORD *)(v47 + 520));
}
v45 = BugCheckParameter2;
LABEL_135:
v79 = *(KSPIN_LOCK **)(BugCheckParameter4 + 33192);
SpinLock = v79;
if( v79 )
{
PpmIdleUpdateConcurrency(v79, a6, 1, 1);
v80 = *(KSPIN_LOCK **)(BugCheckParameter4 + 33200);
if( v80 )
PpmIdleUpdateConcurrency(v80, a6, 1, 1);
}
*(_DWORD *)(v47 + 20) = v45;
v81 = __rdtsc();
if( (*(_QWORD *)(BugCheckParameter4 + 34208) & 0x8000000000i64) != 0 )
{
v82 = __readmsr(0xDB2u);
v9 = 0;
}
else
{
v9 = 0;
v82 = 0i64;
}
v83 = a6 - *(_QWORD *)(BugCheckParameter4 + 32880);
_InterlockedExchangeAdd64((volatile signed __int64 *)(BugCheckParameter4 + 32896), v83);
if( (*(_QWORD *)(BugCheckParameter4 + 34208) & 0x8000000000i64) != 0 )
*(_QWORD *)(BugCheckParameter4 + 32968) += PpmConvertTime(
v83,
v81 - *(_QWORD *)(BugCheckParameter4 + 32848),
v82 - *(_QWORD *)(BugCheckParameter4 + 32960));
v84 = *(_QWORD *)(BugCheckParameter4 + 32848);
*(_QWORD *)(BugCheckParameter4 + 32880) = a6;
if( v81 > v84 )
*(_QWORD *)(BugCheckParameter4 + 32856) += v81 - v84;
*(_QWORD *)(BugCheckParameter4 + 32848) = v81;
if( (*(_QWORD *)(BugCheckParameter4 + 34208) & 0x8000000000i64) != 0 )
*(_QWORD *)(BugCheckParameter4 + 32960) = v82;
PpmUpdatePerformanceFeedback(BugCheckParameter4, 0, 0, 1, 0i64);
if( PopSnapEnergyCounters )
PopSnapEnergyCounters(*(unsigned int *)(BugCheckParameter4 + 36), 0i64, 0i64);
v88 = v186;
_InterlockedExchange64((volatile __int64 *)(BugCheckParameter4 + 32800), a6);
v89 = *(__int64(__fastcall **)(__int64, _QWORD, _QWORD, _QWORD, _QWORD))(v186 + 416);
if( v89 )
{
v12 = v89(
v197,
(unsigned int)BugCheckParameter2,
StateIndex,
*(unsigned int *)(v186 + 796),
*(_QWORD *)(v186 + 808));
LODWORD(v187) = v12;
}
if( v12 >= 0 )
{
v90 = StateIndex;
v91 = *(_QWORD *)(v186 + 808);
LODWORD(v92) = *(_DWORD *)(v186 + 796);
v181 = 1;
if( StateIndex != -1 )
{
v93 = PpmPlatformStates + 384i64 * StateIndex;
PpmEventEnterPlatformIdleState(StateIndex);
if( !qword_140C4FD80 && StateIndex == (_DWORD)PlatformIdleStateIndex )
_InterlockedCompareExchange64(
&qword_140C4FD80,
*(signed __int64 *)&KUSER_SHARED_DATA.InterruptTime.LowPart,
0i64);
if( a5 )
{
*(_BYTE *)(PpmPlatformStates + 56) = 1;
++*(_DWORD *)(*(_QWORD *)(PpmPlatformStates + 48) + 8i64);
}
if( *(_BYTE *)(v93 + 120) )
{
KdPowerTransitionEx(2147483652i64, 1);
KdCallPowerHandlers(PowerDeviceD3);
}
v88 = v186;
}
for( ; (_DWORD)v92; *(_DWORD *)(v94 + 320) = v95 & 0xF8FFFFFF | 0x4000000 )
{
v92 = (unsigned int)(v92 - 1);
v94 = PpmPlatformStates + 384i64 * *(unsigned int *)(v91 + 4 * v92);
*(_QWORD *)(v94 + 328) = a6;
v95 = *(_DWORD *)(v94 + 320);
if( !*(_DWORD *)(PpmPlatformStates + 4) )
v95 ^= ((unsigned __int16)v95 ^ (unsigned __int16)*((_DWORD *)KeGetPcr() + 105)) & 0xFFF;
}
if( v90 != -1 )
*(_WORD *)(v88 + 48) |= 0x10u;
v218 = 0i64;
if( a8 )
PpmIdleSetSynchronizationState((UINT32 *)(BugCheckParameter4 + 32832), v182);
if( v180 )
{
v178 = 0;
if( *(_BYTE *)(v205 + 1056) >= 2u )
{
v96 = byte_140C10DE0;
v217 = 0i64;
if( byte_140C10DE0 == -1 )
{
v97 = __cpuid(1, 0);
v96 = 0;
*(_QWORD *)&v217 = __PAIR64__(EBX(v97), EAX(v97));
*((_QWORD *)&v217 + 1) = __PAIR64__(EDX(v97), ECX(v97));
if( (SDWORD2(v217) & 0x80000000) != 0 )
{
v96 = 0;
v100 = __cpuid(1073741825, 0);
v99 = ECX(v100);
v98 = EDX(v100);
*(_QWORD *)&v217 = __PAIR64__(EBX(v100), EAX(v100));
if( (_DWORD)v217 == 1986945624 )
v96 = 1;
*((_QWORD *)&v217 + 1) = __PAIR64__(v98, v99);
}
byte_140C10DE0 = v96;
}
if( !v96 )
{
v101 = KeGetCurrentPrcb();
if( *((_BYTE *)v101 + 141) == 1 )
{
v178 = 0;
}
else
{
v102 = *((unsigned int *)v101 + 9);
*((_BYTE *)v101 + 32410) = 1;
_InterlockedOr64(
(volatile signed __int64 *)(8i64 * ((unsigned int)KiProcessorIndexToNumberMappingTable[v102] >> 6)
+ 12759400
+ 0x140000000i64),
1i64 << (KiProcessorIndexToNumberMappingTable[v102] & 0x3F));
if( !*((_BYTE *)v101 + 32410) )
{
_InterlockedAnd64(
(volatile signed __int64 *)(8i64
* ((unsigned int)KiProcessorIndexToNumberMappingTable[*((unsigned int *)v101
+ 9)] >> 6)
+ 12759400
+ 0x140000000i64),
~(1i64 << (KiProcessorIndexToNumberMappingTable[*((unsigned int *)v101 + 9)] & 0x3F)));
if( KiFlushPcid )
{
v103 = __readcr3();
__writecr3(v103);
if( !*(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
KiSetUserTbFlushPending();
}
else
{
v104 = __readcr4();
if( (v104 & 0x20080) != 0 )
{
__writecr4(v104 ^ 0x80);
__writecr4(v104);
}
else
{
v105 = __readcr3();
__writecr3(v105);
}
}
}
v178 = *((_BYTE *)v101 + 32410);
}
}
}
}
if( (*(_BYTE *)(BugCheckParameter4 + 249) & 1) != 0 && (v106 = *(_BYTE *)(BugCheckParameter4 + 250)) != 0 )
{
*(_BYTE *)(BugCheckParameter4 + 248) |= 1u;
v107 = v106;
}
else
{
v107 = 0;
}
_m_prefetchw((const void *)(BugCheckParameter4 + 254));
v108 = *(_WORD *)(BugCheckParameter4 + 254) & 4;
if( v108 )
{
if( (*(_BYTE *)(BugCheckParameter4 + 248) & 1) != 0 )
{
v109 = *(_BYTE *)(BugCheckParameter4 + 250);
if( (v109 & 3) == 0 )
{
v107 |= 2u;
*(_BYTE *)(BugCheckParameter4 + 250) = v109 | 2;
__writemsr(0x48u, v109 | 2u);
}
}
_InterlockedOr16((volatile signed __int16 *)(BugCheckParameter4 + 254), 2u);
v110 = *(_QWORD *)(BugCheckParameter4 + 11696);
_m_prefetchw((const void *)(v110 + 254));
do
v111 = *(_WORD *)(v110 + 254);
while( v111 != _InterlockedCompareExchange16((volatile signed __int16 *)(v110 + 254), v111 & 0xFFE4 | 0xA, v111) );
}
v112 = v186;
LODWORD(v187) = (*(__int64(__fastcall **)(__int64, __int64, _QWORD, _QWORD, _DWORD, _DWORD, _QWORD))(v186 + 424))(
v197,
v209,
(unsigned int)BugCheckParameter2,
v90,
v107,
*(_DWORD *)(v186 + 796),
*(_QWORD *)(v186 + 808));
v12 = v187;
if( v108 )
{
*((_QWORD *)&v85 + 1) = *(_QWORD *)(BugCheckParameter4 + 11696);
_m_prefetchw((const void *)(*((_QWORD *)&v85 + 1) + 254i64));
do
v113 = *(_WORD *)(*((_QWORD *)&v85 + 1) + 254i64);
while( v113 != _InterlockedCompareExchange16(
(volatile signed __int16 *)(*((_QWORD *)&v85 + 1) + 254i64),
v113 & 0xFFF5 | 2,
v113) );
if( (*(_WORD *)(BugCheckParameter4 + 254) & 0x10) == 0 )
{
v114 = *(_BYTE *)(BugCheckParameter4 + 250);
if( (v114 & 2) != 0 )
{
*(_BYTE *)(BugCheckParameter4 + 250) = v114 & 0xFD;
*((_QWORD *)&v85 + 1) = 0i64;
__writemsr(0x48u, v114 & 0xFD);
}
}
}
*(_BYTE *)(BugCheckParameter4 + 248) &= ~1u;
if( v178 )
{
v115 = *(_BYTE *)(BugCheckParameter4 + 32410);
v178 = 0;
if( v115 )
{
*(_QWORD *)&v85 = KeGetCurrentPrcb();
v86 = 0x140000000ui64;
v116 = *(unsigned int *)(v85 + 36);
*(_BYTE *)(v85 + 32410) = 0;
*((_QWORD *)&v85 + 1) = (unsigned int)KiProcessorIndexToNumberMappingTable[v116];
_InterlockedAnd64(
(volatile signed __int64 *)&KeSleepingProcessors.Bitmap[(unsigned __int64)DWORD2(v85) >> 6],
~(1i64 << (KiProcessorIndexToNumberMappingTable[v116] & 0x3F)));
v117 = __readcr4();
if( (v117 & 0x20080) != 0 )
{
__writecr4(v117 ^ 0x80);
__writecr4(v117);
}
else
{
v118 = __readcr3();
__writecr3(v118);
}
}
}
if( *(int *)(v112 + 64) < 0 )
{
if( v12 >= 0 )
v12 = *(_DWORD *)(v112 + 64);
LODWORD(v187) = v12;
}
v206 = 0i64;
}
v119 = HalpPerformanceCounter;
if( *(_DWORD *)(HalpPerformanceCounter + 228) != 5 )
{
v133 = *(_DWORD *)(HalpPerformanceCounter + 220) == 64;
FromFrequency = *(_QWORD *)(HalpPerformanceCounter + 192);
if( v133 )
{
if( (*(_DWORD *)(HalpPerformanceCounter + 224) & 0x10000) != 0 )
v141 = *(_QWORD *)(HalpPerformanceCounter + 72)
+ (unsigned int)(*(_DWORD *)(HalpPerformanceCounter + 80) * *((_DWORD *)KeGetPcr() + 105));
else
v141 = *(_QWORD *)(HalpPerformanceCounter + 72);
*(_QWORD *)&v85 = (*(__int64(__fastcall **)(__int64))(HalpPerformanceCounter + 112))(v141);
QpcBias = *(_QWORD *)(v119 + 208);
*((_QWORD *)&v85 + 1) = v85;
}
else
{
do
{
QpcBias = *(_QWORD *)(v119 + 208);
do
{
v134 = *(_QWORD *)(v119 + 200);
HalpTimerGetInternalData((KDPC *)v119, *((PVOID *)&v85 + 1), (PVOID)v86, v87);
v86 = (*(__int64(__fastcall **)(__int64))(v119 + 112))(v135);
_InterlockedOr(v172, 0);
*(_QWORD *)&v85 = *(_QWORD *)(v119 + 200);
}
while( v134 != (_QWORD)v85 );
}
while( QpcBias != *(_QWORD *)(v119 + 208) );
v136 = *(_DWORD *)(v119 + 220);
v137 = v134 ^ v86;
if( _bittest64((const __int64 *)&v137, (unsigned __int8)(v136 - 1)) )
{
v138 = 1i64 << v136;
v139 = -1i64;
if( v136 != 64 )
v139 = v138 - 1;
v140 = v134 & v139;
*((_QWORD *)&v85 + 1) = v86 | v134 ^ v140;
if( v86 < v140 )
*((_QWORD *)&v85 + 1) += v138;
_InterlockedCompareExchange64((volatile signed __int64 *)(v119 + 200), *((signed __int64 *)&v85 + 1), v85);
}
else if( v136 == 64 )
{
*((_QWORD *)&v85 + 1) = v86;
}
else
{
*((_QWORD *)&v85 + 1) = v86 | v134 & ~((1i64 << v136) - 1);
}
}
goto LABEL_254;
}
FromFrequency = 10000000i64;
if( HalpTimerReferencePage )
{
if( (*(_DWORD *)(HalpPerformanceCounter + 224) & 0x10000) != 0 )
v130 = *(_QWORD *)(HalpPerformanceCounter + 72)
+ (unsigned int)(*(_DWORD *)(HalpPerformanceCounter + 80) * *((_DWORD *)KeGetPcr() + 105));
else
v130 = *(_QWORD *)(HalpPerformanceCounter + 72);
v131 = (*(__int64(__fastcall **)(__int64))(HalpPerformanceCounter + 112))(v130);
QpcBias = KUSER_SHARED_DATA.QpcBias;
v85 = (unsigned __int64)v131 * (unsigned __int128)*((unsigned __int64 *)HalpTimerReferencePage + 1);
LABEL_254:
v129 = *((_QWORD *)&v85 + 1) + QpcBias;
v192 = v129;
goto LABEL_255;
}
if( *(_DWORD *)(HalpPerformanceCounter + 220) == 64 )
{
HalpTimerGetInternalData((KDPC *)HalpPerformanceCounter, *((PVOID *)&v85 + 1), (PVOID)v86, v87);
*(_QWORD *)&v85 = (*(__int64(__fastcall **)(__int64))(v119 + 112))(v128);
v120 = *(_QWORD *)(v119 + 208);
*((_QWORD *)&v85 + 1) = v85;
}
else
{
do
{
v120 = *(_QWORD *)(v119 + 208);
do
{
v121 = *(_QWORD *)(v119 + 200);
HalpTimerGetInternalData((KDPC *)v119, *((PVOID *)&v85 + 1), (PVOID)v86, v87);
v86 = (*(__int64(__fastcall **)(__int64))(v119 + 112))(v122);
_InterlockedOr(v172, 0);
*(_QWORD *)&v85 = *(_QWORD *)(v119 + 200);
}
while( v121 != (_QWORD)v85 );
}
while( v120 != *(_QWORD *)(v119 + 208) );
v123 = *(_DWORD *)(v119 + 220);
v124 = v121 ^ v86;
if( _bittest64((const __int64 *)&v124, (unsigned __int8)(v123 - 1)) )
{
v125 = 1i64 << v123;
v126 = -1i64;
if( v123 != 64 )
v126 = v125 - 1;
v127 = v126 & v121;
*((_QWORD *)&v85 + 1) = v86 | v121 ^ v126 & v121;
if( v86 < v127 )
*((_QWORD *)&v85 + 1) += v125;
_InterlockedCompareExchange64((volatile signed __int64 *)(v119 + 200), *((signed __int64 *)&v85 + 1), v85);
}
else if( v123 == 64 )
{
*((_QWORD *)&v85 + 1) = v86;
}
else
{
*((_QWORD *)&v85 + 1) = v86 | v121 & ~((1i64 << v123) - 1);
}
}
v129 = HalpTimerScaleCounter(v120 + *((_QWORD *)&v85 + 1), *(_QWORD *)(v119 + 192), 0x989680ui64);
v192 = v129;
LABEL_255:
if( v119 != HalpOriginalPerformanceCounter && HalpOriginalPerformanceCounter )
{
v142 = *(_QWORD *)(HalpOriginalPerformanceCounter + 192);
if( *(_DWORD *)(HalpOriginalPerformanceCounter + 228) == 5 )
v142 = 10000000i64;
v129 = HalpTimerScaleCounter(v129, FromFrequency, v142);
v192 = v129;
}
_InterlockedExchange64((volatile __int64 *)(BugCheckParameter4 + 32800), 0i64);
if( *(_BYTE *)(BugCheckParameter4 + 32977) )
{
_disable();
v143 = (v232 & 0x200) != 0;
KxAcquireSpinLock((UINT64 *)(BugCheckParameter4 + 32840));
v144 = 2i64;
v145 = (INT64 *)(BugCheckParameter4 + 32864);
do
{
v146 = *v145;
if( *v145 && *(_BYTE *)(v146 + 34) )
{
PpmPerfFeedbackCounterUpdate(v146);
v144 = v208;
}
++v145;
v208 = --v144;
}
while( v144 );
KxReleaseSpinLock((UINT64 *)(BugCheckParameter4 + 32840));
if( v143 )
_enable();
}
v147 = __rdtsc();
if( (*(_QWORD *)(BugCheckParameter4 + 34208) & 0x8000000000i64) != 0 )
v148 = __readmsr(0xDB2u);
else
v148 = 0i64;
*(_QWORD *)(BugCheckParameter4 + 32880) = v129;
*(_QWORD *)(BugCheckParameter4 + 32848) = v147;
if( (*(_QWORD *)(BugCheckParameter4 + 34208) & 0x8000000000i64) != 0 )
*(_QWORD *)(BugCheckParameter4 + 32960) = v148;
v20 = SpinLock;
if( SpinLock )
{
PpmIdleUpdateConcurrency(SpinLock, v129, 0, 1);
v20 = *(KSPIN_LOCK **)(BugCheckParameter4 + 33200);
if( v20 )
PpmIdleUpdateConcurrency(v20, v129, 0, 1);
}
*(_QWORD *)(BugCheckParameter4 + 32784) = v129 - a6;
if( a8 )
{
v149 = PpmIdleSetSynchronizationState((UINT32 *)(BugCheckParameter4 + 32832), 0);
if( v12 >= 0 && v149 != 8 && v179 )
KeBugCheckEx(0xA0u, 0x702ui64, (unsigned int)BugCheckParameter2, v149, BugCheckParameter4);
*(_BYTE *)(BugCheckParameter4 + 32817) = 0;
}
v32 = v181;
if( v180 )
{
if( v181
&& v12 >= 0
&& PpmPlatformStates
&& *(_BYTE *)(PpmPlatformStates + 56)
&& PpmDripsStateIndex != -1
&& *(_DWORD *)(384i64 * (unsigned int)PpmDripsStateIndex + PpmPlatformStates + 320) )
{
v150 = KeQueryWakeSource(&v190, v219);
v151 = v190;
v33 = 3;
if( v150 < 0 )
v151 = 3;
LODWORD(v190) = v151;
}
else
{
v33 = 3;
}
goto LABEL_292;
}
v33 = 3;
LABEL_301:
v11 = v192;
LABEL_302:
v13 = v195;
LABEL_303:
LOBYTE(v20) = 1;
((void(__fastcall *)(KSPIN_LOCK *))off_140C009A8[0])(v20);
if( v183 )
{
_interlockedbittestandreset64(
(volatile signed __int32 *)(*(_QWORD *)(BugCheckParameter4 + 192) + 72i64),
*(unsigned __int8 *)(BugCheckParameter4 + 209));
*(_QWORD *)(BugCheckParameter4 + 32808) = -1i64;
}
v153 = v32;
v154 = CoordinatedSelection;
v177 = v190;
v176 = v219;
LOBYTE(BugCheckParameter4a) = v33 != 3;
LODWORD(SpinLock) = PpmExitCoordinatedIdle(
(_KPRCB *)BugCheckParameter4,
CoordinatedSelection,
v153,
(unsigned int)v12,
BugCheckParameter4a,
v11,
a5);
if( v33 == 3 )
{
(*(void(__fastcall **)(__int64, _QWORD, _QWORD, _QWORD, unsigned int *))(v186 + 456))(
v197,
(unsigned int)BugCheckParameter2,
(unsigned int)SpinLock,
v154->SelectedStates,
v154->Selection);
}
else if( !*(_BYTE *)v186 )
{
(*(void(__fastcall **)(__int64, _QWORD))(v186 + 464))(v197, v33);
}
Selection = v154->Selection;
for( LODWORD(v154) = v154->SelectedStates;
(_DWORD)v154;
*(_DWORD *)(384i64 * Selection[(_QWORD)v154] + PpmPlatformStates + 320) = 0 )
{
v154 = (_PPM_COORDINATED_SELECTION *)(unsigned int)((_DWORD)v154 - 1);
}
if( v184 )
_InterlockedDecrement(&PpmNonInterruptibleCount);
memset((INT64)v231, 0i64);
v229 = 1310721;
memset((INT64)&v230, 0i64);
LODWORD(v11) = *((_DWORD *)KeGetPcr() + 105);
v156 = *((_QWORD *)v13 + 1);
v157 = 0;
while( 1 )
{
v204 = 0;
v158 = v13 ? *v13 : v157 + 1;
if( !v156 )
break;
LABEL_320:
_BitScanForward64(&v159, v156);
v156 &= ~(1i64 << v159);
v204 = v159;
v160 = KiProcessorNumberToIndexMappingTable[64 * v157 + (unsigned __int8)v159];
KeGetPrcb(v160);
v162 = v161;
v163 = *(_QWORD *)(v161 + 0x8000);
_m_prefetchw((const void *)(v161 + 32832));
v164 = *(_DWORD *)(v161 + 32832);
do
{
v165 = v164;
v166 = v164 ^ (v164 ^ (v164 - 1)) & 0xFFFFFF;
if( (v166 & 0xFFFFFF) == 0 )
{
if( HIBYTE(v164) == 5 )
{
v166 = v166 & 0xFFFFFF | 0x4000000;
}
else if( HIBYTE(v164) == 7 )
{
v166 = v166 & 0xFFFFFF | 0x6000000;
}
}
v164 = _InterlockedCompareExchange((volatile signed __int32 *)(v162 + 32832), v166, v164);
}
while( v164 != v165 );
if( HIBYTE(v166) == 6 )
KeAddProcessorAffinityEx(&v229, v160);
_InterlockedAnd64(
(volatile signed __int64 *)(v163
+ 8 * ((unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v11] >> 6)
+ 80),
~(1i64 << (KiProcessorIndexToNumberMappingTable[v11] & 0x3F)));
v13 = v195;
KeRemoveProcessorAffinityEx(v195, v160);
v9 = 0;
}
while( ++v157 < v158 )
{
v156 = *(_QWORD *)&v13[4 * v157 + 4];
if( v156 )
goto LABEL_320;
}
v167 = (int)SpinLock;
v168 = v211;
if( (_WORD)v229 )
{
while( !v231[v9] )
{
if( ++v9 >= (unsigned __int16)v229 )
goto LABEL_335;
}
HalRequestIpi(0, &v229);
}
LABEL_335:
v169 = v186;
v170 = v187;
if( *(_BYTE *)(v186 + 3) )
{
LODWORD(v176) = v167;
*(_DWORD *)DeepSleepEnabled = BugCheckParameter2;
LODWORD(ExitTime) = HIDWORD(v190);
LODWORD(BugCheckParameter4a) = v196;
PpmIdleCompleteExitLatencyTrace(
v168,
v187,
v179,
v192,
BugCheckParameter4a,
ExitTime,
*(_QWORD *)DeepSleepEnabled,
v176);
}
v171 = v191;
*(_DWORD *)(v169 + 68) = v191;
*(_DWORD *)(v169 + 64) = v170;
return v171;
}Referenced by:
PoIdle