KeQueryAffinityThread

VOID __stdcall KeQueryAffinityThread(_ETHREAD *Thread, _GROUP_AFFINITY *GroupAffinity){
  unsigned __int8 CurrentIrql; 
  UINT64 SpinCount; 

  *(_DWORD *)GroupAffinity->Reserved = 0;
  GroupAffinity->Reserved[2] = 0;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( Thread->Tcb.ThreadLock );
  }
  GroupAffinity->Group = Thread->Tcb.UserAffinity.Group;
  GroupAffinity->Mask = Thread->Tcb.UserAffinity.Mask;
  KiReleaseThreadLockSafe((INT64)Thread);
  __writecr8(CurrentIrql);
}

Referenced by:

MiCombineAllPhysicalMemory
NtQueryInformationThread