KeQueryAffinityProcess

VOID __stdcall KeQueryAffinityProcess(_EPROCESS *Process, _KAFFINITY_EX *Affinity, UINT64 *GroupMask, UINT16 *NodeList){
  unsigned __int8 CurrentIrql; 

  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  ExAcquireSpinLockSharedAtDpcLevel((PEX_SPIN_LOCK)&Process->Pcb.ProcessLock);
  *(_OWORD *)&Affinity->Count = *(_OWORD *)&Process->Pcb.Affinity.Count;
  *(_OWORD *)&Affinity->Bitmap[1] = *(_OWORD *)&Process->Pcb.Affinity.Bitmap[1];
  *(_OWORD *)&Affinity->Bitmap[3] = *(_OWORD *)&Process->Pcb.Affinity.Bitmap[3];
  *(_OWORD *)&Affinity->Bitmap[5] = *(_OWORD *)&Process->Pcb.Affinity.Bitmap[5];
  *(_OWORD *)&Affinity->Bitmap[7] = *(_OWORD *)&Process->Pcb.Affinity.Bitmap[7];
  *(_OWORD *)&Affinity->Bitmap[9] = *(_OWORD *)&Process->Pcb.Affinity.Bitmap[9];
  *(_OWORD *)&Affinity->Bitmap[11] = *(_OWORD *)&Process->Pcb.Affinity.Bitmap[11];
  Affinity = (_KAFFINITY_EX *)((char *)Affinity + 128);
  *(_OWORD *)&Affinity[-1].Bitmap[18] = *(_OWORD *)&Process->Pcb.Affinity.Bitmap[13];
  *(_OWORD *)&Affinity->Count = *(_OWORD *)&Process->Pcb.Affinity.Bitmap[15];
  *(_OWORD *)&Affinity->Bitmap[1] = *(_OWORD *)&Process->Pcb.Affinity.Bitmap[17];
  Affinity->Bitmap[3] = Process->Pcb.Affinity.Bitmap[19];
  if( GroupMask )
    *(_DWORD *)GroupMask = Process->Pcb.ActiveGroupsMask;
  if( NodeList )
  {
    *(_OWORD *)NodeList = *(_OWORD *)Process->Pcb.IdealNode;
    *((_OWORD *)NodeList + 1) = *(_OWORD *)&Process->Pcb.IdealNode[8];
    *((_QWORD *)NodeList + 4) = *(_QWORD *)&Process->Pcb.IdealNode[16];
  }
  ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)&Process->Pcb.ProcessLock);
  __writecr8(CurrentIrql);
}

Referenced by:

NtQueryInformationProcess
PspAllocateProcess