KeBuildLogicalProcessorSystemInformation
NTSTATUS __stdcall KeBuildLogicalProcessorSystemInformation(
UINT16 Group,
VOID *SystemInformation,
UINT64 SystemInformationLength,
UINT64 *ReturnedLength){
UINT64 *v4;
unsigned int v5;
UINT16 v7;
NTSTATUS v8;
unsigned int v9;
unsigned int v10;
__int64 v11;
__int64 v12;
unsigned __int64 v13;
int v14;
unsigned __int64 v15;
int v16;
bool v17;
unsigned int v18;
_QWORD *v19;
__int64 v20;
__int64 v21;
__int64 v22;
int v23;
unsigned int v24;
unsigned int v25;
_QWORD *v26;
__int64 *v27;
__int64 v28;
_GROUP_AFFINITY GroupAffinity;
unsigned int v32;
unsigned int v33;
v33 = SystemInformationLength;
GroupAffinity = 0i64;
v4 = ReturnedLength;
v32 = 0;
v5 = SystemInformationLength;
v7 = Group;
v8 = 0;
v9 = 0;
v10 = 0;
if( (_DWORD)KeNumberProcessors_0 )
{
do
{
v11 = (__int64)*(&KiProcessorBlock + v10);
v12 = *(unsigned __int8 *)(v11 + 208);
if( (_WORD)v12 == v7 )
{
v13 = *(_QWORD *)(v11 + 8 * v12 + 33688);
GroupAffinity.Mask = v13;
GroupAffinity.Group = v12;
KeFindFirstSetLeftGroupAffinity(&GroupAffinity);
if( *(_DWORD *)(v11 + 36) == v14 )
{
v9 += 32;
if( v9 > v5 )
{
v8 = -1073741820;
}
else
{
*(_QWORD *)SystemInformation = v13;
*((_DWORD *)SystemInformation + 2) = 3;
*((_QWORD *)SystemInformation + 3) = 0i64;
*((_QWORD *)SystemInformation + 2) = 0i64;
SystemInformation = (char *)SystemInformation + 32;
}
}
v15 = *(_QWORD *)(v11 + 33880);
GroupAffinity.Mask = v15;
KeFindFirstSetLeftGroupAffinity(&GroupAffinity);
if( *(_DWORD *)(v11 + 36) == v16 )
{
v17 = *(_QWORD *)(v11 + 200) != v15;
v9 += 32;
if( v9 <= v5 )
{
*((_QWORD *)SystemInformation + 2) = 0i64;
*((_BYTE *)SystemInformation + 16) = v17;
*(_QWORD *)SystemInformation = v15;
*((_DWORD *)SystemInformation + 2) = 0;
*((_QWORD *)SystemInformation + 3) = 0i64;
SystemInformation = (char *)SystemInformation + 32;
}
else
{
v8 = -1073741820;
}
}
v18 = 0;
if( *(_DWORD *)(v11 + 33556) )
{
v19 = (char *)SystemInformation + 16;
while( 1 )
{
v20 = *(_QWORD *)(v11 + 200);
v21 = v18;
v22 = *(_QWORD *)(v11 + 8i64 * v18 + 33904);
if( !v22 )
goto LABEL_24;
GroupAffinity.Mask = *(_QWORD *)(v11 + 8i64 * v18 + 33904);
v20 = v22;
KeFindFirstSetLeftGroupAffinity(&GroupAffinity);
if( *(_DWORD *)(v11 + 36) == v23 )
break;
LABEL_12:
if( ++v18 >= *(_DWORD *)(v11 + 33556) )
{
v10 = v32;
v5 = v33;
goto LABEL_14;
}
}
v21 = v18;
LABEL_24:
v9 += 32;
if( v9 > v33 )
{
v8 = -1073741820;
}
else
{
*(_QWORD *)SystemInformation = v20;
*((_DWORD *)v19 - 2) = 2;
v19[1] = 0i64;
SystemInformation = (char *)SystemInformation + 32;
*v19 = 0i64;
*v19 = *(_QWORD *)(v11 + 12 * v21 + 33496);
*((_DWORD *)v19 + 2) = *(_DWORD *)(v11 + 12 * v21 + 33504);
v19 += 4;
}
goto LABEL_12;
}
LABEL_14:
v7 = Group;
}
v32 = ++v10;
}
while( v10 < (unsigned int)KeNumberProcessors_0 );
v4 = ReturnedLength;
}
v24 = (unsigned __int16)KeNumberNodes;
v25 = 0;
if( KeNumberNodes )
{
v26 = (char *)SystemInformation + 16;
v27 = KeNodeBlock;
do
{
v28 = *(_QWORD *)(*v27 + 136);
if( v28 && *(_WORD *)(*v27 + 144) == v7 )
{
v9 += 32;
if( v9 <= v5 )
{
*v26 = 0i64;
*(_DWORD *)v26 = v25;
*(v26 - 2) = v28;
*((_DWORD *)v26 - 2) = 1;
v26[1] = 0i64;
v26 += 4;
}
else
{
v8 = -1073741820;
}
}
++v25;
++v27;
}
while( v25 < v24 );
}
*(_DWORD *)v4 = v9;
return v8;
}Referenced by:
ExpQuerySystemInformation