KeQueryCpuSetInformation
NTSTATUS __stdcall KeQueryCpuSetInformation(
VOID *CpuSetInfo,
UINT64 BufferLength,
UINT64 *ReturnLength,
_EPROCESS *TargetProcess){
VOID *v5;
$991E1CBB7797929499350D8948279CF6 *v6;
unsigned int v7;
size_t v8;
_DWORD *v9;
size_t v10;
__int64 v11;
unsigned int v12;
unsigned __int64 v13;
unsigned __int64 v14;
int v15;
__int64 v16;
__int64 CpuSetData;
int v18;
char v19;
__int64 v20;
char v21;
char v23;
__int64 TickLock;
v5 = CpuSetInfo;
if( TargetProcess )
{
v6 = &TargetProcess->2376;
if( (TargetProcess->Flags3 & 0x80u) != 0 )
v6 = ($991E1CBB7797929499350D8948279CF6 *)v6->AllowedCpuSets;
}
else
{
v6 = 0i64;
}
do
{
TickLock = RtlBeginReadTickLock(&KiCpuSetSequence);
v7 = KiTotalCpuSetCount;
v8 = 32 * KiTotalCpuSetCount;
*v9 = 32 * KiTotalCpuSetCount;
if( v10 < v8 )
return -1073741789;
memset(v5, 0i64, v8);
LODWORD(v11) = 0;
v12 = 0;
v13 = KiGroupBlock[0];
while( v13 )
{
_BitScanForward64(&v14, v13);
v13 &= ~(1i64 << v14);
CpuSetData = KiGetCpuSetData(v11, v14);
*(_DWORD *)v16 = 32;
*(_DWORD *)(v16 + 4) = 0;
*(_DWORD *)(v16 + 8) = v18 | ((_DWORD)v11 << 16) | 0x100;
*(_WORD *)(v16 + 12) = v11;
*(_BYTE *)(v16 + 14) = *(_BYTE *)(CpuSetData + 1);
*(_BYTE *)(v16 + 15) = *(_BYTE *)(CpuSetData + 2);
*(_BYTE *)(v16 + 16) = *(_BYTE *)(CpuSetData + 3);
*(_BYTE *)(v16 + 17) = *(_BYTE *)(CpuSetData + 4);
*(_BYTE *)(v16 + 18) = *(_BYTE *)(CpuSetData + 5);
*(_BYTE *)(v16 + 20) = *(_BYTE *)(CpuSetData + 6);
v19 = 0;
v20 = 1i64 << v18;
v21 = 0;
if( (KiNonParkedCpuSets[v11] & v20) == 0 )
{
v19 = 1;
*(_BYTE *)(v16 + 19) |= 1u;
v21 = 1;
}
if( (KiSystemAllowedCpuSets[2 * (unsigned int)v11] & v20) != 0 )
{
if( !TargetProcess || (TargetProcess->Flags2 & 0x8000000) == 0 )
goto LABEL_10;
v23 = v21;
}
else
{
v23 = v21;
if( v6 && (v20 & v6[v11].AllowedCpuSets) != 0 )
v23 = v21 | 4;
}
v19 = v23 | 0xA;
LABEL_10:
*(_BYTE *)(v16 + 19) = v19;
*(_QWORD *)(v16 + 24) = *(_QWORD *)(CpuSetData + 8);
v12 = v15 + 1;
v5 = CpuSetInfo;
LABEL_11:
if( v12 >= v7 )
goto LABEL_22;
}
LODWORD(v11) = v11 + 1;
if( (unsigned int)v11 < (unsigned __int16)KiActiveGroups )
{
v13 = KiGroupBlock[2 * (unsigned int)v11];
goto LABEL_11;
}
LABEL_22:
;
}
while( !RtlTryEndReadTickLock(&KiCpuSetSequence, TickLock) );
return 0;
}Referenced by:
ExpQuerySystemInformation