PpmIdleSelectStates
__int64 __fastcall PpmIdleSelectStates(
__int64 a1,
unsigned __int64 a2,
unsigned __int64 *a3,
char *a4,
unsigned int *a5,
int *a6,
_QWORD *a7,
bool *a8){
__int64 v9;
__int64 v10;
__int64 v11;
unsigned __int64 TimeUpdateLock;
unsigned __int64 BaselineInterruptTimeQpc;
__int64 v14;
LARGE_INTEGER PerformanceCounter;
__int64 v16;
LARGE_INTEGER v17;
_QWORD *v18;
unsigned __int64 v19;
INT64 v20;
UINT64 *v21;
int v22;
char v23;
UINT64 v24;
char v25;
__int64 v26;
__int64 v27;
unsigned __int64 v28;
char v29;
int v30;
UINT64 v31;
__int16 v32;
bool v33;
unsigned __int64 v34;
__int64 v35;
unsigned int v36;
unsigned int v37;
unsigned int i;
ULONG v39;
char v40;
unsigned int v41;
__int64(__fastcall *v42)(_QWORD, __int64);
UINT64 v43;
unsigned int v44;
char v45;
char v46;
__int64 v47;
__int64 v48;
unsigned int v49;
__int64 v50;
__int64 v51;
unsigned __int64 v52;
UINT64 v53;
CHAR v54;
UINT64 v55;
char v56;
int v57;
int v58;
UINT64 v59;
UINT64 v60;
unsigned int v61;
unsigned int v62;
unsigned int j;
ULONG v64;
__int64 v65;
__int64 v66;
__int64 v67;
__int64 v68;
unsigned int v69;
__int64 v70;
bool v71;
int v72;
_QWORD *v73;
__int64 v74;
int v75;
unsigned int(__fastcall *v76)(_QWORD, _QWORD);
unsigned int(__fastcall *v77)(_QWORD, _QWORD, __int64);
struct _KPRCB *CurrentPrcb;
__int64 v79;
unsigned int v80;
unsigned int NextNode;
__int64 v82;
char v83;
UINT8 *v84;
__int64 v85;
__int64 v86;
__int64 v87;
__int64 v88;
unsigned __int64 v89;
__int64 v90;
__int64 v91;
unsigned __int64 v92;
char v93;
UINT8 *v94;
__int64 v95;
__int64 v96;
__int64 v97;
__int64 v98;
UINT64 v99;
__int64 v100;
__int64 v101;
UINT64 v102;
unsigned __int64 v103;
signed __int64 v104;
INT64 v105;
__int64 v106;
unsigned int v107;
__int64 v108;
__int64 v109;
__int64 v110;
_KPRCB *v111;
char v112;
int v113;
UINT64 v114;
UINT64 v115;
INT64 v116;
UINT64 v117;
unsigned int(__fastcall *v118)(_QWORD, _QWORD, _QWORD);
UINT64 v119;
int v120;
_DWORD *v121;
_DWORD *v122;
__int64 *v123;
__int64 v124;
__int64 v125;
UINT64 StateIndex;
UINT64 EntryPriority;
char v128;
CHAR v129;
char v130;
UINT ProcessorState;
int v132;
INT64 v133;
INT64 v134;
unsigned __int64 v135;
INT64 v136;
unsigned int v137;
int v138;
int v139;
int v140;
INT64 v141;
unsigned int *v142;
UINT64 RemainingLatency;
unsigned __int64 v144;
UINT64 v145;
_DWORD *v146;
UINT64 ExpectedIdle;
UINT64 v148;
UINT64 v149;
unsigned __int64 *v150;
__int64 v151;
bool *v152;
UINT64 v153;
__int64 v154;
UINT64 LookupIndex;
__int64 v156;
__int64 v157;
unsigned int *v158;
int *v159;
char *v160;
_QWORD *v161;
UINT16 *v162[2];
__int64 v163;
UINT16 *v164[2];
__int64 v165;
int v166;
INT64 v167;
__int64 v168[21];
int v169;
INT64 v170;
__int64 v171[21];
_KAFFINITY_EX result;
v158 = a5;
v159 = a6;
v161 = a7;
v150 = a3;
v135 = a2;
v134 = a1;
v152 = a8;
v160 = a4;
memset((INT64)&result, 0i64);
v9 = *(_QWORD *)(a1 + 0x8000);
v10 = 0i64;
v157 = *(_QWORD *)(a1 + 32776);
v145 = PpmPlatformStates;
v11 = *(_QWORD *)(a1 + 0x8000);
v151 = v9;
LODWORD(RemainingLatency) = *(_DWORD *)PopFxSystemLatencyHint;
v128 = 0;
LOBYTE(v132) = 1;
LOBYTE(v138) = 0;
v130 = 0;
v154 = 0i64;
ProcessorState = 0;
v146 = 0i64;
v137 = 0;
v142 = 0i64;
v133 = 0i64;
ExpectedIdle = 0i64;
v153 = 0i64;
LODWORD(v141) = 0;
while( 1 )
{
TimeUpdateLock = KUSER_SHARED_DATA.TimeUpdateLock;
if( (KUSER_SHARED_DATA.TimeUpdateLock & 1) == 0 )
{
BaselineInterruptTimeQpc = KUSER_SHARED_DATA.BaselineInterruptTimeQpc;
v14 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
PerformanceCounter = KeQueryPerformanceCounter(0i64);
if( KUSER_SHARED_DATA.TimeUpdateLock == TimeUpdateLock )
break;
}
_mm_pause();
}
v16 = v151;
v17 = PerformanceCounter;
v18 = (_QWORD *)v135;
if( PerformanceCounter.QuadPart > BaselineInterruptTimeQpc )
{
v156 = 0i64;
v19 = -1i64 - BaselineInterruptTimeQpc + PerformanceCounter.QuadPart;
if( KUSER_SHARED_DATA.QpcInterruptTimeIncrementShift )
v19 <<= KUSER_SHARED_DATA.QpcInterruptTimeIncrementShift;
v10 = (v19 * (unsigned __int128)KUSER_SHARED_DATA.QpcInterruptTimeIncrement) >> 64;
v156 = v10;
}
v20 = v134;
v21 = v150;
*v150 = v10 + v14;
*(LARGE_INTEGER *)(v11 + 496) = v17;
*(_QWORD *)(v11 + 504) = *(_QWORD *)(v20 + 32792) + *(_QWORD *)(v20 + 32968);
*(_BYTE *)(v11 + 538) = *(_BYTE *)(v20 + 33212);
*(_BYTE *)(v11 + 536) = *(_BYTE *)(v20 + 32824);
*(_BYTE *)(v11 + 537) = *(_BYTE *)(v20 + 32825);
*(_BYTE *)(v11 + 539) = 1;
if( *(_BYTE *)(v20 + 33)
&& (CurrentPrcb = KeGetCurrentPrcb(),
LODWORD(LookupIndex) = 0,
v79 = *((_QWORD *)CurrentPrcb + 24),
v80 = *(unsigned __int16 *)(v79 + 146),
(*(_QWORD *)(v79 + 64) & ~(1i64 << *((_BYTE *)CurrentPrcb + 209))) == (*(_QWORD *)(v79 + 136) & ~(1i64 << (KiProcessorIndexToNumberMappingTable[*((unsigned int *)CurrentPrcb + 9)] & 0x3F)))) )
{
while( 1 )
{
NextNode = MmGetNextNode(v80, &LookupIndex);
v22 = -1;
if( NextNode == -1 )
break;
if( *(_QWORD *)(*(_QWORD *)(v82 + 8i64 * NextNode) + 64i64) != *(_QWORD *)(*(_QWORD *)(v82 + 8i64 * NextNode)
+ 136i64) )
goto LABEL_9;
}
*(_BYTE *)(v11 + 540) = 1;
*(_WORD *)(v11 + 48) |= 0x80u;
}
else
{
LABEL_9:
*(_BYTE *)(v11 + 540) = 0;
v22 = -1;
}
if( *(_BYTE *)(v11 + 1) )
{
*(_WORD *)(v11 + 48) |= 0x100u;
v22 = *(_DWORD *)(v11 + 28);
}
*(_DWORD *)(v11 + 528) = v22;
if( PpmIdleRespectIdleStateMax )
{
v23 = *((_BYTE *)PpmCurrentProfile + 2736 * dword_140C23D0C + 198);
*(_BYTE *)(v11 + 542) = v23;
if( v23 )
*(_WORD *)(v11 + 48) |= 0x4000u;
}
else
{
*(_BYTE *)(v11 + 542) = 0;
}
*v18 = v17.QuadPart;
*(_QWORD *)(v16 + 240) = 1310721i64;
memset(v16 + 248, 0i64);
v24 = *v21;
v25 = *(_BYTE *)(v20 + 33);
v26 = *(_QWORD *)(v20 + 0x8000);
v144 = v24;
if( !v25 && KiSerializeTimerExpiration )
{
v135 = 0i64;
_m_prefetchw(&PpmPlatformIdleHint);
v103 = PpmPlatformIdleHint;
if( (_WORD)PpmPlatformIdleHint )
{
while( 1 )
{
v104 = _InterlockedCompareExchange64(&PpmPlatformIdleHint, v103 ^ (unsigned __int16)(v103 ^ (v103 - 1)), v103);
if( v103 == v104 )
break;
v103 = v104;
_mm_pause();
if( !(_WORD)v104 )
goto LABEL_172;
}
v135 = v103 >> 16;
}
LABEL_172:
v27 = *(_QWORD *)(v20 + 0x8000);
v25 = *(_BYTE *)(v20 + 33);
}
else
{
v135 = 0i64;
v27 = v26;
}
v163 = 0i64;
*(_OWORD *)v162 = 0i64;
memset((INT64)&v166, 0i64);
v28 = -1i64;
v29 = *(_BYTE *)(v27 + 540);
v30 = -(v25 != 0);
v31 = KiClockTimerNextTickTime;
v32 = v30 & 8;
v148 = 0i64;
v33 = *(_BYTE *)(v134 + 33) == 0;
LODWORD(v136) = 2;
if( v33 )
{
KiGetNextTimerExpirationDueTime(v134, 0, v24, 0, 0, &v148, &v136);
if( v31 <= v148 )
v31 = v148;
}
else if( v29 && !(_BYTE)KiDynamicTickDisableReason && !KiClockState )
{
KiGetNextTimerExpirationDueTime(v134, 1, v24, 0, 0, &v148, &v136);
if( v24 + (unsigned int)KiLastRequestedTimeIncrement < v148 )
v31 = v148;
else
LODWORD(v136) = 2;
}
if( v31 == -1i64 )
{
v34 = -1i64;
}
else
{
v34 = 0i64;
if( v31 > v24 )
v34 = v31 - v24;
}
v35 = v134;
v36 = 0;
v37 = *(_DWORD *)(v134 + 11684);
for( i = v37; i; i >>= 4 )
v36 += KeMaximumIncrement;
if( v37 )
{
v39 = KeMaximumIncrement / (v37 + 1);
if( !v39 )
v39 = 1;
v28 = v39;
}
if( v34 <= v28 )
{
v28 = v34;
}
else
{
v32 |= 1u;
if( v34 >= v36 )
v34 = v36;
}
if( PpmIdleDurationExpirationTimeout )
{
if( *(_BYTE *)(v134 + 33) )
{
v166 = 1310721;
v83 = 0;
memset((INT64)&v167, 0i64);
if( KeNumberNodes )
{
v84 = &KeNodeBlock;
v85 = (unsigned __int16)KeNumberNodes;
do
{
v86 = *(_QWORD *)v84;
v87 = *(unsigned __int16 *)(*(_QWORD *)v84 + 144i64);
v88 = *(_QWORD *)(*(_QWORD *)v84 + 72i64);
if( (unsigned __int16)v166 <= (unsigned __int16)v87 )
LOWORD(v166) = v87 + 1;
v168[v87] |= v88;
if( *(_QWORD *)(v86 + 72) )
v83 = 1;
v84 += 8;
--v85;
}
while( v85 );
if( v83 )
{
v162[1] = (UINT16 *)v168[0];
v89 = 0i64;
v162[0] = (UINT16 *)&v166;
while( 1 )
{
v139 = 0;
if( (int)KiEnumerateNextProcessorNumber((INT64)&v139, v162) < 0 )
break;
v90 = (unsigned int)KiProcessorNumberToIndexMappingTable[64 * (unsigned __int16)v139 + BYTE2(v139)];
if( (unsigned int)v90 >= (unsigned int)KeQueryActiveProcessorCountEx(0xFFFFu) )
{
v91 = 0i64;
}
else
{
_mm_lfence();
v91 = (__int64)*(&KiProcessorBlock + v90);
}
v92 = *(_QWORD *)(v91 + 32808);
if( v92 > v89 && v92 != -1i64 )
v89 = v92;
}
v16 = v151;
if( v89 && v34 + v144 > v89 )
{
v32 |= 0x2000u;
v34 = v89 > v144 ? (unsigned int)(v89 - v144) : 1i64;
if( v34 < v28 )
v28 = v34;
}
v35 = v134;
}
}
}
}
if( v28 < v135 )
{
v28 = v135;
v34 = v135;
v32 |= 0x1000u;
}
*(_WORD *)(v26 + 48) |= v32;
v40 = v136;
*(_QWORD *)(v26 + 520) = v34;
v41 = -1;
*(_BYTE *)(v26 + 541) = v40;
*(_QWORD *)(v26 + 512) = v28;
v42 = *(__int64(__fastcall **)(_QWORD, __int64))(v16 + 432);
LODWORD(v135) = -1;
if( v42 )
{
v41 = v42(*(_QWORD *)(v16 + 488), v16 + 496);
LODWORD(v135) = v41;
}
if( *(_BYTE *)(v35 + 32829) )
{
v41 = 0;
LODWORD(v135) = 0;
}
v43 = v145;
if( v145 )
{
PoCopyDeepIdleMask((_DWORD *)(v16 + 576));
KeAddProcessorAffinityEx((_WORD *)(v16 + 576), *(_DWORD *)(v35 + 36));
v105 = *(_QWORD *)(v16 + 752);
v144 = *(_QWORD *)(v43 + 48);
v146 = (_DWORD *)v105;
memset(v105, 0i64);
v44 = ProcessorState;
v106 = 0i64;
if( *(_DWORD *)(v16 + 776) )
{
v107 = 0;
while( 1 )
{
v108 = *(_QWORD *)(v16 + 784);
v109 = v107;
if( PpmIdleVetoBias || !*(_BYTE *)(v108 + 24 * v106 + 1) )
{
LODWORD(v117) = -2;
}
else
{
v110 = *(unsigned int *)(v108 + 24 * v106 + 4);
v111 = (_KPRCB *)v134;
if( PpmDripsStateIndex == -1
|| (unsigned int)v110 < PpmDripsStateIndex
|| !PpmCheckPreConditionsForDeepSleep(v134) )
{
v113 = (unsigned __int8)v132;
if( v128 == 1 )
v113 = 1;
v112 = 0;
}
else
{
v112 = 1;
v113 = (unsigned __int8)v132;
if( !v128 )
v113 = 1;
}
v128 = v112;
v132 = v113;
if( (_BYTE)v113 )
{
LOBYTE(v132) = 0;
PpmEstimateIdleDuration((INT64)v111, v112, v112, *v150, 0i64, &ExpectedIdle, &v153, &v141, &v133);
}
v114 = ExpectedIdle;
v115 = (unsigned int)RemainingLatency;
ProcessorState = -1;
LODWORD(EntryPriority) = v110;
LODWORD(StateIndex) = v110;
*(_DWORD *)(v16 + 796) = 0;
v116 = PpmIdleCheckCoordinatedStateEligibility(
v111,
v41,
v115,
v114,
StateIndex,
EntryPriority,
&ProcessorState,
(_PPM_COORDINATED_SELECTION *)(v16 + 792));
v44 = ProcessorState;
v117 = v116;
if( !*(_BYTE *)(v145 + 12) && !v116 )
{
v118 = *(unsigned int(__fastcall **)(_QWORD, _QWORD, _QWORD))(v145 + 16);
if( v118 )
v117 = v118(*(_QWORD *)(v16 + 488), ProcessorState, (unsigned int)v110);
}
PpmIdleUpdateSelectionStatistics(v117, -16 * v110 + v144 + 72);
v119 = v145 + 384 * v110;
if( v117 != 0xFFFFFFFF )
v154 = *(_QWORD *)(v119 + 64);
if( !v117 )
{
v122 = v146;
v72 = -1;
*v152 = 1;
*v122 = v110;
if( *(_BYTE *)(v119 + 121) )
v72 = v110;
if( (unsigned int)KeSubtractAffinityEx(
(_KAFFINITY_EX *)(v16 + 240),
(_KAFFINITY_EX *)(v119 + 128),
&result) )
PpmUnlockProcessors((unsigned __int16 *)(v16 + 240), (__int64)&result);
v35 = v134;
v45 = v128;
goto LABEL_92;
}
if( v117 == 2147483651 )
{
v130 = 1;
}
else
{
v120 = (unsigned __int8)v138;
if( v117 == 2147483656 )
v120 = 1;
v138 = v120;
}
PpmIdleRollbackCoordinatedSelection(v16 + 792, 0i64);
}
v121 = v146;
v107 = v109 + 1;
v106 = (unsigned int)(v106 + 1);
v137 = v109 + 1;
v146[v109 + 2] = v117;
if( (unsigned int)v106 >= *(_DWORD *)(v16 + 776) )
break;
v41 = v135;
}
v35 = v134;
v137 = v107;
}
else
{
v121 = v146;
}
*(_DWORD *)(v16 + 796) = 0;
*v121 = -1;
PpmUnlockProcessors((unsigned __int16 *)(v16 + 240), v16 + 240);
}
else
{
v44 = ProcessorState;
}
v45 = 0;
v142 = *(unsigned int **)(v16 + 744);
v46 = 1;
memset((INT64)v142, 0i64);
v47 = 0i64;
v154 = *(_QWORD *)(v16 + 40);
v132 = 0;
if( !*(_DWORD *)(v16 + 760) )
goto LABEL_91;
v48 = 2147483658i64;
v49 = 0x80000000;
v50 = 0x100000000i64;
while( 1 )
{
v51 = *(_QWORD *)(v16 + 768);
v52 = (unsigned int)v47;
v144 = (unsigned int)v47;
v44 = *(_DWORD *)(v51 + 24 * v47 + 4);
ProcessorState = v44;
if( !v145 && v44 == *(_DWORD *)(v16 + 32) - 1 && *(_BYTE *)(v16 + 540) && PpmCheckPreConditionsForDeepSleep(v35) )
{
v129 = 1;
if( !v45 )
v46 = 1;
}
else
{
if( v45 == 1 )
v46 = 1;
v129 = 0;
}
if( v46 )
{
LOBYTE(v134) = 0;
*(_OWORD *)v164 = 0i64;
v53 = *v150;
v165 = 0i64;
memset((INT64)&v169, 0i64);
v54 = v129;
v55 = -1i64;
v56 = *(_BYTE *)(*(_QWORD *)(v35 + 0x8000) + 540i64);
v57 = 0;
if( *(_BYTE *)(v35 + 33) )
v57 = 8;
LODWORD(v133) = v57;
if( v129 )
LODWORD(v133) = v57 | 4;
v58 = 2;
v33 = *(_BYTE *)(v35 + 33) == 0;
v59 = KiClockTimerNextTickTime;
HIDWORD(v136) = 2;
v149 = 0i64;
if( v33 )
{
KiGetNextTimerExpirationDueTime(v35, 0, v53, v129, 0, &v149, (INT64 *)((char *)&v136 + 4));
v54 = v129;
if( v59 <= v149 )
v59 = v149;
}
else
{
if( !v56 || (_BYTE)KiDynamicTickDisableReason || KiClockState )
goto LABEL_60;
KiGetNextTimerExpirationDueTime(v35, 1, v53, v129, 0, &v149, (INT64 *)((char *)&v136 + 4));
v54 = v129;
if( v53 + (unsigned int)KiLastRequestedTimeIncrement >= v149 )
{
v58 = 2;
goto LABEL_60;
}
v59 = v149;
}
v58 = HIDWORD(v136);
LABEL_60:
if( v59 == -1i64 )
{
v60 = -1i64;
}
else
{
v60 = 0i64;
if( v59 > v53 )
v60 = v59 - v53;
}
v61 = *(_DWORD *)(v35 + 11684);
v62 = v61;
LODWORD(v141) = v58;
for( j = 0; v62; v62 >>= 4 )
j += KeMaximumIncrement;
if( !v54 && v61 )
{
v64 = KeMaximumIncrement / (v61 + 1);
if( !v64 )
v64 = 1;
v55 = v64;
}
if( v60 <= v55 )
{
v55 = v60;
}
else
{
LODWORD(v133) = v133 | 1;
if( v60 >= j )
v60 = j;
}
if( PpmIdleDurationExpirationTimeout )
{
if( *(_BYTE *)(v35 + 33) )
{
v169 = 1310721;
v93 = 0;
memset((INT64)&v170, 0i64);
if( KeNumberNodes )
{
v94 = &KeNodeBlock;
v95 = (unsigned __int16)KeNumberNodes;
do
{
v96 = *(_QWORD *)v94;
v97 = *(unsigned __int16 *)(*(_QWORD *)v94 + 144i64);
v98 = *(_QWORD *)(*(_QWORD *)v94 + 72i64);
if( (unsigned __int16)v169 <= (unsigned __int16)v97 )
LOWORD(v169) = v97 + 1;
v171[v97] |= v98;
if( *(_QWORD *)(v96 + 72) )
v93 = 1;
v94 += 8;
--v95;
}
while( v95 );
if( v93 )
{
v164[1] = (UINT16 *)v171[0];
v99 = 0i64;
v164[0] = (UINT16 *)&v169;
while( 1 )
{
v140 = 0;
if( (int)KiEnumerateNextProcessorNumber((INT64)&v140, v164) < 0 )
break;
v100 = (unsigned int)KiProcessorNumberToIndexMappingTable[64 * (unsigned __int16)v140 + BYTE2(v140)];
if( (unsigned int)v100 >= (unsigned int)KeQueryActiveProcessorCountEx(0xFFFFu) )
{
v101 = 0i64;
}
else
{
_mm_lfence();
v101 = (__int64)*(&KiProcessorBlock + v100);
}
v102 = *(_QWORD *)(v101 + 32808);
if( v102 > v99 && v102 != -1i64 )
v99 = v102;
}
v16 = v151;
if( v99 && v60 + v53 > v99 )
{
LODWORD(v133) = v133 | 0x2000;
v60 = v99 > v53 ? (unsigned int)(v99 - v53) : 1i64;
if( v60 < v55 )
v55 = v60;
}
LODWORD(v47) = v132;
}
}
}
}
v44 = ProcessorState;
v49 = 0x80000000;
v153 = v60;
v50 = 0x100000000i64;
v52 = v144;
v48 = 2147483658i64;
ExpectedIdle = v55;
v46 = v134;
}
if( !v44 )
{
v67 = 0i64;
goto LABEL_83;
}
v65 = *(_QWORD *)(v35 + 0x8000);
if( *(_DWORD *)(v65 + 36) == 3 && PpmIdleVetoBias )
{
v67 = 4294967294i64;
goto LABEL_83;
}
v66 = 248i64 * v44;
if( *(_BYTE *)(v66 + v65 + 1063) )
{
v67 = v48;
goto LABEL_83;
}
if( v44 > (unsigned int)v135 && (_DWORD)v135 != -1 )
{
v67 = 2147483656i64;
goto LABEL_83;
}
if( !*(_BYTE *)(v66 + v65 + 1058) && *(_BYTE *)(v65 + 539) )
{
v67 = 2147483655i64;
goto LABEL_83;
}
v75 = *(_DWORD *)(v66 + v65 + 1016);
if( v75 )
{
if( v75 >= 0 )
{
if( *(_QWORD *)(v66 + v65 + 1048) )
{
v123 = (__int64 *)(v66 + v65 + 1024);
v124 = *v123;
v33 = *v123 == (_QWORD)v123;
v75 = v49;
if( !v33 )
v75 = *(_DWORD *)(v124 + 16);
}
else
{
v75 = v49;
}
}
else
{
v75 = -2147483635;
}
}
v44 = ProcessorState;
if( v75 )
{
v67 = v50 | (unsigned int)v75;
}
else
{
if( *(_DWORD *)(v66 + v65 + 1000) > (unsigned int)RemainingLatency )
{
v44 = ProcessorState;
v67 = 2147483650i64;
goto LABEL_83;
}
if( *(unsigned int *)(v66 + v65 + 1004) > ExpectedIdle )
{
v44 = ProcessorState;
v67 = 2147483651i64;
goto LABEL_83;
}
v76 = *(unsigned int(__fastcall **)(_QWORD, _QWORD))(v65 + 448);
v67 = v76 ? v76(*(_QWORD *)(v65 + 488), ProcessorState) : 0i64;
}
if( !v67 )
{
v77 = *(unsigned int(__fastcall **)(_QWORD, _QWORD, __int64))(v16 + 440);
if( v77 )
v67 = v77(*(_QWORD *)(v16 + 488), v44, 0xFFFFFFFFi64);
}
LABEL_83:
v68 = v157 + 1000i64 * v44;
if( !v67 )
{
v69 = 0;
LABEL_85:
++*(_QWORD *)(v68 + 8i64 * v69 + 80);
goto LABEL_86;
}
if( (v67 & 0x80000000) == 0 )
{
if( (v67 & 0x100000000i64) != 0 )
{
v125 = *(_QWORD *)(v68 + 200);
v69 = 2;
if( v125 )
++*(_QWORD *)(((unsigned __int64)(((unsigned int)v67 & 0x7FFFFFFF) - 1) << 6) + *(_QWORD *)(v125 + 32) + 24);
}
else
{
v69 = 1;
}
goto LABEL_85;
}
if( (unsigned int)v67 <= 0x8000000C )
{
v69 = v67 - 2147483646;
goto LABEL_85;
}
LABEL_86:
if( !v67 )
break;
if( v67 == 2147483651i64 )
{
v130 = 1;
}
else if( v67 == 2147483656i64 )
{
LOBYTE(v138) = 1;
}
v47 = (unsigned int)(v47 + 1);
v45 = v129;
v49 = 0x80000000;
v132 = v47;
v50 = 0x100000000i64;
v48 = 2147483658i64;
v142[v52 + 2] = v67;
if( (unsigned int)v47 >= *(_DWORD *)(v16 + 760) )
goto LABEL_91;
}
v70 = 248i64 * v44;
*v142 = v44;
HIDWORD(v133) = v47;
v71 = !*(_BYTE *)(v70 + v16 + 1058) || v145 && (!*(_BYTE *)(v70 + v16 + 1061) || v44);
v45 = v129;
*v152 = v71;
LABEL_91:
v72 = -1;
LABEL_92:
if( *v152 )
PpmIdleSetSynchronizationState((UINT32 *)(v35 + 32832), 1u);
*(_WORD *)(v16 + 48) |= v133;
v73 = v161;
*(_BYTE *)(v16 + 7) = v138;
*(_BYTE *)(v16 + 6) = v130;
*(_QWORD *)(v16 + 520) = v153;
*(_QWORD *)(v16 + 512) = ExpectedIdle;
*(_BYTE *)(v16 + 541) = v141;
*v158 = v44;
*v159 = v72;
*v160 = v45;
v74 = v154;
*v73 = v154;
return v74;
}Referenced by:
PoIdle