PpmParkRegisterParking
INT64 __fastcall PpmParkRegisterParking(INT64 a1){
UINT64 v1;
__int64 v2;
__int64 v3;
INT64 v4;
unsigned __int8 v5;
unsigned __int64 v6;
_BYTE *v7;
unsigned int v8;
unsigned int v9;
char *PoolWithTag;
char *v11;
unsigned __int64 v12;
__int64 v13;
unsigned __int64 v14;
unsigned int v15;
int v16;
unsigned __int16 Group;
INT64 v18;
unsigned __int64 v19;
char *v20;
unsigned __int8 v21;
__int64 v22;
__int64 v23;
char *v24;
unsigned int v25;
char v26;
__int64 v27;
unsigned int v28;
unsigned __int8 *v29;
int v30;
__int64 v31;
__int64 v32;
_QWORD *v33;
unsigned __int8 v34;
unsigned int v35;
unsigned __int8 v36;
UINT8 *v37;
UINT8 *v38;
UINT64 v39;
UINT8 *v40;
unsigned int *v41;
INT64 v42;
unsigned int v43;
UINT8 *v44;
UINT64 v45;
UINT8 *v46;
UINT8 *v47;
unsigned __int8 *v48;
unsigned __int8 v49;
unsigned __int64 v50;
PVOID v51;
PVOID *v52;
__int64 v53;
__int64 v54;
PVOID *v55;
INT64 v56;
INT64 v57;
INT64 v58;
INT64 v59;
INT64 v60;
__int64 v61;
__int64 v62;
__int64 *v63;
int v64;
__int64 v65;
__int64 v66;
char *v67;
__int64 v68;
unsigned int *v69;
unsigned int *v70;
int v71;
UINT8 *v72;
unsigned int v73;
UINT64 v74;
UINT8 *v75;
UINT8 *v76;
PVOID *v77;
__int64 v78;
__int64 v79;
PVOID *v80;
INT64 Count;
INT64 a6;
INT64 a7;
INT64 a8;
INT64 a9;
PVOID P;
INT64 a11;
PVOID v88;
__int128 v89;
__int64 Affinity;
struct _GROUP_AFFINITY Affinity_8;
int result;
_BYTE result_4[172];
memset((INT64)&result, 0i64);
LODWORD(v2) = 0;
v89 = 0i64;
Affinity = 0i64;
LODWORD(a6) = 0;
Affinity_8 = 0i64;
LOWORD(Count) = 0;
P = 0i64;
v88 = 0i64;
LODWORD(a7) = 0;
if( PpmParkNodes )
{
KeAcquireSpinLockRaiseToDpc(&PpmParkStateLock, v1);
v3 = (unsigned int)PpmParkNumNodes;
v4 = PpmParkNodes;
v6 = v5;
v88 = (PVOID)PpmParkHistograms;
LODWORD(a7) = PpmParkNumNodes;
P = (PVOID)PpmParkNodes;
LODWORD(PpmParkNumNodes) = 0;
PpmParkNodes = 0i64;
PpmParkHistograms = 0i64;
KxReleaseSpinLock(&PpmParkStateLock);
__writecr8(v6);
if( (_DWORD)v3 )
{
v7 = (_BYTE *)(v4 + 146);
do
{
if( *(_QWORD *)(v7 - 74) && (*v7 & 8) != 0 )
{
result = 1310721;
memset((INT64)result_4, 0i64);
v61 = *((unsigned __int16 *)v7 - 71);
v62 = *(_QWORD *)(v7 - 138);
if( (unsigned __int16)result <= (unsigned __int16)v61 )
LOWORD(result) = v61 + 1;
*(_QWORD *)&result_4[8 * v61 + 4] |= v62;
PopExecuteOnTargetProcessors((INT64)&result, (INT64)PpmIdleRemoveConcurrency, 0i64, 0i64);
}
v7 += 272;
--v3;
}
while( v3 );
}
}
v8 = 0;
HIDWORD(a6) = 0;
v9 = 0;
if( KeNumberNodes )
{
do
{
KeQueryNodeActiveAffinity(v9, 0i64, (PUSHORT)&Count);
if( (_WORD)Count )
++v8;
++v9;
}
while( v9 < (unsigned __int16)KeNumberNodes );
HIDWORD(a6) = v8;
}
PoolWithTag = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, 272 * v8, 0x704D5050ui64);
a11 = (INT64)PoolWithTag;
v11 = PoolWithTag;
a9 = 0i64;
if( !PoolWithTag )
goto LABEL_64;
memset((INT64)PoolWithTag, 0i64);
PpmParkGranularity = 1;
PpmParkCoreMask = PpmParkUseCoreGranularity != 0;
PpmParkUnparkCores = PpmParkUseCoreGranularity == 2;
if( PpmParkUseCoreGranularity )
{
LODWORD(v12) = 0;
*((_QWORD *)&v89 + 1) = qword_140C11268[0];
*(_QWORD *)&v89 = &PpmCheckRegistered;
while( !(unsigned int)KeEnumerateNextProcessor(&a6, (unsigned __int16 **)&v89) )
{
KeGetPrcb((unsigned int)a6);
v14 = *(_QWORD *)(v13 + 33880) - ((*(_QWORD *)(v13 + 33880) >> 1) & 0x5555555555555555i64);
if( (_DWORD)v12 )
{
if( (_DWORD)v12 != (unsigned int)((0x101010101010101i64
* (((v14 & 0x3333333333333333i64)
+ ((v14 >> 2) & 0x3333333333333333i64)
+ (((v14 & 0x3333333333333333i64) + ((v14 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24 )
PpmParkCoreMask = 0;
}
else
{
v12 = (0x101010101010101i64
* (((v14 & 0x3333333333333333i64)
+ ((v14 >> 2) & 0x3333333333333333i64)
+ (((v14 & 0x3333333333333333i64) + ((v14 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
}
}
v11 = (char *)a11;
if( PpmParkCoreMask )
PpmParkGranularity = v12;
}
HIDWORD(Count) = 0;
v15 = 0;
v16 = 0;
HIDWORD(a7) = 0;
if( !KeNumberNodes )
{
LABEL_54:
v37 = (UINT8 *)ExAllocatePoolWithTag(NonPagedPoolNx, 8i64 * v15, 0x704D5050ui64);
a9 = (INT64)v37;
v38 = v37;
if( v37 )
{
memset((INT64)v37, 0i64);
v40 = v38;
if( v8 )
{
v41 = (unsigned int *)(v11 + 120);
v42 = v8;
a8 = v8;
do
{
v43 = *((unsigned __int8 *)v41 - 114);
v44 = v40;
*((_QWORD *)v41 - 5) = v40;
v45 = 8i64 * ++v43;
v46 = &v40[v45];
*v41 = v43;
*((_QWORD *)v41 - 4) = v46;
v47 = &v46[v45];
*((_QWORD *)v41 - 3) = v47;
v40 = &v47[v45];
memmove(v44, (UINT8 *)(*((_QWORD *)v41 - 6) + 32i64), v45);
memmove(*((UINT8 **)v41 - 4), (UINT8 *)(*((_QWORD *)v41 - 6) + 32i64), 8i64 * *v41);
v48 = (unsigned __int8 *)(v41 + 2);
*((_QWORD *)v41 - 2) = *(_QWORD *)(*((_QWORD *)v41 - 6) + 24i64);
*((_QWORD *)v41 - 1) = *(_QWORD *)(*((_QWORD *)v41 - 6) + 24i64);
if( *((_BYTE *)v41 - 114) != *((_BYTE *)v41 + 8) )
{
v68 = 2i64;
v69 = v41 + 8;
v70 = v41 + 22;
do
{
v71 = *v48;
v72 = v40;
if( (_BYTE)v71 )
{
*((_QWORD *)v70 - 5) = v40;
v73 = v71 + 1;
v74 = 8i64 * v73;
v75 = &v40[v74];
*v70 = v73;
*((_QWORD *)v70 - 4) = v75;
v76 = &v75[v74];
*((_QWORD *)v70 - 3) = v76;
v40 = &v76[v74];
memmove(v72, (UINT8 *)(*(_QWORD *)v69 + 32i64), v74);
memmove(*((UINT8 **)v70 - 4), (UINT8 *)(*(_QWORD *)v69 + 32i64), 8i64 * *v70);
*((_QWORD *)v70 - 2) = *(_QWORD *)(*(_QWORD *)v69 + 24i64);
*((_QWORD *)v70 - 1) = *(_QWORD *)(*(_QWORD *)v69 + 24i64);
}
v69 += 2;
v70 += 12;
++v48;
--v68;
}
while( v68 );
v42 = a8;
}
v41 += 68;
a8 = --v42;
}
while( v42 );
v11 = (char *)a11;
v8 = HIDWORD(a6);
v38 = (UINT8 *)a9;
}
KeAcquireSpinLockRaiseToDpc(&PpmParkStateLock, v39);
v50 = v49;
LODWORD(PpmParkNumNodes) = v8;
PpmParkNodes = (INT64)v11;
PpmParkHistograms = (INT64)v38;
KxReleaseSpinLock(&PpmParkStateLock);
__writecr8(v50);
v11 = 0i64;
v38 = 0i64;
}
goto LABEL_61;
}
while( 1 )
{
KeQueryNodeActiveAffinity(v2, &Affinity_8, 0i64);
Group = Affinity_8.Group;
v18 = Affinity_8.Group >= (unsigned __int16)PpmCheckRegistered ? 0i64 : *(&PpmCheckRegistered + Affinity_8.Group + 1);
v19 = v18 & Affinity_8.Mask;
Affinity_8.Mask &= v18;
if( Affinity_8.Mask )
break;
LABEL_52:
LODWORD(v2) = v2 + 1;
HIDWORD(a7) = v2;
if( (unsigned int)v2 >= (unsigned __int16)KeNumberNodes )
{
v8 = HIDWORD(a6);
v15 = HIDWORD(Count);
goto LABEL_54;
}
}
LODWORD(a8) = v16 + 1;
v20 = &v11[272 * v16];
v21 = 0;
*((_WORD *)v20 + 2) = Affinity_8.Group;
*((_QWORD *)v20 + 1) = v19;
do
{
v22 = v21;
if( v21 )
v22 = PpmHeteroPolicy != 0 ? v21 : 0;
LOWORD(Affinity) = Group;
*((_QWORD *)&v89 + 1) = v19;
*(_QWORD *)&v89 = 0i64;
while( !(unsigned int)KeEnumerateNextProcessor(&a6, (unsigned __int16 **)&v89) )
{
KeGetPrcb((unsigned int)a6);
if( *(_BYTE *)(v23 + 33208) == v21 )
{
++v20[v22 + 128];
*(_QWORD *)&v20[8 * v22 + 16] |= *(_QWORD *)(v23 + 200);
}
}
++v21;
}
while( v21 < 2u );
v2 = HIDWORD(a7);
v24 = v20 + 128;
v11 = (char *)a11;
v25 = 0;
v26 = v20[129];
if( !v20[128] )
{
*v24 = v26;
*((_QWORD *)v20 + 2) = *((_QWORD *)v20 + 3);
v26 = 0;
v20[129] = 0;
*((_QWORD *)v20 + 3) = 0i64;
}
if( !v26 )
v20[146] |= 4u;
v27 = 2i64;
v28 = 0;
v29 = (unsigned __int8 *)(v20 + 128);
do
{
v30 = *v29;
v29[10] = v30;
v28 += v30;
v29[15] = v30;
++v29;
--v27;
}
while( v27 );
result = 1310721;
HIDWORD(Count) += v28 + 2 * v28 + 3;
memset((INT64)result_4, 0i64);
v31 = *((unsigned __int16 *)v20 + 2);
v32 = *((_QWORD *)v20 + 1);
if( (unsigned __int16)result <= (unsigned __int16)v31 )
LOWORD(result) = v31 + 1;
*(_QWORD *)&result_4[8 * v31 + 4] |= v32;
if( (unsigned int)v2 < (unsigned int)a7 )
v33 = (char *)P + 272 * v2 + 72;
else
v33 = 0i64;
if( (int)PpmIdleInitializeConcurrency((unsigned __int16 *)&result, (_QWORD *)v20 + 9, v33) < 0 )
{
v38 = 0i64;
goto LABEL_61;
}
if( v28 == (unsigned __int8)*v24 )
{
LABEL_47:
v34 = PpmParkGranularity;
v35 = 1;
v16 = a8;
v20[6] = v28;
v20[135] = v28;
v20[137] = v28;
if( !PpmParkMultiparkGranularity )
v35 = PpmParkMultiparkGranularity;
v36 = v28 / v35;
if( v36 < v34 )
v36 = v34;
v20[145] = v36;
goto LABEL_52;
}
v63 = (__int64 *)(v20 + 16);
while( 1 )
{
v64 = (unsigned __int8)*v24;
if( (_BYTE)v64 )
{
result = 1310721;
HIDWORD(Count) += v64 + 2 * v64 + 3;
memset((INT64)result_4, 0i64);
v65 = *((unsigned __int16 *)v20 + 2);
v66 = *v63;
if( (unsigned __int16)result <= (unsigned __int16)v65 )
LOWORD(result) = v65 + 1;
*(_QWORD *)&result_4[8 * v65 + 4] |= v66;
v67 = (unsigned int)v2 >= (unsigned int)a7 ? 0i64 : (char *)P + 272 * v2 + 8 * v25 + 152;
if( (int)PpmIdleInitializeConcurrency((unsigned __int16 *)&result, &v20[8 * v25 + 152], v67) < 0 )
break;
}
++v63;
++v25;
++v24;
if( v25 >= 2 )
goto LABEL_47;
}
v38 = (UINT8 *)a9;
LABEL_61:
if( v11 )
{
if( HIDWORD(a6) )
{
v77 = (PVOID *)(v11 + 72);
v78 = HIDWORD(a6);
do
{
if( *v77 )
ExFreePoolWithTag(*v77, 0x704D5050u);
v79 = 2i64;
v80 = v77 + 10;
do
{
if( *v80 )
ExFreePoolWithTag(*v80, 0x704D5050u);
++v80;
--v79;
}
while( v79 );
v77 += 34;
--v78;
}
while( v78 );
}
ExFreePoolWithTag(v11, 0x704D5050u);
}
if( v38 )
ExFreePoolWithTag(v38, 0x704D5050u);
LABEL_64:
v51 = P;
if( P )
{
if( (_DWORD)a7 )
{
v52 = (PVOID *)((char *)P + 72);
v53 = (unsigned int)a7;
do
{
if( *v52 )
ExFreePoolWithTag(*v52, 0x704D5050u);
v54 = 2i64;
v55 = v52 + 10;
do
{
if( *v55 )
ExFreePoolWithTag(*v55, 0x704D5050u);
++v55;
--v54;
}
while( v54 );
v52 += 34;
--v53;
}
while( v53 );
}
ExFreePoolWithTag(v51, 0x704D5050u);
}
if( v88 )
ExFreePoolWithTag(v88, 0x704D5050u);
PpmParkApplyPolicy();
PpmParkParkingAvailable(v57, v56, v58, v59, Count, a6, a7, a8, a9, (INT64)P, a11, (INT64)v88, v89);
return v60;
}Referenced by:
PpmCheckInitProcessors