KiConfigureHeteroProcessorsTarget
VOID __stdcall KiConfigureHeteroProcessorsTarget(
_KDPC *Dpc,
VOID *Context,
VOID *SystemArgument1,
VOID *SystemArgument2){
signed __int32 v7;
unsigned int v8;
_KPRCB **v9;
unsigned __int8 *v10;
__int64 v11;
_KPRCB *v12;
__int64 Group;
__int64 *v14;
unsigned __int64 GroupSetMember;
__int64 v16;
unsigned __int16 i;
unsigned __int64 v18;
__int64 v19;
int v20;
__int64 v21;
__int64 v22;
__int64 v23;
__int64 v24;
__int64 v25;
__int64 v26;
__int64 v27;
__int64 v28;
__int64 v29;
unsigned int v30;
__int64 *v31;
signed __int32 v32;
unsigned int v33;
__int64 v34[7];
UINT64 SpinCount;
LODWORD(SpinCount) = 0;
v7 = _InterlockedDecrement((volatile signed __int32 *)SystemArgument2);
v8 = ~v7 & 0x80000000;
if( (v7 & 0x7FFFFFFF) != 0 )
{
while( (*(_DWORD *)SystemArgument2 & 0x80000000) != v8 )
KeYieldProcessorEx(&SpinCount);
}
else
{
*(_DWORD *)SystemArgument2 = v8 | *((_DWORD *)SystemArgument2 + 1);
}
if( !KeGetPcr()->Prcb.Number )
{
if( (_DWORD)KeNumberProcessors_0 )
{
v9 = &KiProcessorBlock;
v10 = (unsigned __int8 *)(*(_QWORD *)Context + 8i64);
v11 = (unsigned int)KeNumberProcessors_0;
do
{
v12 = *v9;
Group = (*v9)->Group;
v12->PowerState.EfficiencySchedulingClass = *(v10 - 1);
v12->PowerState.PerformanceSchedulingClass = *v10;
v12->PowerState.ArchitecturalEfficiencyClass = *(v10 - 2);
v14 = &qword_140CFCA78[2 * Group];
GroupSetMember = v12->GroupSetMember;
if( *v10 )
*v14 &= ~GroupSetMember;
else
*v14 |= GroupSetMember;
v10 += 3;
++v9;
--v11;
}
while( v11 );
}
v16 = 0i64;
for( i = 0; i < (unsigned __int16)KeNumberNodes; ++i )
{
v18 = *(_QWORD *)(KeNodeBlock[i] + 136) - ((*(_QWORD *)(KeNodeBlock[i] + 136) >> 1) & 0x5555555555555555i64);
if( (unsigned int)((0x101010101010101i64
* (((v18 & 0x3333333333333333i64)
+ ((v18 >> 2) & 0x3333333333333333i64)
+ (((v18 & 0x3333333333333333i64) + ((v18 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24 )
{
if( v16 )
{
v16 = 0i64;
break;
}
v16 = KeNodeBlock[i];
}
}
KeHeteroSystem = 0;
KeHeteroSystemVirtual = 0;
KeHeteroSystemQos = 0;
if( v16 )
{
if( *((_DWORD *)Context + 3) )
{
KeHeteroSystem = 1;
KeHeteroSystemVirtual = 1;
KeHeteroSystemQos = 1;
goto LABEL_48;
}
if( *((_DWORD *)Context + 4) )
{
v19 = *(unsigned __int16 *)(v16 + 144);
v20 = *((_DWORD *)Context + 2);
KeHeteroSystem = 1;
KeHeteroSystemQos = v20;
if( (unsigned __int16)v19 >= *((_WORD *)Context + 12) )
v21 = 0i64;
else
v21 = *((_QWORD *)Context + v19 + 4);
if( (unsigned __int16)v19 >= *((_WORD *)Context + 96) )
v22 = 0i64;
else
v22 = *((_QWORD *)Context + v19 + 25);
if( (unsigned __int16)v19 >= *((_WORD *)Context + 180) )
v23 = 0i64;
else
v23 = *((_QWORD *)Context + v19 + 46);
if( (unsigned __int16)v19 >= *((_WORD *)Context + 264) )
v24 = 0i64;
else
v24 = *((_QWORD *)Context + v19 + 67);
v25 = *(_QWORD *)(v16 + 136);
v26 = v25 & v21;
v27 = v25 & v22;
v28 = v25 & v23;
v29 = v25 & v24;
}
else
{
v28 = *(_QWORD *)(v16 + 136);
v29 = v28;
v26 = v28;
v27 = v28;
}
v30 = 1;
v31 = (__int64 *)(v16 + 224);
while( 1 )
{
if( v30 == 1 )
{
*(v31 - 2) = v27;
*(v31 - 1) = v26;
*v31 = v26;
goto LABEL_47;
}
if( v30 == 2 )
break;
if( v30 == 3 )
{
*(v31 - 2) = v29;
*(v31 - 1) = v28;
*v31 = v28;
}
else if( v30 == 4 )
{
*(v31 - 2) = v29;
*(v31 - 1) = v28;
LABEL_45:
*v31 = *(_QWORD *)(v16 + 136);
}
LABEL_47:
++v30;
v31 += 3;
if( v30 >= 5 )
goto LABEL_48;
}
*(v31 - 2) = v27;
*(v31 - 1) = v26;
goto LABEL_45;
}
}
LABEL_48:
v32 = _InterlockedDecrement((volatile signed __int32 *)SystemArgument2);
v33 = ~v32 & 0x80000000;
if( (v32 & 0x7FFFFFFF) != 0 )
{
LODWORD(v34[0]) = 0;
while( (*(_DWORD *)SystemArgument2 & 0x80000000) != v33 )
KeYieldProcessorEx((UINT64 *)v34);
}
else
{
*(_DWORD *)SystemArgument2 = v33 | *((_DWORD *)SystemArgument2 + 1);
}
_InterlockedDecrement((volatile signed __int32 *)SystemArgument1);
}Referenced by:
No references.