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