KeQueryCpuSetInformation

INT64 __fastcall KeQueryCpuSetInformation(INT64 result, INT64 a2, INT64 a3, INT64 a4){
  INT64 v5; 
  _QWORD *v6; 
  unsigned int v7; 
  _DWORD *v8; 
  unsigned int v9; 
  __int64 v10; 
  unsigned int v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  int v14; 
  __int64 v15; 
  INT64 CpuSetData; 
  int v17; 
  char v18; 
  __int64 v19; 
  char v20; 
  char v22; 
  __int64 TickLock; 
  v5 = result;
  if( a4 )
  {
    v6 = (_QWORD *)(a4 + 2376);
    if( (*(_DWORD *)(a4 + 2172) & 0x80u) != 0 )
      v6 = (_QWORD *)*v6;
  }
  else
  {
    v6 = 0i64;
  }
  do
  {
    TickLock = RtlBeginReadTickLock(&KiCpuSetSequence);
    v7 = KiTotalCpuSetCount;
    *v8 = 32 * KiTotalCpuSetCount;
    if( v9 < 32 * v7 )
      return 3221225507i64;
    memset(v5, 0i64);
    LODWORD(v10) = 0;
    v11 = 0;
    v12 = KiGroupBlock[0];
    while( v12 )
    {
      _BitScanForward64(&v13, v12);
      v12 &= ~(1i64 << v13);
      CpuSetData = KiGetCpuSetData((unsigned int)v10, (unsigned int)v13);
      *(_DWORD *)v15 = 32;
      *(_DWORD *)(v15 + 4) = 0;
      *(_DWORD *)(v15 + 8) = v17 | ((_DWORD)v10 << 16) | 0x100;
      *(_WORD *)(v15 + 12) = v10;
      *(_BYTE *)(v15 + 14) = *(_BYTE *)(CpuSetData + 1);
      *(_BYTE *)(v15 + 15) = *(_BYTE *)(CpuSetData + 2);
      *(_BYTE *)(v15 + 16) = *(_BYTE *)(CpuSetData + 3);
      *(_BYTE *)(v15 + 17) = *(_BYTE *)(CpuSetData + 4);
      *(_BYTE *)(v15 + 18) = *(_BYTE *)(CpuSetData + 5);
      *(_BYTE *)(v15 + 20) = *(_BYTE *)(CpuSetData + 6);
      v18 = 0;
      v19 = 1i64 << v17;
      v20 = 0;
      if( (KiNonParkedCpuSets[v10] & v19) == 0 )
      {
        v18 = 1;
        *(_BYTE *)(v15 + 19) |= 1u;
        v20 = 1;
      }
      if( (KiSystemAllowedCpuSets[2 * (unsigned int)v10] & v19) != 0 )
      {
        if( !a4 || (*(_DWORD *)(a4 + 1120) & 0x8000000) == 0 )
          goto LABEL_10;
        v22 = v20;
      }
      else
      {
        v22 = v20;
        if( v6 && (v19 & v6[v10]) != 0 )
          v22 = v20 | 4;
      }
      v18 = v22 | 0xA;
LABEL_10:
      *(_BYTE *)(v15 + 19) = v18;
      *(_QWORD *)(v15 + 24) = *(_QWORD *)(CpuSetData + 8);
      v11 = v14 + 1;
      v5 = result;
LABEL_11:
      if( v11 >= v7 )
        goto LABEL_22;
    }
    LODWORD(v10) = v10 + 1;
    if( (unsigned int)v10 < (unsigned __int16)KiActiveGroups )
    {
      v12 = KiGroupBlock[2 * (unsigned int)v10];
      goto LABEL_11;
    }
LABEL_22:
    ;
  }
  while( !RtlTryEndReadTickLock(&KiCpuSetSequence, TickLock) );
  return 0i64;
}

Referenced by:

ExpQuerySystemInformation