PspSetProcessAffinitySafe
NTSTATUS __stdcall PspSetProcessAffinitySafe(
_EPROCESS *Process,
UINT64 AffinityFlags,
_KAFFINITY_EX *Affinity,
_GROUP_AFFINITY *LegacyAffinity,
UINT64 *AffinitySet){
char v6;
int v9;
int v10;
__int64 Group;
unsigned __int64 Mask;
unsigned int v13;
_EJOB *volatile Job;
int v15;
int v16;
_KAFFINITY_EX Affinity1;
v6 = AffinityFlags;
memset(&Affinity1, 0i64, sizeof(Affinity1));
v9 = 0;
v10 = 1;
if( LegacyAffinity )
{
*(_DWORD *)&Affinity1.Count = 1310721;
memset(&Affinity1.Reserved, 0i64, 0xA4u);
Group = LegacyAffinity->Group;
Mask = LegacyAffinity->Mask;
if( (_WORD)Group )
Affinity1.Count = Group + 1;
Affinity1.Bitmap[Group] |= Mask;
Affinity = &Affinity1;
v13 = 1;
}
else
{
v13 = 0;
if( (v6 & 2) != 0 )
v13 = 2;
}
if( (v6 & 1) != 0 || (Process->Flags3 & 0x1000) != 0 )
{
Job = 0i64;
}
else
{
Job = Process->Job;
if( Job )
{
ExAcquireResourceSharedLite((UINT64)Job + 56, 1);
v15 = *((_DWORD *)Job + 212);
if( (v15 & 0x10) != 0 )
{
if( (v15 & 0x4000) == 0 || (KeIsSubsetAffinityEx(Affinity, (_KAFFINITY_EX *)((char *)Job + 616)), !v16) )
{
v10 = 0;
goto LABEL_16;
}
}
}
}
v9 = KeSetAffinityProcess(&Process->Pcb, v13, Affinity);
LABEL_16:
if( Job )
ExReleaseResourceLite((PERESOURCE)((char *)Job + 56));
if( v9 >= 0 )
*(_DWORD *)AffinitySet = v10;
return v9;
}Referenced by:
NtSetInformationProcess
PspAllocateProcess
PspApplyJobLimitsToProcess
PspUpdateSingleProcessAffinity