PspAssignProcessToJob
__int64 __fastcall PspAssignProcessToJob(ULONG_PTR BugCheckParameter3, PVOID Object, __int64 a3, int a4){
unsigned int v4;
char v5;
__int64 NextJobProcess;
_ETHREAD *CurrentThread;
int v11;
UINT8 v12;
int v13;
int v14;
__int64 v15;
int v16;
unsigned int v17;
__int64 v19;
__int64 v20;
unsigned int v21;
ULONG_PTR BugCheckParameter4;
char v23[4];
_DWORD v24[3];
INT64 v25;
UINT64 v26;
__int128 v27;
__int64 v28;
__int128 v29;
__int64 v30;
INT64 v31[2];
__int128 v32;
__int64 v33;
v23[0] = 0;
v28 = 0i64;
v4 = 0;
v30 = 0i64;
v33 = 0i64;
v27 = 0i64;
v5 = 0;
NextJobProcess = (__int64)Object;
v29 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v25 = (INT64)CurrentThread;
v24[0] = 0;
*(_OWORD *)v31 = 0i64;
v32 = 0i64;
if( a4 == 5 )
{
a3 = *((_QWORD *)Object + 162);
NextJobProcess = PspGetNextJobProcess(BugCheckParameter3, CurrentThread, &v29, 0i64);
ObfReferenceObjectWithTag((PVOID)NextJobProcess, 0x624A7350u);
v5 = 1;
PspQuitNextJobProcess(BugCheckParameter3, CurrentThread, &v29, NextJobProcess);
v4 = v24[0];
}
if( !NextJobProcess )
{
LABEL_6:
PspGetJobLockHierarchyForAssignment(BugCheckParameter3, NextJobProcess, a3, (unsigned int)a4, (INT64)v31);
v5 |= 6u;
PspLockJobAssignment((INT64)CurrentThread);
PspLockJobsAndProcessExclusive((UINT64 *)v31, NextJobProcess, (INT64)CurrentThread);
if( a4 == 5 )
{
if( PspIsJobMovable(BugCheckParameter3) )
{
v19 = *(_QWORD *)(NextJobProcess + 1296);
v24[0] = 5;
if( v19 == BugCheckParameter3 && (*(_DWORD *)(NextJobProcess + 2172) & 0x1000) != 0 )
{
v4 = v24[0];
goto LABEL_9;
}
v4 = v24[0];
v14 = -1073741790;
LABEL_48:
v17 = -1073741558;
goto LABEL_49;
}
}
else
{
PspGetJobAssignmentDisposition();
v4 = v24[0];
if( v11 >= 0 )
{
if( v24[0] == a4 )
{
LABEL_9:
if( NextJobProcess && v4 != 5 )
{
a3 = *(_QWORD *)(NextJobProcess + 1296);
v4 = v24[0];
}
if( !PspValidateJobAssignmentSiloPolicy(BugCheckParameter3, a3, NextJobProcess, v4)
|| !PspValidateJobAssignmentMemoryPartition(BugCheckParameter3, a3, NextJobProcess, v4) )
{
goto LABEL_71;
}
v12 = -4;
if( v4 == 5 )
{
if( (*(_DWORD *)(BugCheckParameter3 + 848) & 1) != 0 )
goto LABEL_71;
}
else if( ((v4 - 4) & 0xFFFFFFFC) != 0 )
{
LABEL_17:
if( ((v4 - 4) & 0xFFFFFFFC) == 0 )
{
v13 = 0;
while( (unsigned int)(v13 - 1) <= 1
|| (*(_DWORD *)(BugCheckParameter3 + 1320) & 0x2000000) == 0
|| (*(_DWORD *)(a3 + 1320) & 0x2000000) == 0 )
{
if( ++v13 >= 3 )
goto LABEL_21;
}
goto LABEL_71;
}
LABEL_21:
if( ((v4 - 4) & 0xFFFFFFFC) != 0
|| !*(_DWORD *)(a3 + 1348) && !PspIsSetJobIoAttribution((_EJOB *)a3, 0xFCu, 1u)
|| !*(_DWORD *)(BugCheckParameter3 + 1348)
&& !PspIsSetJobIoAttribution((_EJOB *)BugCheckParameter3, v12, 0) )
{
if( v4 == 5 )
{
v20 = a3;
*(_QWORD *)&v24[1] = 0i64;
if( a3 )
{
v14 = PspValidateJobChainLimits(a3, 0i64, NextJobProcess, 0);
if( v14 < 0 )
{
LABEL_82:
CurrentThread = (_ETHREAD *)v25;
goto LABEL_48;
}
}
}
else
{
v20 = 0i64;
*(_QWORD *)&v24[1] = 0i64;
}
v14 = PspEstablishJobHierarchy((CHAR *)BugCheckParameter3, NextJobProcess, a3, v4);
if( v14 >= 0 )
{
if( NextJobProcess )
{
if( (*(_DWORD *)(BugCheckParameter3 + 1320) & 0x1000) != 0 )
{
v15 = 0i64;
do
{
if( (*(_DWORD *)(NextJobProcess + 4i64 * (int)v15 + 2472) & 0x7FFFFFFF) != 0 )
{
LODWORD(BugCheckParameter4) = 0;
PspChargeJobWakeCounter(
(_EJOB *)BugCheckParameter3,
(_EJOB *)a3,
(unsigned int)v15,
*(_DWORD *)(NextJobProcess + 4i64 * (int)v15 + 2472) & 0x7FFFFFFF,
BugCheckParameter4,
0i64,
6451018i64);
}
_interlockedbittestandset((volatile signed __int32 *)(NextJobProcess + 4 * v15 + 2472), 0x1Fu);
v15 = (unsigned int)(v15 + 1);
}
while( (unsigned int)v15 < 7 );
if( (*(_DWORD *)(NextJobProcess + 2508) & 0x7FFFFFFF) != 0 )
{
LODWORD(BugCheckParameter4) = 4;
PspChargeJobWakeCounter(
(_EJOB *)BugCheckParameter3,
(_EJOB *)a3,
0i64,
*(_DWORD *)(NextJobProcess + 2508) & 0x7FFFFFFF,
BugCheckParameter4,
0i64,
6451018i64);
}
_interlockedbittestandset((volatile signed __int32 *)(NextJobProcess + 2508), 0x1Fu);
}
if( (_InterlockedExchangeAdd64(
(volatile signed __int64 *)(NextJobProcess + 1080),
0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(NextJobProcess + 1080));
KeAbPostRelease((PVOID)(NextJobProcess + 1080));
v4 = v24[0];
PspIncrementJobChainProcessCounts(v20, *(INT64 *)&v24[1], NextJobProcess, 0);
PspApplyJobChainLimitsToProcess(BugCheckParameter3, a3, NextJobProcess);
CurrentThread = (_ETHREAD *)v25;
PspUnlockJobsAndProcessExclusive(v31, 0i64, v25);
v5 = v5 & 0xF3 | 8;
if( (*(_DWORD *)(BugCheckParameter3 + 1320) & 0x1000000) == 0 )
{
PsQueryProcessAttributes(NextJobProcess, v23, 0i64);
if( v23[0] )
_InterlockedOr((volatile signed __int32 *)(BugCheckParameter3 + 1320), 0x1000000u);
else
_InterlockedOr((volatile signed __int32 *)(BugCheckParameter3 + 1320), 0x1800000u);
v4 = v24[0];
}
v14 = PspApplyWorkingSetLimitsToProcess(NextJobProcess);
if( v14 >= 0 )
{
MmAssignProcessToJob((_EPROCESS *)NextJobProcess, (PVOID)a3);
if( v16 )
{
PspUnlockJobAssignment((__int64)CurrentThread);
v5 &= ~2u;
--*((_WORD *)CurrentThread + 242);
PspChangeProcessExecutionState(NextJobProcess);
KeLeaveCriticalRegionThread((__int64)CurrentThread);
if( !*(_DWORD *)(BugCheckParameter3 + 448) )
goto LABEL_46;
v21 = *(_DWORD *)(BugCheckParameter3 + 480);
DWORD2(v27) = 1;
*(_QWORD *)&v27 = BugCheckParameter3;
v28 = NextJobProcess;
LODWORD(v26) = v21;
if( v21 <= 0xFFFFFFFD )
{
PspLockJobExclusive(BugCheckParameter3, (__int64)CurrentThread);
v14 = PsInvokeWin32Callout(6i64, &v27, 1i64, &v26);
PspUnlockJob(BugCheckParameter3, (__int64)CurrentThread);
}
if( v14 >= 0 )
{
LABEL_46:
if( v4 == 5 )
{
v14 = -1073741267;
v5 |= 0x20u;
}
}
}
else
{
v14 = -1073741756;
}
}
goto LABEL_48;
}
v14 = 0;
}
goto LABEL_82;
}
LABEL_71:
v14 = -1073741637;
goto LABEL_48;
}
if( (unsigned int)*(unsigned __int8 *)(a3 + 874) + 1 > 0x64 )
goto LABEL_71;
goto LABEL_17;
}
v14 = -1073741267;
goto LABEL_48;
}
}
v14 = -1073741790;
goto LABEL_48;
}
if( ExAcquireRundownProtection((PEX_RUNDOWN_REF)(NextJobProcess + 1112)) )
{
v5 |= 0x10u;
goto LABEL_6;
}
v17 = -1073741558;
v14 = -1073741558;
LABEL_49:
if( (v5 & 0x10) != 0 )
ExReleaseRundownProtection((PEX_RUNDOWN_REF)(NextJobProcess + 1112));
if( (v5 & 0x20) == 0 && v14 < 0 && (v5 & 8) != 0 )
{
if( v4 == 5 )
KeBugCheckEx(0xEFu, NextJobProcess, 0i64, BugCheckParameter3, v14);
if( v14 != -1073741558 )
v17 = -1073741756;
PspRemoveProcessFromJobChain(NextJobProcess, 0i64, 10, v17);
}
if( (v5 & 4) != 0 )
PspUnlockJobsAndProcessExclusive(v31, NextJobProcess, (INT64)CurrentThread);
if( (v5 & 2) != 0 )
PspUnlockJobAssignment((__int64)CurrentThread);
if( (v5 & 1) != 0 )
ObfDereferenceObjectWithTag((PVOID)NextJobProcess, 0x624A7350ui64);
return(unsigned int)v14;
}Referenced by:
PsAssignProcessToJobObject