PpmRegisterPerfStates
INT64 __fastcall PpmRegisterPerfStates(INT64 a1, CHAR a2){
INT64 v3;
__int64 v4;
unsigned int v5;
LARGE_INTEGER *v6;
unsigned int v7;
int v8;
unsigned int v9;
__int64 v10;
__int64 v11;
int v12;
__int64 *v13;
__int64 v14;
int v15;
__int64 v16;
_DWORD *v17;
int v18;
unsigned int v19;
unsigned int v20;
unsigned int v21;
bool v22;
LARGE_INTEGER *PoolWithTag;
__int64 v24;
LARGE_INTEGER *v25;
__int64 v26;
__int64 v27;
unsigned int v28;
unsigned int v29;
__int64 v30;
char *v31;
__int64 v32;
__int64 v33;
unsigned int v34;
__int64 v35;
int v36;
__int64 v37;
UINT64 v38;
char v39;
__int64 *v40;
__int64 v41;
__int64 v42;
__int64 v43;
__int64 v44;
__int64 v45;
UINT16 v46;
UINT64 *v47;
unsigned int FirstSetRightGroupAffinity;
__int64 v49;
LARGE_INTEGER PerformanceCounter;
int v51;
__int64 v52;
int *p_HighPart;
char v54;
unsigned int v55;
int v56;
LARGE_INTEGER *v57;
__int64 QuadPart;
__int64 *v59;
__int64 v60;
__int64 *v61;
__int64 v62;
__int64 v63;
LARGE_INTEGER **v64;
char v65;
INT64 v66;
char v67;
char v68;
__int64 v70;
__int64 v71;
LARGE_INTEGER *v72;
__int64 v73;
__int64 v74;
_QWORD *v75;
PVOID *v76;
int v77[8];
int v78;
int v79;
__int64 v80;
__int64 v81;
unsigned int v82;
int v83;
__int64 v84;
__int64 v85;
__int64 v86;
__int64 v87;
_QWORD v88[3];
__int64 v89;
INT64 v90;
_GROUP_AFFINITY Base;
_EXT_SET_PARAMETERS_V0 Parameters;
_KAFFINITY_EX MappedAsImage;
_KAFFINITY_EX result;
v90 = a1;
v3 = a1;
memset((INT64)&result, 0i64);
Base = 0i64;
memset((INT64)MappedAsImage.Bitmap, 0i64);
v4 = *(unsigned int *)(v3 + 16);
v5 = *(_DWORD *)(v3 + 36);
v6 = 0i64;
LOBYTE(v78) = 0;
v83 = *(_DWORD *)(v3 + 20);
LODWORD(v86) = v4;
*(_OWORD *)&v88[1] = 0i64;
*(_DWORD *)&MappedAsImage.Count = 1310721;
memset((INT64)&MappedAsImage.Reserved, 0i64);
KeQueryActiveProcessorAffinity(&result);
v87 = 0i64;
v7 = 0;
v79 = 0;
if( !a2 )
PpmAcquireLock(&PpmPerfPolicyLock);
v8 = -1;
v81 = -1i64;
v9 = 0;
if( v5 )
{
v10 = *(_QWORD *)(v3 + 408);
do
{
v11 = *(unsigned int *)(v10 + 24i64 * v9 + 12);
if( (unsigned int)v11 >= 2 )
goto LABEL_115;
if( *((_DWORD *)&v81 + v11) == -1 )
*((_DWORD *)&v81 + v11) = v9;
++v9;
}
while( v9 < v5 );
v8 = v81;
}
if( v8 == -1 && HIDWORD(v81) == -1 )
{
LABEL_115:
v36 = -1073741811;
goto LABEL_126;
}
v12 = 0;
v13 = &v81;
v14 = 2i64;
do
{
v22 = *(_DWORD *)v13 == -1;
v15 = v12 + 1;
v13 = (__int64 *)((char *)v13 + 4);
if( v22 )
v15 = v12;
v12 = v15;
--v14;
}
while( v14 );
LODWORD(v84) = v15;
if( (_DWORD)v4 )
{
v16 = v4;
v17 = (_DWORD *)(*(_QWORD *)(v3 + 416) + 28i64);
do
{
v22 = *v17 == 1;
v18 = v7 + 1;
v17 += 8;
if( !v22 )
v18 = v7;
v7 = v18;
--v16;
}
while( v16 );
v79 = v18;
}
v19 = (136 * v4 + 775) & 0xFFFFFFF8;
v20 = v19 + 48 * v12 * v4;
v21 = v20;
v22 = v7 == 0;
if( v7 )
{
v21 = v20 + (v7 << 7);
v22 = v7 == 0;
}
if( v22 )
v20 = 0;
PoolWithTag = (LARGE_INTEGER *)ExAllocatePoolWithTag(NonPagedPoolNx, v21, 0x704D5050ui64);
v6 = PoolWithTag;
if( !PoolWithTag )
{
v36 = -1073741670;
goto LABEL_126;
}
memset((INT64)PoolWithTag, 0i64);
v24 = v20;
v25 = v6 + 96;
v26 = 0i64;
v27 = (__int64)v6 + v24;
v28 = 0;
v88[0] = (char *)v6 + v19;
v82 = 0;
v87 = v27;
if( *(_BYTE *)(v3 + 11) )
LODWORD(PpmPerfQosTransitionHysteresis) = *(_DWORD *)(v3 + 48);
v29 = 0;
LODWORD(v80) = 0;
if( !(_DWORD)v4 )
{
LABEL_47:
if( (unsigned int)KeIsEmptyAffinityEx(&MappedAsImage) )
{
v6[26].LowPart = 2;
v71 = 0i64;
if( (_DWORD)v4 )
{
v72 = v25 + 2;
while( v72->LowPart != 1 )
{
v71 = (unsigned int)(v71 + 1);
v72 += 17;
if( (unsigned int)v71 >= (unsigned int)v4 )
goto LABEL_49;
}
v6[2] = v25[17 * v71];
v6[26].LowPart = 1;
}
}
else
{
KeFirstGroupAffinityEx(&Base, (UINT8)&MappedAsImage, v46, v47);
FirstSetRightGroupAffinity = KeFindFirstSetRightGroupAffinity(&Base);
KeGetPrcb(FirstSetRightGroupAffinity);
v6[2].QuadPart = v49 + 33128;
BYTE4(v6[25].QuadPart) = *(_BYTE *)(v49 + 33208);
}
LABEL_49:
KeCopyAffinityEx((__int64)&v6[3], &MappedAsImage.Count);
v6[28] = *(LARGE_INTEGER *)(v3 + 256);
v6[30] = *(LARGE_INTEGER *)(v3 + 272);
v6[31] = *(LARGE_INTEGER *)(v3 + 280);
v6[32] = *(LARGE_INTEGER *)(v3 + 288);
v6[33] = *(LARGE_INTEGER *)(v3 + 296);
v6[29] = *(LARGE_INTEGER *)(v3 + 264);
v6[24] = *(LARGE_INTEGER *)(v3 + 80);
v6[27].QuadPart = (LONGLONG)v25;
v6[68].HighPart = 1;
PerformanceCounter = KeQueryPerformanceCounter(0i64);
v51 = v83;
v52 = 5i64;
v6[94] = PerformanceCounter;
v6[39].HighPart = v51;
v6[25].LowPart = v4;
v6[41].HighPart = *(_DWORD *)(v3 + 44);
v6[40].LowPart = *(_DWORD *)(v3 + 24);
v6[40].HighPart = *(_DWORD *)(v3 + 28);
v6[41].LowPart = *(_DWORD *)(v3 + 32);
BYTE1(v6[44].LowPart) = *(_BYTE *)(v3 + 4);
v6[36] = *(LARGE_INTEGER *)(v3 + 336);
v6[37] = *(LARGE_INTEGER *)(v3 + 344);
v6[38] = *(LARGE_INTEGER *)(v3 + 352);
v6[34] = *(LARGE_INTEGER *)(v3 + 320);
v6[35] = *(LARGE_INTEGER *)(v3 + 328);
HIBYTE(v6[44].QuadPart) = *(_BYTE *)(v3 + 52);
p_HighPart = &v6[70].HighPart;
do
{
*(p_HighPart - 1) = 100;
*p_HighPart = v51;
p_HighPart += 10;
--v52;
}
while( v52 );
BYTE2(v6[44].u.LowPart) = *(_BYTE *)(v3 + 6);
BYTE3(v6[44].QuadPart) = *(_BYTE *)(v3 + 7);
BYTE4(v6[44].QuadPart) = *(_BYTE *)(v3 + 8);
if( *(_WORD *)(v3 + 4) == 253 || (v54 = 1, *(_QWORD *)(v3 + 352)) )
v54 = 0;
BYTE6(v6[44].QuadPart) = v54;
BYTE5(v6[44].QuadPart) = *(_BYTE *)(v3 + 11);
if( PpmPerfQosManageIdleProcessors == -1 )
PpmPerfQosManageIdleProcessors = *(_BYTE *)(v3 + 12) != 0;
v6[42] = *(LARGE_INTEGER *)(v3 + 56);
v6[43] = *(LARGE_INTEGER *)(v3 + 64);
LOBYTE(v6[44].LowPart) = 100;
if( PpmCheckMinimumPeriod <= (unsigned __int64)*(unsigned int *)(v3 + 40) )
PpmCheckMinimumPeriod = *(unsigned int *)(v3 + 40);
if( v6[31].QuadPart )
PpmAllowedActions |= 0x40u;
if( v6[30].QuadPart )
PpmAllowedActions |= 0x20u;
if( v6[29].QuadPart )
PpmAllowedActions |= 0x200u;
if( v6[33].QuadPart )
PpmAllowedActions |= 0x80u;
if( v6[32].QuadPart )
PpmAllowedActions |= 0x100u;
if( *(_BYTE *)(v3 + 9) )
PpmPerfEppViaPerfControl = 1;
if( *(_BYTE *)(v3 + 10) )
PpmPerfAutonomousActivityWindowViaPerfControl = 1;
_InterlockedOr(v77, 0);
v55 = 0;
if( (_DWORD)v4 )
{
v56 = v84;
v57 = v6 + 98;
do
{
if( v57->LowPart != 2 )
{
QuadPart = v57[-2].QuadPart;
v59 = &v81;
*(_OWORD *)&v88[1] = 0i64;
*(_DWORD *)(QuadPart + 56) = 0x10000;
v60 = 2i64;
*(_QWORD *)QuadPart = v6;
*(_QWORD *)(QuadPart + 8) = &v6[17 * v55 + 96];
v61 = &v88[1];
v62 = v88[0] + 48i64 * v56 * v55;
do
{
if( *(_DWORD *)v59 != -1 )
{
*v61 = v62;
v62 += 48i64;
}
v59 = (__int64 *)((char *)v59 + 4);
++v61;
--v60;
}
while( v60 );
if( v57->LowPart )
{
PpmPerfResizeHistory(QuadPart);
v73 = 2i64;
v74 = QuadPart - (_QWORD)&v88[1];
v75 = &v88[1];
do
{
if( *v75 )
*(_QWORD *)((char *)v75 + v74 + 88) = *v75;
++v75;
--v73;
}
while( v73 );
}
else
{
PpmInstallFeedbackCounters(QuadPart - 33128, &v88[1]);
}
}
++v55;
v57 += 17;
}
while( v55 < (unsigned int)v4 );
v3 = v90;
v26 = 0i64;
v7 = v79;
}
if( !PpmPerfGlobalContext )
PpmPerfGlobalContext = *(_QWORD *)(v3 + 72);
v63 = PpmPerfControlReadFeedback;
if( !PpmPerfControlReadFeedback )
{
v63 = *(_QWORD *)(v3 + 360);
PpmPerfControlReadFeedback = v63;
}
if( !PpmPerfControlAcquirePerformance )
PpmPerfControlAcquirePerformance = *(_QWORD *)(v3 + 368);
if( !PpmPerfControlCommitPerformance )
PpmPerfControlCommitPerformance = *(_QWORD *)(v3 + 376);
if( !PpmParkPreferenceHandler )
PpmParkPreferenceHandler = *(__int64(__fastcall **)(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD, _QWORD, _QWORD, _QWORD))(v3 + 384);
if( !PpmParkMaskHandler )
PpmParkMaskHandler = *(__int64(__fastcall **)(_QWORD, _QWORD))(v3 + 392);
if( !PpmCheckCompleteHandler )
PpmCheckCompleteHandler = *(__int64(__fastcall **)(_QWORD, _QWORD))(v3 + 400);
if( !PpmPerfControlStartPolicyUpdate )
PpmPerfControlStartPolicyUpdate = *(__int64(**)(void))(v3 + 304);
if( !PpmPerfControlCompletePolicyUpdate )
PpmPerfControlCompletePolicyUpdate = *(__int64(**)(void))(v3 + 312);
if( v63 )
PpmCheckPollForFeedback = 1;
v64 = (LARGE_INTEGER **)qword_140CFB4F0;
++PpmPerfDomainCount;
if( *(INT64 **)qword_140CFB4F0 != &PpmPerfDomainHead )
__fastfail(3u);
v6->QuadPart = (LONGLONG)&PpmPerfDomainHead;
v65 = 1;
v6[1].QuadPart = (LONGLONG)v64;
*v64 = v6;
v66 = PpmPerfDomainHead;
qword_140CFB4F0 = (__int64)v6;
LOBYTE(v78) = 1;
if( (INT64 *)PpmPerfDomainHead != &PpmPerfDomainHead )
{
do
{
v67 = *(_BYTE *)(v66 + 357);
v66 = *(_QWORD *)v66;
v65 = v67 != 0 ? v65 : 0;
}
while( (INT64 *)v66 != &PpmPerfDomainHead );
LOBYTE(v78) = v65;
}
KeOrAffinityEx(&MappedAsImage, &PpmPerfStatesRegistered, &PpmPerfStatesRegistered);
WORD2(v6[95].QuadPart) = 257;
PpmUpdateProcessorPolicy(&PpmAllowedActions, (__int64)v6);
PpmCheckResetProcessors((INT64)v6);
if( ((MappedAsImage.Bitmap[(unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[0] >> 6] >> (KiProcessorIndexToNumberMappingTable[0] & 0x3F)) & 1) != 0 )
PpmParkApplyPolicy();
PpmCheckReInit();
v6 = 0i64;
v36 = 0;
PpmPerfUpdateDomainPolicy(1);
goto LABEL_109;
}
v30 = 0i64;
v31 = (char *)&v6[98].QuadPart + 4;
while( 1 )
{
v32 = *(_QWORD *)(v3 + 416);
*((_DWORD *)v31 - 1) = *(_DWORD *)(v30 + v32 + 28);
v33 = *(unsigned int *)(v30 + v32);
if( !*(_DWORD *)(v30 + v32 + 28) )
break;
v34 = -1;
*(_DWORD *)v31 = v33;
v22 = *(_DWORD *)(v30 + v32 + 28) == 1;
LODWORD(v85) = -1;
if( v22 )
{
v82 = v28 + 1;
v70 = v27 + ((unsigned __int64)v28 << 7);
*(_WORD *)(v70 + 54) = 100;
v36 = PpmAllocatePerfCheck(v70);
if( v36 < 0 )
goto LABEL_125;
*(_QWORD *)(v31 - 20) = v70;
v34 = v85;
goto LABEL_37;
}
LABEL_38:
*((_DWORD *)v31 + 7) = 100;
*(_QWORD *)(v31 - 12) = *(_QWORD *)(v30 + v32 + 8);
*((_DWORD *)v31 + 1) = *(_DWORD *)(v30 + v32 + 16);
*((_DWORD *)v31 + 2) = *(_DWORD *)(v30 + v32 + 20);
*((_DWORD *)v31 + 3) = *(_DWORD *)(v30 + v32 + 24);
*((_DWORD *)v31 + 14) = v83;
v39 = 0;
*(_QWORD *)(v31 + 108) = 0i64;
*((_DWORD *)v31 + 9) = 100;
*((_DWORD *)v31 + 13) = 100;
*((_DWORD *)v31 + 15) = 1;
*((_DWORD *)v31 + 16) = 100;
*((_DWORD *)v31 + 17) = 100;
*((_DWORD *)v31 + 24) = 100;
*((_DWORD *)v31 + 25) = 100;
if( !*(_BYTE *)(v3 + 7) && *(_BYTE *)(v3 + 11) )
v39 = 1;
v31[105] = v39;
if( *(_DWORD *)(v30 + v32 + 16) < 0x64u )
{
*(_QWORD *)(v31 + 20) = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
PopDiagTraceProcessorThrottlePerfTrack((unsigned int)(100 - *(_DWORD *)(v30 + v32 + 16)), v34);
}
v40 = &v81;
v41 = (unsigned int)v84 * v29;
v42 = 2i64;
v43 = v88[0] + 48 * v41;
do
{
v44 = *(unsigned int *)v40;
if( (_DWORD)v44 != -1 )
{
v45 = *(_QWORD *)(v3 + 408);
*(_QWORD *)(v43 + 40) = *(_QWORD *)(*(_QWORD *)(v3 + 424) + 8i64 * (unsigned int)(v41 + v44));
*(_BYTE *)(v43 + 33) = *(_BYTE *)(v45 + 24 * v44 + 17);
*(_BYTE *)(v43 + 32) = *(_BYTE *)(v45 + 24 * v44 + 16);
*(_BYTE *)(v43 + 34) = *(_BYTE *)(v45 + 24 * v44 + 18);
*(_BYTE *)(v43 + 35) = *(_BYTE *)(v45 + 24 * v44 + 8);
*(_QWORD *)v43 = *(_QWORD *)(v45 + 24 * v44);
v43 += 48i64;
}
v40 = (__int64 *)((char *)v40 + 4);
--v42;
}
while( v42 );
LODWORD(v4) = v86;
v29 = v80 + 1;
v28 = v82;
v30 += 32i64;
v27 = v87;
v31 += 136;
LODWORD(v80) = v29;
if( v29 >= (unsigned int)v86 )
{
v7 = v79;
v25 = v6 + 96;
v26 = 0i64;
goto LABEL_47;
}
}
v34 = *(_DWORD *)(v30 + v32);
if( (_DWORD)v33 != -1
&& ((PpmPerfStatesRegistered.Bitmap[(unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v33] >> 6] >> (KiProcessorIndexToNumberMappingTable[v33] & 0x3F)) & 1) == 0 )
{
KeGetPrcb((unsigned int)v33);
v89 = v35;
v85 = v35 + 33128;
v36 = PpmAllocatePerfCheck(v35 + 33128);
if( v36 < 0 )
goto LABEL_125;
KeAddProcessorAffinityEx(&MappedAsImage, v34);
v37 = v89;
*(_QWORD *)(v31 - 20) = v85;
v38 = (unsigned int)PpmPerfQosTransitionHysteresisOverride;
if( PpmPerfQosTransitionHysteresisOverride == -1 )
v38 = (unsigned int)PpmPerfQosTransitionHysteresis;
*(_QWORD *)(v37 + 33256) = PpmConvertTime(v38, 0xF4240ui64, 1000000i64 * *(unsigned int *)(v37 + 68));
LABEL_37:
v29 = v80;
goto LABEL_38;
}
v36 = -1073741811;
LABEL_125:
v7 = v79;
LABEL_126:
PpmReleaseLock(&PpmPerfPolicyLock);
v26 = 0i64;
LABEL_109:
v68 = v78;
if( ((unsigned int)PpmPerfDomainCount > 1 || (_BYTE)v78)
&& (unsigned int)KeIsEqualAffinityEx(&PpmPerfStatesRegistered.Count, (unsigned __int16 *)&PpmCheckRegistered) )
{
PpmAcquireLock(&PpmPerfPolicyLock);
PpmPerfSchedulerDirectedPerfStatesSupported = v68;
PpmReinitializeHeteroEngine(1);
}
if( v6 )
{
if( v7 )
{
v76 = (PVOID *)(v87 + 16);
v26 = v7;
do
{
if( *v76 )
{
ExFreePoolWithTag(*v76, 0x704D5050u);
*v76 = 0i64;
}
v76 += 16;
--v26;
}
while( v26 );
}
ExFreePoolWithTag(v6, 0x704D5050u);
}
Parameters.NoWakeTolerance = -1i64;
*(_QWORD *)&Parameters.Version = v26;
KeSetTimer2(&PpmPerfTelemetryTimer, -36000000000i64, 36000000000i64, &Parameters);
return(unsigned int)v36;
}Referenced by:
PpmPerfRegisterNativePerfStates