PpmParkRegisterParking
VOID __stdcall PpmParkRegisterParking(){
unsigned int v0;
unsigned __int8 v1;
__int64 v2;
__int64 v3;
unsigned __int64 v4;
_BYTE *v5;
unsigned int v6;
unsigned int v7;
VOID **PoolWithTag;
VOID **v9;
unsigned __int64 v10;
int v11;
_KPRCB *Prcb;
unsigned __int64 v13;
unsigned int v14;
unsigned int v15;
unsigned __int16 Group;
unsigned __int64 v17;
unsigned __int64 v18;
VOID **v19;
unsigned __int8 v20;
__int64 v21;
int v22;
_KPRCB *v23;
char *v24;
unsigned int v25;
char v26;
__int64 v27;
unsigned int v28;
unsigned __int8 *v29;
int v30;
__int64 v31;
unsigned __int64 v32;
unsigned __int8 v33;
unsigned int v34;
unsigned __int8 v35;
size_t v36;
VOID **v37;
VOID **v38;
VOID **v39;
char *v40;
__int64 v41;
int v42;
VOID **v43;
__int64 v44;
VOID **v45;
VOID **v46;
unsigned __int8 *v47;
unsigned __int64 v48;
PVOID v49;
PVOID *v50;
__int64 v51;
__int64 v52;
PVOID *v53;
__int64 v54;
__int64 v55;
__int64 *v56;
int v57;
__int64 v58;
__int64 v59;
__int64 v60;
char *v61;
unsigned int *v62;
int v63;
VOID **v64;
unsigned int v65;
__int64 v66;
VOID **v67;
VOID **v68;
PVOID *v69;
__int64 v70;
__int64 v71;
PVOID *v72;
UINT64 Count;
UINT64 ProcIndex;
UINT64 Param2;
__int64 v76;
VOID **v77;
PVOID P;
VOID **v79;
_KAFFINITY_ENUMERATION_CONTEXT Context;
__int64 Affinity;
_GROUP_AFFINITY Affinity_8;
_KAFFINITY_EX TargetProcessors;
memset(&TargetProcessors, 0i64, sizeof(TargetProcessors));
v0 = 0;
Affinity = 0i64;
LODWORD(ProcIndex) = 0;
Affinity_8 = 0i64;
LOWORD(Count) = 0;
P = 0i64;
memset(&Context, 0, sizeof(Context));
LODWORD(Param2) = 0;
if( PpmParkNodes )
{
v1 = KeAcquireSpinLockRaiseToDpc((UINT64 *)&stru_140C23628 + 135);
v2 = (unsigned int)PpmParkNumNodes;
v3 = PpmParkNodes;
v4 = v1;
Context.Affinity = (_KAFFINITY_EX *)PpmParkHistograms;
LODWORD(Param2) = PpmParkNumNodes;
P = (PVOID)PpmParkNodes;
LODWORD(PpmParkNumNodes) = 0;
PpmParkNodes = 0i64;
PpmParkHistograms = 0i64;
KxReleaseSpinLock((UINT64 *)&stru_140C23628 + 135);
__writecr8(v4);
if( (_DWORD)v2 )
{
v5 = (_BYTE *)(v3 + 146);
do
{
if( *(_QWORD *)(v5 - 74) && (*v5 & 8) != 0 )
{
*(_DWORD *)&TargetProcessors.Count = 1310721;
memset(&TargetProcessors.Reserved, 0i64, 0xA4u);
v54 = *((unsigned __int16 *)v5 - 71);
v55 = *(_QWORD *)(v5 - 138);
if( (_WORD)v54 )
TargetProcessors.Count = v54 + 1;
TargetProcessors.Bitmap[v54] |= v55;
PopExecuteOnTargetProcessors(
&TargetProcessors,
(INT64 *)PpmIdleRemoveConcurrency,
0i64,
0i64,
Count,
ProcIndex,
Param2);
}
v5 += 272;
--v2;
}
while( v2 );
}
}
v6 = 0;
HIDWORD(ProcIndex) = 0;
v7 = 0;
if( KeNumberNodes )
{
do
{
KeQueryNodeActiveAffinity(v7, 0i64, (PUSHORT)&Count);
if( (_WORD)Count )
++v6;
++v7;
}
while( v7 < (unsigned __int16)KeNumberNodes );
HIDWORD(ProcIndex) = v6;
}
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 272 * v6, 1884115024i64);
v79 = PoolWithTag;
v9 = PoolWithTag;
v77 = 0i64;
if( !PoolWithTag )
goto LABEL_62;
memset(PoolWithTag, 0i64, 272 * v6);
PpmParkGranularity = 1;
PpmParkCoreMask = PpmParkUseCoreGranularity != 0;
PpmParkUnparkCores = PpmParkUseCoreGranularity == 2;
if( PpmParkUseCoreGranularity )
{
LODWORD(v10) = 0;
*(_QWORD *)&Context.CurrentIndex = PpmCheckRegistered.Bitmap[0];
Context.CurrentMask = (unsigned __int64)&PpmCheckRegistered;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, (_KAFFINITY_ENUMERATION_CONTEXT *)&Context.CurrentMask);
if( v11 )
break;
Prcb = KeGetPrcb((unsigned int)ProcIndex);
v13 = Prcb->CoreProcessorSet - ((Prcb->CoreProcessorSet >> 1) & 0x5555555555555555i64);
if( (_DWORD)v10 )
{
if( (_DWORD)v10 != (unsigned int)((0x101010101010101i64
* (((v13 & 0x3333333333333333i64)
+ ((v13 >> 2) & 0x3333333333333333i64)
+ (((v13 & 0x3333333333333333i64) + ((v13 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24 )
PpmParkCoreMask = 0;
}
else
{
v10 = (0x101010101010101i64
* (((v13 & 0x3333333333333333i64)
+ ((v13 >> 2) & 0x3333333333333333i64)
+ (((v13 & 0x3333333333333333i64) + ((v13 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
}
}
v9 = v79;
if( PpmParkCoreMask )
PpmParkGranularity = v10;
}
HIDWORD(Count) = 0;
v14 = 0;
v15 = 0;
HIDWORD(Param2) = 0;
if( !KeNumberNodes )
{
LABEL_52:
v36 = 8 * v14;
v37 = ExAllocatePoolWithTag(0x200ui64, 8i64 * v14, 1884115024i64);
v77 = v37;
v38 = v37;
if( v37 )
{
memset(v37, 0i64, v36);
v39 = v38;
if( v6 )
{
v40 = (char *)(v9 + 15);
v41 = v6;
v76 = v6;
do
{
v42 = (unsigned __int8)*(v40 - 114);
v43 = v39;
*((_QWORD *)v40 - 5) = v39;
v44 = (unsigned int)++v42;
v45 = &v39[v44];
*(_DWORD *)v40 = v42;
*((_QWORD *)v40 - 4) = v45;
v46 = &v45[v44];
*((_QWORD *)v40 - 3) = v46;
v39 = &v46[v44];
memmove(v43, (const VOID *)(*((_QWORD *)v40 - 6) + 32i64), v44 * 8);
memmove(*((VOID **)v40 - 4), (const VOID *)(*((_QWORD *)v40 - 6) + 32i64), 8 * *(_DWORD *)v40);
v47 = (unsigned __int8 *)(v40 + 8);
*((_QWORD *)v40 - 2) = *(_QWORD *)(*((_QWORD *)v40 - 6) + 24i64);
*((_QWORD *)v40 - 1) = *(_QWORD *)(*((_QWORD *)v40 - 6) + 24i64);
if( *(v40 - 114) != v40[8] )
{
v60 = 2i64;
v61 = v40 + 32;
v62 = (unsigned int *)(v40 + 88);
do
{
v63 = *v47;
v64 = v39;
if( (_BYTE)v63 )
{
*((_QWORD *)v62 - 5) = v39;
v65 = v63 + 1;
v66 = v65;
v67 = &v39[v66];
*v62 = v65;
*((_QWORD *)v62 - 4) = v67;
v68 = &v67[v66];
*((_QWORD *)v62 - 3) = v68;
v39 = &v68[v66];
memmove(v64, (const VOID *)(*(_QWORD *)v61 + 32i64), v66 * 8);
memmove(*((VOID **)v62 - 4), (const VOID *)(*(_QWORD *)v61 + 32i64), 8 * *v62);
*((_QWORD *)v62 - 2) = *(_QWORD *)(*(_QWORD *)v61 + 24i64);
*((_QWORD *)v62 - 1) = *(_QWORD *)(*(_QWORD *)v61 + 24i64);
}
v61 += 8;
v62 += 12;
++v47;
--v60;
}
while( v60 );
v41 = v76;
}
v40 += 272;
v76 = --v41;
}
while( v41 );
v9 = v79;
v6 = HIDWORD(ProcIndex);
v38 = v77;
}
v48 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&stru_140C23628 + 135);
LODWORD(PpmParkNumNodes) = v6;
PpmParkNodes = (__int64)v9;
PpmParkHistograms = (__int64)v38;
KxReleaseSpinLock((UINT64 *)&stru_140C23628 + 135);
__writecr8(v48);
v9 = 0i64;
v38 = 0i64;
}
goto LABEL_59;
}
while( 1 )
{
KeQueryNodeActiveAffinity(v0, &Affinity_8, 0i64);
Group = Affinity_8.Group;
v17 = Affinity_8.Group >= PpmCheckRegistered.Count ? 0i64 : PpmCheckRegistered.Bitmap[Affinity_8.Group];
v18 = v17 & Affinity_8.Mask;
Affinity_8.Mask &= v17;
if( Affinity_8.Mask )
break;
LABEL_50:
HIDWORD(Param2) = ++v0;
if( v0 >= (unsigned __int16)KeNumberNodes )
{
v6 = HIDWORD(ProcIndex);
v14 = HIDWORD(Count);
goto LABEL_52;
}
}
LODWORD(v76) = v15 + 1;
v19 = &v9[34 * v15];
v20 = 0;
*((_WORD *)v19 + 2) = Affinity_8.Group;
v19[1] = (VOID *)v18;
do
{
v21 = v20;
if( v20 )
v21 = PpmHeteroPolicy != 0 ? v20 : 0;
LOWORD(Affinity) = Group;
*(_QWORD *)&Context.CurrentIndex = v18;
Context.CurrentMask = 0i64;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, (_KAFFINITY_ENUMERATION_CONTEXT *)&Context.CurrentMask);
if( v22 )
break;
v23 = KeGetPrcb((unsigned int)ProcIndex);
if( v23->PowerState.ArchitecturalEfficiencyClass == v20 )
{
++*((_BYTE *)v19 + v21 + 128);
v19[v21 + 2] = (VOID *)(v23->GroupSetMember | (unsigned __int64)v19[v21 + 2]);
}
}
++v20;
}
while( v20 < 2u );
v0 = HIDWORD(Param2);
v24 = (char *)(v19 + 16);
v9 = v79;
v25 = 0;
v26 = *((_BYTE *)v19 + 129);
if( !*((_BYTE *)v19 + 128) )
{
*v24 = v26;
v19[2] = v19[3];
v26 = 0;
*((_BYTE *)v19 + 129) = 0;
v19[3] = 0i64;
}
if( !v26 )
*((_BYTE *)v19 + 146) |= 4u;
v27 = 2i64;
v28 = 0;
v29 = (unsigned __int8 *)(v19 + 16);
do
{
v30 = *v29;
v29[10] = v30;
v28 += v30;
v29[15] = v30;
++v29;
--v27;
}
while( v27 );
*(_DWORD *)&TargetProcessors.Count = 1310721;
HIDWORD(Count) += v28 + 2 * v28 + 3;
memset(&TargetProcessors.Reserved, 0i64, 0xA4u);
v31 = *((unsigned __int16 *)v19 + 2);
v32 = (unsigned __int64)v19[1];
if( (_WORD)v31 )
TargetProcessors.Count = v31 + 1;
TargetProcessors.Bitmap[v31] |= v32;
if( PpmIdleInitializeConcurrency(&TargetProcessors, (PPM_CONCURRENCY_ACCOUNTING **)v19 + 9) < 0 )
{
v38 = 0i64;
goto LABEL_59;
}
if( v28 == (unsigned __int8)*v24 )
{
LABEL_45:
v33 = PpmParkGranularity;
v34 = 1;
v15 = v76;
*((_BYTE *)v19 + 6) = v28;
*((_BYTE *)v19 + 135) = v28;
*((_BYTE *)v19 + 137) = v28;
if( !PpmParkMultiparkGranularity )
v34 = PpmParkMultiparkGranularity;
v35 = v28 / v34;
if( v35 < v33 )
v35 = v33;
*((_BYTE *)v19 + 145) = v35;
goto LABEL_50;
}
v56 = (__int64 *)(v19 + 2);
while( 1 )
{
v57 = (unsigned __int8)*v24;
if( (_BYTE)v57 )
{
*(_DWORD *)&TargetProcessors.Count = 1310721;
HIDWORD(Count) += v57 + 2 * v57 + 3;
memset(&TargetProcessors.Reserved, 0i64, 0xA4u);
v58 = *((unsigned __int16 *)v19 + 2);
v59 = *v56;
if( (_WORD)v58 )
TargetProcessors.Count = v58 + 1;
TargetProcessors.Bitmap[v58] |= v59;
if( PpmIdleInitializeConcurrency(&TargetProcessors, (PPM_CONCURRENCY_ACCOUNTING **)&v19[v25 + 19]) < 0 )
break;
}
++v56;
++v25;
++v24;
if( v25 >= 2 )
goto LABEL_45;
}
v38 = v77;
LABEL_59:
if( v9 )
{
if( HIDWORD(ProcIndex) )
{
v69 = v9 + 9;
v70 = HIDWORD(ProcIndex);
do
{
if( *v69 )
ExFreePoolWithTag(*v69, 0x704D5050u);
v71 = 2i64;
v72 = v69 + 10;
do
{
if( *v72 )
ExFreePoolWithTag(*v72, 0x704D5050u);
++v72;
--v71;
}
while( v71 );
v69 += 34;
--v70;
}
while( v70 );
}
ExFreePoolWithTag(v9, 0x704D5050u);
}
if( v38 )
ExFreePoolWithTag(v38, 0x704D5050u);
LABEL_62:
v49 = P;
if( P )
{
if( (_DWORD)Param2 )
{
v50 = (PVOID *)((char *)P + 72);
v51 = (unsigned int)Param2;
do
{
if( *v50 )
ExFreePoolWithTag(*v50, 0x704D5050u);
v52 = 2i64;
v53 = v50 + 10;
do
{
if( *v53 )
ExFreePoolWithTag(*v53, 0x704D5050u);
++v53;
--v52;
}
while( v52 );
v50 += 34;
--v51;
}
while( v51 );
}
ExFreePoolWithTag(v49, 0x704D5050u);
}
if( Context.Affinity )
ExFreePoolWithTag(Context.Affinity, 0x704D5050u);
PpmParkApplyPolicy();
PpmParkParkingAvailable();
}Referenced by:
PpmCheckInitProcessors