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