KeSetAffinityProcess

NTSTATUS __stdcall KeSetAffinityProcess(_EPROCESS *Process, UINT64 Flags, _KAFFINITY_EX *Affinity){
  char v4; 
  char v6; 
  char v7; 
  UINT16 v8; 
  UINT64 *v9; 
  unsigned int Count; 
  unsigned int v11; 
  unsigned __int64 *Bitmap; 
  UINT8 CurrentIrql; 
  unsigned int *p_ProcessLock; 
  char v15; 
  _KAFFINITY_EX *p_Affinity; 
  unsigned __int16 v17; 
  _EPROCESS *i; 
  _GROUP_AFFINITY *p_Affinitya; 
  unsigned __int16 v21; 
  unsigned __int16 v22; 
  unsigned __int64 *v23; 
  char v24; 
  __int64 v25; 
  bool v26; 
  __int128 v27; 
  __int128 v28; 
  __int128 v29; 
  __int128 v30; 
  __int128 v31; 
  __int128 v32; 
  __int128 v33; 
  __int128 v34; 
  unsigned __int64 v35; 
  char v36; 
  unsigned int v37; 
  int v38; 
  _SINGLE_LIST_ENTRY ReadyList; 
  _KPRCB *Prcb; 
  _GROUP_AFFINITY Affinitya; 
  __int128 Base; 
  _OWORD v43[11]; 

  v4 = Flags;
  Base = 0i64;
  LODWORD(v43[0]) = 1310721;
  v36 = 0;
  ReadyList.Next = 0i64;
  v6 = 0;
  v7 = 0;
  v38 = 1;
  memset((char *)v43 + 4, 0i64, 0xA4u);
  if( (v4 & 3) != 0 )
  {
    if( (v4 & 1) != 0 )
      v7 = 1;
    else
      v36 = 1;
  }
  KeFirstGroupAffinityEx(&Base, (UINT8)Affinity, v8, v9);
  Count = Affinity->Count;
  v11 = 0;
  v37 = 0;
  if( Count )
  {
    Bitmap = Affinity->Bitmap;
    do
    {
      if( *Bitmap )
        _bittestandset((signed __int32 *)&v37, v11);
      ++v11;
      ++Bitmap;
    }
    while( v11 < Count );
  }
  Affinitya = 0i64;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  p_ProcessLock = &Process->Pcb.ProcessLock;
  Prcb = KeGetCurrentPrcb();
  ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&Process->Pcb.ProcessLock);
  if( !v7 || ((Process->Pcb.ActiveGroupsMask - 1) & Process->Pcb.ActiveGroupsMask) == 0 )
  {
    v15 = v36;
    p_Affinity = &Process->Pcb.Affinity;
    if( v36 )
    {
      v21 = p_Affinity->Count;
      v22 = 0;
      if( !p_Affinity->Count )
        goto LABEL_22;
      v23 = Affinity->Bitmap;
      v24 = 0;
      do
      {
        v25 = *(unsigned __int64 *)((char *)v23 + (char *)Process - (char *)Affinity + 80);
        if( v25 )
        {
          if( v22 < Affinity->Count && (v25 | *v23) != v25 )
          {
            v25 |= *v23;
            v24 = 1;
          }
          if( LOWORD(v43[0]) <= v22 )
            LOWORD(v43[0]) = v38 + v22;
          *(unsigned __int64 *)((char *)v23 + (char *)v43 - (char *)Affinity) |= v25;
        }
        ++v22;
        ++v23;
      }
      while( v22 < v21 );
      v26 = v24 == 0;
      p_ProcessLock = &Process->Pcb.ProcessLock;
      if( v26 )
        goto LABEL_22;
      v27 = v43[1];
      *(_OWORD *)&p_Affinity->Count = v43[0];
      v28 = v43[2];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[1] = v27;
      v29 = v43[3];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[3] = v28;
      v30 = v43[4];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[5] = v29;
      v31 = v43[5];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[7] = v30;
      v32 = v43[6];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[9] = v31;
      v33 = v43[8];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[11] = v32;
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[13] = v43[7];
      v34 = v43[9];
      v35 = *(_QWORD *)&v43[10];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[15] = v33;
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[17] = v34;
      Process->Pcb.Affinity.Bitmap[19] = v35;
    }
    else
    {
      v17 = 0;
      *(_OWORD *)&p_Affinity->Count = *(_OWORD *)&Affinity->Count;
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[1] = *(_OWORD *)&Affinity->Bitmap[1];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[3] = *(_OWORD *)&Affinity->Bitmap[3];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[5] = *(_OWORD *)&Affinity->Bitmap[5];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[7] = *(_OWORD *)&Affinity->Bitmap[7];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[9] = *(_OWORD *)&Affinity->Bitmap[9];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[11] = *(_OWORD *)&Affinity->Bitmap[11];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[13] = *(_OWORD *)&Affinity->Bitmap[13];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[15] = *(_OWORD *)&Affinity->Bitmap[15];
      *(_OWORD *)&Process->Pcb.Affinity.Bitmap[17] = *(_OWORD *)&Affinity->Bitmap[17];
      Process->Pcb.Affinity.Bitmap[19] = Affinity->Bitmap[19];
      if( Affinity->Count )
      {
        do
        {
          if( Affinity->Bitmap[v17] )
          {
            KiSetIdealNodeProcessByGroup(&Process->Pcb, 0i64, v17);
            if( !v6 )
            {
              v6 = 1;
              Process->Pcb.IdealGlobalNode = Process->Pcb.IdealNode[v17];
            }
          }
          ++v17;
        }
        while( v17 < Affinity->Count );
        v15 = 0;
        p_ProcessLock = &Process->Pcb.ProcessLock;
      }
    }
    for( i = (_EPROCESS *)Process->Pcb.ThreadListHead.Flink;
          i != (_EPROCESS *)&Process->Pcb.ThreadListHead;
          i = *(_EPROCESS **)i->Pcb.gap0 )
    {
      Affinitya.Group = i[-1].KTimerSets;
      p_Affinitya = &Affinitya;
      Affinitya.Mask = Process->Pcb.Affinity.Bitmap[Affinitya.Group];
      if( !Affinitya.Mask )
        p_Affinitya = (_GROUP_AFFINITY *)&Base;
      KiSetAffinityThread((_KTHREAD *)&i[-1].Vm.Shared.ReleasedCommitDebt, &ReadyList, p_Affinitya);
    }
    if( !v15 )
      Process->Pcb.ActiveGroupsMask = v37;
LABEL_22:
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)p_ProcessLock);
    KiProcessDeferredReadyList(Prcb, &ReadyList, CurrentIrql);
    return 0;
  }
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&Process->Pcb.ProcessLock);
  __writecr8(CurrentIrql);
  return -1073741811;
}

Referenced by:

KiInitializeDynamicProcessorDpc
PspSetProcessAffinitySafe