KeSetCpuSetsProcess

VOID __fastcall KeSetCpuSetsProcess(_EPROCESS *Process, UINT64 CpuSetCount, UINT64 *CpuSetMasks, UINT64 AllowedSets){
  unsigned int v6; 
  int v7; 
  unsigned int v8; 
  INT64 *ProcessCpuSetMaskPointer; 
  unsigned __int8 CurrentIrql; 
  struct _KPRCB *CurrentPrcb; 
  _ETHREAD *CurrentThread; 
  bool v13; 
  INT64 v14; 
  _ETHREAD *NextThread; 
  char v16; 
  UINT64 GroupCount; 
  void *v18[4]; 

  LODWORD(GroupCount) = 0;
  v18[0] = 0i64;
  v6 = CpuSetCount;
  LOBYTE(v7) = KiValidateCpuSetMasks((_GUID *)CpuSetMasks, (_IOBJECT_TYPE_LIST *)CpuSetCount);
  if( v7 >= 0 )
  {
    ProcessCpuSetMaskPointer = (INT64 *)KiGetProcessCpuSetMaskPointer(&Process->Pcb, v8, &GroupCount);
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&Process->Pcb.ProcessLock);
    KiWriteCpuSetMasks(ProcessCpuSetMaskPointer, (unsigned int)GroupCount, (INT64)CpuSetMasks, v6);
    KiUpdateThreadCpuSetAffinitiesProcess((INT64)Process, (PFFI_QUERY_VOLUME_ROUTINE *)v18);
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&Process->Pcb.ProcessLock);
    CurrentPrcb = KeGetCurrentPrcb();
    KiReadyDeferredReadyList(CurrentPrcb, (_SINGLE_LIST_ENTRY *)v18);
    if( CurrentIrql >= 2u )
    {
      if( CurrentPrcb->NextThread && !CurrentPrcb->DpcRoutineActive )
        KiRequestSoftwareInterrupt(CurrentPrcb, 2);
    }
    else
    {
      CurrentThread = CurrentPrcb->CurrentThread;
      if( CurrentPrcb->NextThread )
      {
        KiAbProcessContextSwitch(&CurrentPrcb->CurrentThread->Tcb, 0i64);
        HIDWORD(GroupCount) = 0;
        while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) )
        {
          do
            KeYieldProcessorEx((UINT64 *)((char *)&GroupCount + 4));
          while( CurrentPrcb->PrcbLock );
        }
        NextThread = CurrentPrcb->NextThread;
        CurrentPrcb->NextThread = 0i64;
        _disable();
        KiEndThreadCycleAccumulation(
          (INT64)CurrentPrcb,
          (INT64)CurrentThread,
          0i64,
          v14,
          GroupCount,
          (INT64)v18[0],
          (INT64)v18[1]);
        _enable();
        CurrentPrcb->CurrentThread = NextThread;
        if( NextThread->Tcb.WaitBlockFill6[68] == 1 )
          NextThread->Tcb.ReadyTime = NextThread->Tcb.ReadyTime
                                    - NextThread->Tcb.WaitBlock[2].SpareLong
                                    + KUSER_SHARED_DATA.TickCount.LowPart;
        NextThread->Tcb.WaitBlockFill6[68] = 2;
        CurrentThread->Tcb.WaitReason = 32;
        CurrentThread->Tcb.WaitIrql = CurrentIrql;
        KiQueueReadyThread(CurrentPrcb, &CurrentThread->Tcb);
        KiSwapContext();
        v13 = v16 == 0;
      }
      else
      {
        v13 = (CurrentThread->Tcb._bf_0 & 0x40) == 0;
      }
      if( !v13 )
      {
        __writecr8(1ui64);
        CurrentThread->Tcb._bf_0 &= ~0x40u;
        KiDeliverApc(0, 0i64, 0i64);
      }
      __writecr8(CurrentIrql);
    }
  }
}

Referenced by:

NtSetInformationProcess
PspAllocateProcess