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