PspSetProcessAffinityUpdateMode
INT64 __fastcall PspSetProcessAffinityUpdateMode(INT64 a1, INT64 *a2){
__int64 v3;
int v4;
int v5;
int v6;
signed __int32 v7;
signed __int32 v8;
bool v9;
v3 = *((_QWORD *)KeGetCurrentThread() + 23);
v4 = *(_DWORD *)a2;
v5 = (*(_DWORD *)a2 & 2) << 17;
v6 = v5 | 0x80000;
if( (v4 & 1) == 0 )
v6 = v5;
_m_prefetchw((const void *)(v3 + 1120));
v7 = *(_DWORD *)(v3 + 1120);
v8 = v7;
do
{
if( (v8 & 0xC0000) == v6 )
break;
if( (v7 & 0x40000) != 0 )
return 3221225473i64;
v8 = _InterlockedCompareExchange((volatile signed __int32 *)(v3 + 1120), v6 | v7 & 0xFFF3FFFF, v7);
v9 = v7 == v8;
v7 = v8;
}
while( !v9 );
if( v6 == 0x40000 )
{
PspLockUnlockProcessExclusive(v3, a1);
}
else if( (v6 & 0x80000) != 0 && KeDynamicPartitioningSupported )
{
--*(_WORD *)(a1 + 484);
ExAcquirePushLockSharedEx((UINT64)&PspAffinityUpdateLock, 0i64);
if( !(unsigned int)KeIsEmptyAffinityEx(&PspLastUpdateAffinityMask) )
PspUpdateSingleProcessAffinity(a1, v3, &PspLastUpdateAffinityMask.Count);
if( _InterlockedCompareExchange64((volatile signed __int64 *)&PspAffinityUpdateLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&PspAffinityUpdateLock);
KeAbPostRelease(&PspAffinityUpdateLock);
KeLeaveCriticalRegionThread(a1);
}
return 0i64;
}Referenced by:
NtSetInformationProcess