PpmInstallCoordinatedIdleStates
INT64 __fastcall PpmInstallCoordinatedIdleStates(UINT64 *a1){
UINT64 *v1;
char v2;
int updated;
__int64 v4;
int v5;
int v6;
int v7;
_DWORD *v8;
__int64 v9;
int v10;
int v11;
UINT64 v12;
unsigned int v13;
unsigned int v14;
unsigned int v15;
VOID *PoolWithTag;
INT64 v17;
__int64 v18;
UINT64 i;
__int64 v20;
_QWORD *v21;
_DWORD *v22;
UINT64 v23;
UINT64 v24;
unsigned __int16 *v25;
__int64 v26;
UINT64 v27;
__int64 v28;
__int64 v29;
__int64 v30;
__int64 v31;
unsigned int v32;
UINT64 v33;
unsigned int v34;
__int64 v35;
__int64 v36;
_QWORD *v37;
__int64 v38;
__int64 v39;
__int64 v40;
UINT64 v41;
char *v42;
__int64 v43;
__int64 v44;
__int64 v45;
__int64 v46;
__int64 v47;
__int64 v48;
unsigned int v49;
__int64 v50;
__int64 v51;
__int64 v52;
int v53;
__int64 v54;
__int64 v55;
unsigned int j;
__int64 v57;
unsigned int v58;
__int64 v59;
__int64 k;
char v61;
__int64 v62;
__int64 v63;
unsigned int v65;
int v66;
int v67;
unsigned int v68;
unsigned int v70;
unsigned int v71;
unsigned int v72;
v1 = a1;
PopAcquireRwLockExclusive((_POP_RW_LOCK *)&PpmIdlePolicyLock);
v2 = 1;
if( PpmPlatformStates && !*((_BYTE *)v1 + 40) )
{
updated = -1073741431;
LABEL_51:
PopReleaseRwLock((UINT64)&PpmIdlePolicyLock);
return(unsigned int)updated;
}
updated = PpmIdleUpdateCoordinatedDependencies(v1);
if( updated < 0 )
goto LABEL_51;
v4 = *(unsigned int *)v1;
v68 = v4;
if( !(_DWORD)v4 )
{
updated = -1073741811;
goto LABEL_51;
}
v5 = KeNumberProcessors_0;
v6 = 0;
v70 = KeNumberProcessors_0;
v7 = KeNumberProcessors_0 * v4;
v8 = v1 + 31;
v9 = *(unsigned int *)v1;
do
{
v10 = v8[1];
v6 += v10;
v11 = *v8 * v10;
v8 += 56;
v7 += v11;
--v9;
}
while( v9 );
v12 = PpmPlatformStates;
if( PpmPlatformStates )
{
if( *(_DWORD *)(PpmPlatformStates + 8) != (_DWORD)KeNumberProcessors_0
|| *(_QWORD *)PpmPlatformStates != ((unsigned int)v4 | 0x100000000i64) )
{
updated = -1073741811;
goto LABEL_50;
}
}
else
{
v13 = (384 * v4 + 71) & 0xFFFFFFF8;
v72 = v13 + 24 * v6;
v65 = v72 + 24 * v7;
v14 = (v65 + 4 * KeNumberProcessors_0 * v4 + 7) & 0xFFFFFFF8;
v66 = (4 * v4 + 15) & 0xFFFFFFF8;
v15 = ((v14 + 1008 * v4 + 31) & 0xFFFFFFF8) + KeNumberProcessors_0 * v66;
v67 = (v14 + 1008 * v4 + 31) & 0xFFFFFFF8;
v71 = v15;
if( PpmIdleVetoList )
v15 += ((_DWORD)v4 * *(_DWORD *)PpmIdleVetoList) << 6;
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNxCacheAligned, v15, 0x694D5050ui64);
v12 = (UINT64)PoolWithTag;
if( !PoolWithTag )
{
updated = -1073741670;
goto LABEL_51;
}
memset((INT64)PoolWithTag, 0i64);
*(_DWORD *)v12 = v4;
*(_DWORD *)(v12 + 4) = 1;
*(_BYTE *)(v12 + 12) = 1;
*(_DWORD *)(v12 + 8) = v5;
*(_QWORD *)(v12 + 16) = v1[1];
*(_QWORD *)(v12 + 24) = v1[2];
*(_QWORD *)(v12 + 32) = v1[3];
*(_QWORD *)(v12 + 40) = v1[4];
v17 = v12 + v14;
*(_QWORD *)(v12 + 48) = v17;
*(_DWORD *)(v17 + 4) = v4;
PpmResetPlatformIdleAccounting(v17);
v18 = 0i64;
for( i = v12 + v71; (unsigned int)v18 < *(_DWORD *)v1; v18 = (unsigned int)(v18 + 1) )
{
v20 = 384 * v18;
v21 = (_QWORD *)(384 * v18 + v12 + 88);
v21[1] = v21;
*v21 = v21;
*(_BYTE *)(384 * v18 + v12 + 104) = 7;
if( PpmIdleDisableStatesAtBoot )
*(_DWORD *)(v20 + v12 + 80) = 0x80000000;
v22 = (_DWORD *)PpmIdleVetoList;
if( PpmIdleVetoList )
{
if( (_DWORD)v18 == *(_DWORD *)v1 - 1 )
*(_BYTE *)(v20 + v12 + 105) = 1;
*(_DWORD *)(v20 + v12 + 108) = *v22;
*(_QWORD *)(v20 + v12 + 112) = i;
i += (unsigned __int64)(unsigned int)*v22 << 6;
*(_QWORD *)(1008i64 * (unsigned int)v18 + v17 + 192) = v12 + v20 + 80;
}
}
v23 = v12 + v72;
v24 = v12 + v13;
v25 = (unsigned __int16 *)v1 + 126;
v26 = v4;
v27 = v24;
v28 = v12 + 128;
do
{
*(_OWORD *)(v28 + 168) = *(_OWORD *)(v25 - 18);
*(_QWORD *)(v28 - 64) = *(_QWORD *)(v25 - 10);
KeCopyAffinityEx(v28, v25 - 102);
v29 = 0i64;
*(_DWORD *)(v28 - 4) = *(_DWORD *)v25;
*(_QWORD *)(v28 + 184) = v27;
v30 = *(unsigned int *)v25;
v27 += 24 * v30;
if( (_DWORD)v30 )
{
do
{
v31 = 3 * v29;
v29 = (unsigned int)(v29 + 1);
*(_QWORD *)(*(_QWORD *)(v28 + 184) + 8 * v31 + 16) = v23;
v23 += 24i64 * *((unsigned int *)v25 - 1);
}
while( (unsigned int)v29 < *(_DWORD *)v25 );
}
v25 += 112;
v28 += 384i64;
--v26;
}
while( v26 );
v1 = a1;
v32 = 0;
v33 = v12 + v65;
if( v70 )
{
do
{
KeGetPrcb(v32);
v34 = 0;
v36 = *(_QWORD *)(v35 + 0x8000);
*(_QWORD *)(v36 + 784) = v23;
v23 += 24 * v4;
*(_QWORD *)(v36 + 808) = v33;
v33 += 4 * v4;
*(_DWORD *)(v36 + 776) = v4;
*(_QWORD *)(v36 + 752) = v12 + v67 + v32 * v66;
*(_DWORD *)(v36 + 792) = v4;
v37 = (_QWORD *)(v12 + 312);
do
{
v38 = *(_QWORD *)(v36 + 784);
v39 = 3i64 * ((unsigned int)v4 - v34 - 1);
*(_DWORD *)(v38 + 8 * v39 + 4) = v34++;
*(_DWORD *)(v38 + 8 * v39 + 8) = *((_DWORD *)v37 - 47);
v40 = *v37;
v37 += 48;
*(_QWORD *)(v38 + 8 * v39 + 16) = v40;
}
while( v34 < (unsigned int)v4 );
++v32;
}
while( v32 < v70 );
v1 = a1;
}
}
v41 = v12 + 76;
v42 = (char *)v1 + 244;
v43 = v4;
do
{
v44 = 0i64;
*(_DWORD *)(v41 - 4) = *((_DWORD *)v42 - 1);
*(_DWORD *)v41 = *(_DWORD *)v42;
for( *(_BYTE *)(v41 + 45) = v42[12]; (unsigned int)v44 < *((_DWORD *)v42 + 2); v44 = (unsigned int)(v44 + 1) )
{
v45 = *(_QWORD *)(v41 + 236);
v46 = 3 * v44;
v47 = 0i64;
v48 = *(_QWORD *)(v42 + 20) + 16i64 * (unsigned int)v44;
*(_DWORD *)(v45 + 8 * v46) = *(_DWORD *)v48;
*(_DWORD *)(v45 + 8 * v46 + 8) = *(_DWORD *)(v48 + 4);
v49 = *(_DWORD *)(v48 + 4);
if( v49 )
{
do
{
v50 = *(_QWORD *)(v48 + 8);
v51 = *(_QWORD *)(v45 + 24 * v44 + 16);
v52 = 3i64 * (v49 - (unsigned int)v47 - 1);
v53 = *(unsigned __int8 *)(v50 + 4 * v47);
*(_DWORD *)(v51 + 8 * v52 + 4) = v53;
*(_BYTE *)(v51 + 8 * v52) = *(_BYTE *)(v50 + 4 * v47 + 1) == 0;
*(_BYTE *)(v51 + 8 * v52 + 1) = *(_BYTE *)(v50 + 4 * v47 + 2);
*(_BYTE *)(v51 + 8 * v52 + 2) = *(_BYTE *)(v50 + 4 * v47 + 3);
if( *(_DWORD *)(v45 + 24 * v44) == -1 )
{
v54 = 384i64 * (unsigned __int8)v53;
*(_DWORD *)(v51 + 8 * v52 + 8) = *(_DWORD *)(v54 + v12 + 124);
v55 = *(_QWORD *)(v54 + v12 + 312);
}
else
{
*(_DWORD *)(v51 + 8 * v52 + 8) = 0;
v55 = 0i64;
}
*(_QWORD *)(v51 + 8 * v52 + 16) = v55;
v47 = (unsigned int)(v47 + 1);
v49 = *(_DWORD *)(v48 + 4);
}
while( (unsigned int)v47 < v49 );
}
}
v41 += 384i64;
v42 += 224;
--v43;
}
while( v43 );
for( j = 0; j < v70; ++j )
{
KeGetPrcb(j);
v58 = 0;
for( k = *(_QWORD *)(v59 + 0x8000); v58 < v68; *(_BYTE *)(v62 + 8 * v63 + 1) = v61 )
{
v61 = PpmCheckCoordinatedStateInitiator(
j,
*(_DWORD *)(*(_QWORD *)(k + 784) + 24i64 * (v68 - v58 - 1) + 8),
*(_QWORD *)(*(_QWORD *)(k + 784) + 24i64 * (v68 - v58 - 1) + 16),
v57);
++v58;
}
}
if( !PpmPlatformStates )
{
PpmEnableCoordinatedIdleStates((UINT64 *)v12, 1);
v2 = 0;
}
updated = 0;
LABEL_50:
if( v2 )
goto LABEL_51;
return(unsigned int)updated;
}Referenced by:
No references.