PpmInstallPlatformIdleStates
INT64 __fastcall PpmInstallPlatformIdleStates(INT64 a1){
INT64 v1;
char v2;
unsigned int v3;
unsigned int v4;
unsigned int v5;
unsigned int v6;
unsigned int v7;
_DWORD *v8;
int v9;
int v10;
unsigned int v11;
__int64 v12;
__int64 v13;
UINT64 v14;
unsigned int v15;
unsigned int v16;
VOID *PoolWithTag;
INT64 v18;
UINT64 v19;
__int64 v20;
__int64 v21;
_QWORD *v22;
_DWORD *v23;
__int64 v24;
UINT64 v25;
__int64 v26;
UINT64 v27;
__int64 v28;
__int64 v29;
__int128 v30;
UINT64 v31;
__int64 v32;
unsigned int v33;
__int64 v34;
__int64 v35;
__int64 v36;
unsigned int i;
__int64 v38;
__int64 v39;
__int64 v40;
__int64 v41;
__int64 v42;
__int64 v43;
__int64 v44;
INT64 v45;
__int64 v46;
__int64 v47;
unsigned int v48;
__int64 v49;
__int64 v50;
unsigned int v51;
__int64 v52;
__int64 v53;
unsigned int ProcessorIndexFromNumber;
__int64 v55;
__int64 v56;
int v57;
__int64 v58;
__int64 v59;
unsigned int j;
__int64 v61;
__int64 v62;
__int64 v63;
unsigned int v64;
INT64 v65;
__int64 v66;
bool v67;
unsigned int v69;
unsigned int v70;
UINT64 v71;
UINT64 v72;
unsigned int v74;
int v75;
__int64 v76;
unsigned int v77;
unsigned int ProcessorNumber;
v1 = a1;
PopAcquireRwLockExclusive((_POP_RW_LOCK *)&PpmIdlePolicyLock);
v2 = 1;
if( PpmPlatformStates && !*(_BYTE *)(v1 + 48) )
{
v3 = -1073741431;
LABEL_75:
PopReleaseRwLock((UINT64)&PpmIdlePolicyLock);
return v3;
}
v4 = *(_DWORD *)(v1 + 4);
if( !v4 || *(_DWORD *)(v1 + 8) > v4 )
{
LABEL_5:
v3 = -1073741811;
goto LABEL_75;
}
PpmIdleUpdatePlatformDependencies(v1);
v5 = KeNumberProcessors_0;
v6 = 0;
v7 = *(_DWORD *)(v1 + 8);
v77 = KeNumberProcessors_0;
if( v7 )
{
v8 = (_DWORD *)(v1 + 72);
while( *v8 <= (unsigned int)KeNumberProcessors_0 )
{
++v6;
v8 += 12;
if( v6 >= v7 )
goto LABEL_11;
}
goto LABEL_5;
}
LABEL_11:
v9 = 0;
v10 = 0;
if( v7 )
{
v11 = 0;
if( (_DWORD)KeNumberProcessors_0 )
{
while( 1 )
{
KeGetPrcb(v11);
v13 = *(_QWORD *)(v12 + 0x8000);
if( !v13 )
goto LABEL_5;
v9 += *(_DWORD *)(v13 + 32);
if( ++v11 >= v5 )
{
v7 = *(_DWORD *)(v1 + 8);
break;
}
}
}
v9 = v7 * (v5 + v9);
v10 = v5 * v7;
}
v14 = PpmPlatformStates;
if( PpmPlatformStates )
{
if( *(_DWORD *)(PpmPlatformStates + 8) != v5
|| *(_DWORD *)PpmPlatformStates != v4
|| (LODWORD(v26) = v7, *(_DWORD *)(PpmPlatformStates + 4) != 1) )
{
v3 = -1073741811;
goto LABEL_74;
}
}
else
{
v74 = (384 * v4 + 71) & 0xFFFFFFF8;
ProcessorNumber = v74 + 24 * v10;
v15 = ProcessorNumber + 24 * v9;
v70 = (4 * v4 + 15) & 0xFFFFFFF8;
v69 = (v15 + 1008 * v4 + 31) & 0xFFFFFFF8;
v16 = v69 + v5 * v70;
if( PpmIdleVetoList )
v16 += (v4 * *(_DWORD *)PpmIdleVetoList) << 6;
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNxCacheAligned, v16, 0x694D5050ui64);
v14 = (UINT64)PoolWithTag;
if( !PoolWithTag )
{
v3 = -1073741670;
goto LABEL_75;
}
memset((INT64)PoolWithTag, 0i64);
*(_DWORD *)v14 = v4;
*(_DWORD *)(v14 + 4) = *(_DWORD *)(v1 + 8) != 0;
*(_DWORD *)(v14 + 8) = v5;
*(_QWORD *)(v14 + 16) = *(_QWORD *)(v1 + 16);
*(_QWORD *)(v14 + 24) = *(_QWORD *)(v1 + 24);
*(_QWORD *)(v14 + 32) = *(_QWORD *)(v1 + 32);
*(_QWORD *)(v14 + 40) = *(_QWORD *)(v1 + 40);
v18 = v14 + v15;
*(_QWORD *)(v14 + 48) = v18;
*(_DWORD *)(v18 + 4) = v4;
PpmResetPlatformIdleAccounting(v18);
v19 = v14 + v69 + v5 * v70;
v20 = 0i64;
if( *(_DWORD *)(v1 + 4) )
{
do
{
v21 = 384 * v20;
*(_BYTE *)(384 * v20 + v14 + 121) = 1;
KeQueryActiveProcessorAffinity((_KAFFINITY_EX *)(384 * v20 + v14 + 128));
*(_BYTE *)(384 * v20 + v14 + 104) = 7;
v22 = (_QWORD *)(384 * v20 + v14 + 88);
v22[1] = v22;
*v22 = v22;
if( PpmIdleDisableStatesAtBoot )
*(_DWORD *)(v21 + v14 + 80) = 0x80000000;
v23 = (_DWORD *)PpmIdleVetoList;
if( PpmIdleVetoList )
{
if( (_DWORD)v20 == *(_DWORD *)(v1 + 4) - 1 )
*(_BYTE *)(v21 + v14 + 105) = 1;
*(_DWORD *)(v21 + v14 + 108) = *v23;
*(_QWORD *)(v21 + v14 + 112) = v19;
v19 += (unsigned __int64)(unsigned int)*v23 << 6;
*(_QWORD *)(1008i64 * (unsigned int)v20 + v14 + v15 + 192) = v21 + v14 + 80;
}
v20 = (unsigned int)(v20 + 1);
}
while( (unsigned int)v20 < *(_DWORD *)(v1 + 4) );
v5 = v77;
}
v24 = 0i64;
v25 = v14 + v74;
LODWORD(v26) = *(_DWORD *)(v1 + 8);
v27 = v14 + ProcessorNumber;
v71 = v27;
v75 = 0;
if( (_DWORD)v26 )
{
v28 = 24i64 * v5;
do
{
v29 = 384 * v24;
v30 = *(_OWORD *)(v1 + 48 * v24 + 80);
*(_QWORD *)(v29 + v14 + 312) = v25;
v25 += v28;
*(_DWORD *)(v29 + v14 + 124) = v5;
v72 = v25;
*(_OWORD *)(v29 + v14 + 296) = v30;
if( v5 )
{
v31 = v71;
v32 = 0i64;
v33 = 0;
do
{
v34 = *(_QWORD *)(v29 + v14 + 312);
KeGetPrcb(v33);
v36 = *(_QWORD *)(v35 + 0x8000);
*(_DWORD *)(v34 + v32) = v33++;
v32 += 24i64;
LODWORD(v35) = *(_DWORD *)(v36 + 32);
*(_QWORD *)(v34 + v32 - 8) = v31;
*(_DWORD *)(v34 + v32 - 16) = v35;
v31 += 24i64 * *(unsigned int *)(v36 + 32);
}
while( v33 < v5 );
v25 = v72;
LODWORD(v24) = v75;
v28 = 24i64 * v5;
v71 = v31;
v1 = a1;
}
LODWORD(v26) = *(_DWORD *)(v1 + 8);
v24 = (unsigned int)(v24 + 1);
v75 = v24;
}
while( (unsigned int)v24 < (unsigned int)v26 );
v27 = v71;
}
for( i = 0; i < v5; ++i )
{
KeGetPrcb(i);
v38 = 0i64;
v40 = *(_QWORD *)(v39 + 0x8000);
*(_QWORD *)(v40 + 752) = v14 + v69 + i * v70;
*(_DWORD *)(v40 + 776) = *(_DWORD *)(v1 + 8);
*(_QWORD *)(v40 + 784) = v27;
v26 = *(unsigned int *)(v1 + 8);
v27 += 24 * v26;
if( (_DWORD)v26 )
{
do
{
v41 = 384 * v38;
v42 = 3i64 * (unsigned int)(v26 - v38 - 1);
v26 = *(_QWORD *)(v40 + 784);
*(_DWORD *)(v26 + 8 * v42 + 4) = v38;
v38 = (unsigned int)(v38 + 1);
*(_DWORD *)(v26 + 8 * v42 + 8) = *(_DWORD *)(v41 + v14 + 124);
*(_QWORD *)(v26 + 8 * v42 + 16) = *(_QWORD *)(v41 + v14 + 312);
LODWORD(v26) = *(_DWORD *)(v1 + 8);
}
while( (unsigned int)v38 < (unsigned int)v26 );
}
}
}
v43 = 0i64;
if( (_DWORD)v26 )
{
do
{
v44 = 0i64;
v45 = v1 + 48 * v43;
v46 = 384 * v43;
*(_DWORD *)(v46 + v14 + 72) = *(_DWORD *)(v45 + 64);
*(_DWORD *)(v46 + v14 + 76) = *(_DWORD *)(v45 + 68);
if( *(_DWORD *)(v45 + 72) )
{
do
{
v47 = *(_QWORD *)(v45 + 96);
v48 = 0;
v49 = *(_QWORD *)(v46 + v14 + 312);
v50 = 3i64 * *(unsigned int *)(v47 + 8 * v44);
v51 = *(_DWORD *)(v49 + 24i64 * *(unsigned int *)(v47 + 8 * v44) + 8);
if( v51 )
{
do
{
v52 = *(_QWORD *)(v49 + 8 * v50 + 16);
v53 = 3i64 * (v51 - v48 - 1);
*(_OWORD *)(v52 + 8 * v53) = 0i64;
*(_QWORD *)(v52 + 8 * v53 + 16) = 0i64;
*(_DWORD *)(v52 + 8 * v53 + 4) = v48;
if( !*(_BYTE *)(v45 + 60) && v48 == *(unsigned __int8 *)(v45 + 61) )
*(_BYTE *)(v52 + 24i64 * (v51 - v48 - 1) + 1) = 1;
if( v48 >= *(unsigned __int8 *)(v47 + 8 * v44 + 4) )
{
*(_BYTE *)(v52 + 24i64 * (v51 - v48 - 1) + 2) = 1;
if( !*(_BYTE *)(v47 + 8 * v44 + 6) )
*(_BYTE *)(v52 + 24i64 * (v51 - v48 - 1)) = 1;
}
v51 = *(_DWORD *)(v49 + 8 * v50 + 8);
++v48;
}
while( v48 < v51 );
}
v44 = (unsigned int)(v44 + 1);
}
while( (unsigned int)v44 < *(_DWORD *)(v45 + 72) );
}
if( *(_BYTE *)(v45 + 60) )
{
ProcessorIndexFromNumber = KeGetProcessorIndexFromNumber((_PROCESSOR_NUMBER *)(v45 + 56));
v55 = *(_QWORD *)(v46 + v14 + 312);
v56 = 3i64 * ProcessorIndexFromNumber;
memset(*(_QWORD *)(v55 + 24i64 * ProcessorIndexFromNumber + 16), 0i64);
v57 = *(unsigned __int8 *)(v45 + 61);
v58 = 3i64 * (unsigned int)(*(_DWORD *)(v55 + 8 * v56 + 8) - v57 - 1);
v59 = *(_QWORD *)(v55 + 8 * v56 + 16);
*(_DWORD *)(v59 + 8 * v58 + 4) = v57;
*(_BYTE *)(v59 + 8 * v58 + 1) = 1;
}
v43 = (unsigned int)(v43 + 1);
}
while( (unsigned int)v43 < *(_DWORD *)(v1 + 8) );
v5 = v77;
}
for( j = 0; j < v5; ++j )
{
KeGetPrcb(j);
v61 = 0i64;
v63 = *(_QWORD *)(v62 + 0x8000);
v64 = *(_DWORD *)(v63 + 776);
if( v64 )
{
do
{
v65 = v1 + 48 * v61 + 56;
v66 = 3i64 * (v64 - (unsigned int)v61 - 1);
v76 = *(_QWORD *)(v63 + 784);
v67 = !*(_BYTE *)(v65 + 4) || (unsigned int)KeGetProcessorIndexFromNumber((_PROCESSOR_NUMBER *)v65) == j;
v61 = (unsigned int)(v61 + 1);
*(_BYTE *)(v76 + 8 * v66 + 1) = v67;
v64 = *(_DWORD *)(v63 + 776);
}
while( (unsigned int)v61 < v64 );
}
}
if( !PpmPlatformStates )
{
PpmEnableCoordinatedIdleStates((UINT64 *)v14, 0);
v2 = 0;
}
v3 = 0;
LABEL_74:
if( v2 )
goto LABEL_75;
return v3;
}Referenced by:
No references.