PpmParkSteerInterrupts
UINT8 __stdcall PpmParkSteerInterrupts(){
unsigned int v0;
unsigned int v1;
unsigned int v2;
unsigned __int64 CurrentMask;
__int64 v4;
unsigned __int64 v5;
unsigned int v6;
unsigned int v7;
__int64 v8;
__int64 v9;
unsigned __int64 v10;
unsigned int v11;
unsigned __int64 *Bitmap;
__int64 Count;
unsigned __int64 v14;
bool v15;
int v16;
unsigned __int64 v17;
UINT64 v19;
VOID **PoolWithTag;
unsigned int FirstSetRightAffinity;
int v22;
unsigned __int64 v23;
UINT64 ProcIndex;
_KAFFINITY_ENUMERATION_CONTEXT Context;
__int64 ReturnedCurrentTime[2];
_KAFFINITY_EX Affinity;
_KAFFINITY_EX Affinity1;
_KAFFINITY_EX Result;
_KAFFINITY_EX Affinity2;
_KAFFINITY_EX v31;
ReturnedCurrentTime[0] = 0i64;
memset(&Context, 0, sizeof(Context));
memset(&Affinity, 0i64, sizeof(Affinity));
memset(Affinity1.Bitmap, 0i64, sizeof(Affinity1.Bitmap));
memset(&Result, 0i64, sizeof(Result));
memset(&Affinity2, 0i64, sizeof(Affinity2));
memset(&v31, 0i64, sizeof(v31));
ProcIndex = 0i64;
if( PpmIntSteerDisabled || !KiIntTrackRootEnabled )
return 1;
if( !PpmIntSteerTrigger )
{
v19 = (unsigned int)(8 * HalQueryMaximumProcessorCount());
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v19, 1802654793i64);
PpmIntSteerTrigger = (__int64)PoolWithTag;
if( !PoolWithTag )
return 1;
memset(PoolWithTag, 0i64, v19);
}
KeIntSteerSnapPerf((UINT64 *)((char *)&ProcIndex + 4), (UINT64 *)ReturnedCurrentTime);
KeComplementAffinityEx(&Result, &PpmPerfCoreParkingMask);
KeQuerySystemAllowedCpuSetAffinity(&PpmCachedSystemAllowedCpuSet, &PpmCachedSystemAllowedCpuSetVersion);
KeAndAffinityEx(&Result.Count, &PpmCachedSystemAllowedCpuSet.Count, (INT8 *)&Result);
*(_DWORD *)&Affinity1.Count = 1310721;
v0 = 0;
v1 = 0;
v2 = 0;
memset(&Affinity1.Reserved, 0i64, 0xA4u);
CurrentMask = KeActiveProcessors.Bitmap[0];
v4 = ReturnedCurrentTime[0];
Context.Affinity = &KeActiveProcessors;
while( CurrentMask )
{
LABEL_6:
++v0;
_BitScanForward64(&v5, CurrentMask);
CurrentMask &= ~(1i64 << v5);
LODWORD(ProcIndex) = KiProcessorNumberToIndexMappingTable[64 * Context.CurrentIndex + (unsigned __int8)v5];
v6 = KiProcessorIndexToNumberMappingTable[(unsigned int)ProcIndex];
v7 = v6 & 0x3F;
if( ((Result.Bitmap[(unsigned __int64)v6 >> 6] >> (KiProcessorIndexToNumberMappingTable[(unsigned int)ProcIndex] & 0x3F)) & 1) != 0 )
{
++v2;
v8 = *(_QWORD *)(PpmIntSteerTrigger + 8i64 * (unsigned int)ProcIndex);
if( !v8 )
{
v8 = v4;
*(_QWORD *)(PpmIntSteerTrigger + 8i64 * (unsigned int)ProcIndex) = v4;
}
if( v4 - v8 >= (unsigned __int64)(10000 * PpmIntSteerTriggerMax) )
{
v9 = v6 >> 6;
if( Affinity1.Count <= (unsigned int)v9 )
Affinity1.Count = v9 + 1;
v10 = Affinity1.Bitmap[v9];
_bittestandset64((__int64 *)&v10, v7);
Affinity1.Bitmap[v9] = v10;
++v1;
}
}
else
{
*(_QWORD *)(8i64 * (unsigned int)ProcIndex + PpmIntSteerTrigger) = 0i64;
}
}
while( ++Context.CurrentIndex < (unsigned int)KeActiveProcessors.Count )
{
Context.CurrentMask = KeActiveProcessors.Bitmap[Context.CurrentIndex];
CurrentMask = Context.CurrentMask;
if( Context.CurrentMask )
{
v4 = ReturnedCurrentTime[0];
goto LABEL_6;
}
}
if( !v1 )
{
if( v2 )
{
KeCopyAffinityEx(&Affinity1, &Result);
v1 = v2;
}
else
{
FirstSetRightAffinity = KeFindFirstSetRightAffinityEx(&PpmCachedSystemAllowedCpuSet.Count);
if( FirstSetRightAffinity == -1 )
FirstSetRightAffinity = 0;
LODWORD(ProcIndex) = FirstSetRightAffinity;
KeAddProcessorAffinityEx(&Affinity1.Count, FirstSetRightAffinity);
v1 = 1;
}
}
if( PpmIntSteerMode < 1 )
goto LABEL_16;
switch( PpmIntSteerMode )
{
case 1:
KeCopyAffinityEx(&Affinity, &KeActiveProcessors);
v2 = v0;
break;
case 2:
KeCopyAffinityEx(&Affinity, &Affinity1);
v2 = v1;
break;
case 3:
KeCopyAffinityEx(&Affinity, &Result);
break;
default:
if( (unsigned int)(PpmIntSteerMode - 5) > 1 )
{
LABEL_16:
v2 = (PpmIntSteerLoadMax + HIDWORD(ProcIndex)) / (unsigned int)PpmIntSteerLoadMax;
if( v2 >= v1 )
{
v2 = v1;
KeCopyAffinityEx(&Affinity, &Affinity1);
}
else
{
*(_DWORD *)&Affinity.Count = 1310721;
memset(&Affinity.Reserved, 0i64, 0xA4u);
*(_DWORD *)&Affinity2.Count = 1310721;
memset(&Affinity2.Reserved, 0i64, 0xA4u);
if( *(&stru_140C23628 + 479) )
(*(&stru_140C23628 + 479))(
1i64,
*(&PopIrpWorkerControlEvent + 152),
v2,
&Affinity1,
0i64,
0i64,
&Affinity2,
&Affinity);
v11 = 0;
if( Affinity.Count )
{
Bitmap = Affinity.Bitmap;
Count = Affinity.Count;
do
{
v14 = *Bitmap++;
v11 += (unsigned int)((0x101010101010101i64
* ((((v14 - ((v14 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v14 - ((v14 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
+ ((((v14 - ((v14 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v14 - ((v14 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24;
--Count;
}
while( Count );
}
v15 = v11 < v2;
if( v11 > v2 )
{
*(_DWORD *)&Affinity.Count = 1310721;
memset(&Affinity.Reserved, 0i64, 0xA4u);
v15 = v2 != 0;
v11 = 0;
}
if( v15 )
{
KeSubtractAffinityEx(&Affinity1.Count, (INT8 *)&Affinity2, (INT8 *)&v31);
Context.CurrentMask = v31.Bitmap[0];
Context.Affinity = &v31;
Context.CurrentIndex = 0;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v16 )
break;
v17 = (unsigned int)KiProcessorIndexToNumberMappingTable[(unsigned int)ProcIndex];
if( ((Affinity.Bitmap[v17 >> 6] >> (v17 & 0x3F)) & 1) == 0 )
{
KeAddProcessorAffinityEx(&Affinity.Count, (unsigned int)ProcIndex);
if( ++v11 >= v2 )
goto LABEL_29;
}
}
if( v11 < v2 )
{
Context.CurrentMask = Affinity1.Bitmap[0];
Context.Affinity = &Affinity1;
Context.CurrentIndex = 0;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v22 )
break;
v23 = (unsigned int)KiProcessorIndexToNumberMappingTable[(unsigned int)ProcIndex];
if( ((Affinity.Bitmap[v23 >> 6] >> (v23 & 0x3F)) & 1) == 0 )
{
KeAddProcessorAffinityEx(&Affinity.Count, (unsigned int)ProcIndex);
if( ++v11 >= v2 )
break;
}
}
}
}
}
break;
}
*(_DWORD *)&Affinity.Count = 1310721;
memset(&Affinity.Reserved, 0i64, 0xA4u);
KeAddProcessorAffinityEx(&Affinity.Count, (unsigned int)(PpmIntSteerMode - 5));
v2 = 1;
break;
}
LABEL_29:
if( KeIsEmptyAffinityEx(&Affinity.Count) )
KeAddProcessorAffinityEx(&Affinity.Count, 0i64);
KeIntSteerPeriodic(&Affinity, v2);
return 1;
}Referenced by:
No references.