KeQueryCpuSetsThread

UINT64 __stdcall KeQueryCpuSetsThread(_ETHREAD *Thread, UINT64 *CpuSets, UINT64 CpuSetCount){
  unsigned int v5; 
  INT64 ThreadCpuSetMaskPointer; 
  unsigned __int8 CurrentIrql; 
  INT64 v8; 
  __int64 v9; 
  UINT64 SpinCount; 
  unsigned int v12; 
  v12 = 0;
  v5 = 20;
  ThreadCpuSetMaskPointer = KiGetThreadCpuSetMaskPointer((INT64)Thread, &v12);
  if( v12 <= 0x14 )
    v5 = v12;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *((_QWORD *)Thread + 8) );
  }
  if( v5 )
  {
    v8 = ThreadCpuSetMaskPointer - (_QWORD)CpuSets;
    v9 = v5;
    do
    {
      *CpuSets = *(UINT64 *)((char *)CpuSets + v8);
      ++CpuSets;
      --v9;
    }
    while( v9 );
  }
  KiReleaseThreadLockSafe((INT64)Thread);
  __writecr8(CurrentIrql);
  return v12;
}

Referenced by:

NtQueryInformationThread