PspSetProcessAffinityUpdateMode
NTSTATUS __stdcall PspSetProcessAffinityUpdateMode(_ETHREAD *CurrentThread, PROCESS_AFFINITY_UPDATE_MODE *AffinityMode){
_EPROCESS *Process;
PROCESS_AFFINITY_UPDATE_MODE v4;
int v5;
int v6;
signed __int32 bf_0;
signed __int32 v8;
bool v9;
Process = KeGetCurrentThread()->ApcState.Process;
v4 = *AffinityMode;
v5 = (*AffinityMode & 2) << 17;
v6 = v5 | 0x80000;
if( (v4 & 1) == 0 )
v6 = v5;
_m_prefetchw(&Process->1120);
bf_0 = Process->$4E3DFAFA17165B33969DFF4E60E4EB31::_bf_0;
v8 = bf_0;
do
{
if( (v8 & 0xC0000) == v6 )
break;
if( (bf_0 & 0x40000) != 0 )
return -1073741823;
v8 = _InterlockedCompareExchange((volatile signed __int32 *)&Process->1120, v6 | bf_0 & 0xFFF3FFFF, bf_0);
v9 = bf_0 == v8;
bf_0 = v8;
}
while( !v9 );
if( v6 == 0x40000 )
{
PspLockUnlockProcessExclusive(Process, CurrentThread);
}
else if( (v6 & 0x80000) != 0 && KeDynamicPartitioningSupported )
{
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx(&PspAffinityUpdateLock, 0i64);
if( !KeIsEmptyAffinityEx(&PspLastUpdateAffinityMask.Count) )
PspUpdateSingleProcessAffinity(CurrentThread, Process, &PspLastUpdateAffinityMask);
if( _InterlockedCompareExchange64(&PspAffinityUpdateLock._bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(&PspAffinityUpdateLock);
KeAbPostRelease(&PspAffinityUpdateLock);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
}
return 0;
}Referenced by:
NtSetInformationProcess