PspRemoveProcessFromJobChain
void __fastcall PspRemoveProcessFromJobChain(ULONG_PTR BugCheckParameter1, _QWORD *a2, char a3, unsigned int a4){
char v4;
bool v6;
char v7;
_ETHREAD *CurrentThread;
bool v10;
int v11;
_EJOB *v12;
_EPROCESS_VALUES *p_Accounting;
char v14;
_EJOB *RootJob;
_EJOB *ImmediateJob;
_ETHREAD *v17;
__int64 result[20];
v4 = 0;
v6 = (*(_DWORD *)(BugCheckParameter1 + 2172) & 0x1000) == 0;
v7 = a3;
ImmediateJob = 0i64;
RootJob = 0i64;
if( v6 || (a3 & 1) != 0 )
{
memset((INT64)result, 0i64);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v17 = CurrentThread;
v10 = !_interlockedbittestandset((volatile signed __int32 *)(BugCheckParameter1 + 1120), 0);
v14 = 0;
if( (v7 & 2) != 0
&& (*(_DWORD *)(BugCheckParameter1 + 1124) & 0x4000000) != 0
&& (*(_BYTE *)(BugCheckParameter1 + 2172) & 0x40) == 0 )
{
PsTerminateProcess(BugCheckParameter1, a4);
v14 = 1;
}
v11 = 1;
PspLockRootJobFromProcess((_EPROCESS *)BugCheckParameter1, CurrentThread, &ImmediateJob, &RootJob);
if( (v7 & 4) != 0 && !_interlockedbittestandset((volatile signed __int32 *)(BugCheckParameter1 + 1120), 1u) )
{
_InterlockedAnd((volatile signed __int32 *)(BugCheckParameter1 + 1120), 0xFFFFFFDF);
PsQueryStatisticsProcess((_EPROCESS *)BugCheckParameter1, (_EPROCESS_VALUES *)result);
v4 = 1;
}
v12 = ImmediateJob;
if( ImmediateJob )
{
do
{
PspLockJobConditionally(v12, &RootJob);
if( v10 )
{
--v12->ActiveProcesses;
if( (*(_DWORD *)(BugCheckParameter1 + 2172) & 0x20) != 0 )
--v12->ActiveAuxiliaryProcessCount;
}
if( (v7 & 8) != 0 && v10 )
++v12->TotalTerminatedProcesses;
if( a2 && (!*a2 || (_EJOB *)*a2 == v12) && v12->CompletionPort && ((1 << a2[1]) & v12->CompletionFilter) != 0 )
PspSendJobNotification(v12, a2[1], (PVOID)a2[2], 0);
if( v4 )
{
PspFoldProcessAccountingIntoJob((INT64)v12, BugCheckParameter1, result);
if( v12 == *(_EJOB **)(BugCheckParameter1 + 1296) && v12->SequenceNumber != PspEnforcementSequenceNumber )
v11 = 0;
if( v11 == 1 )
{
p_Accounting = &v12->Accounting;
if( &v12->Accounting < (_EPROCESS_VALUES *)&v12->ShadowActiveProcessCount )
{
while( !p_Accounting->KernelTime )
{
p_Accounting = (_EPROCESS_VALUES *)((char *)p_Accounting + 8);
if( p_Accounting >= (_EPROCESS_VALUES *)&v12->ShadowActiveProcessCount )
goto LABEL_11;
}
PspSubtractAccountingValues(&v12->Accounting, (_EPROCESS_VALUES *)result);
v11 = 2;
}
}
}
LABEL_11:
PspUnlockJobConditionally(v12, &RootJob);
v12 = v12->ParentJob;
}
while( v12 );
v12 = ImmediateJob;
CurrentThread = v17;
v7 = a3;
}
PspLockJobConditionally(v12, &RootJob);
if( (v7 & 1) != 0 )
{
PspUnlinkJobProcess((__int64)v12, BugCheckParameter1);
PspUnlockJobConditionally(v12, &RootJob);
PspUnlockJob((__int64)RootJob, (__int64)CurrentThread);
}
else
{
if( v10 && (*(_DWORD *)(BugCheckParameter1 + 1120) & 4) != 0 && !v14 )
PspRequestProcessExecutionState(BugCheckParameter1, 0i64, 0);
PspUnlockJobConditionally(v12, &RootJob);
PspUnlockJob((__int64)RootJob, (__int64)CurrentThread);
--*((_WORD *)CurrentThread + 242);
PspChangeProcessExecutionState(BugCheckParameter1);
KeLeaveCriticalRegionThread((__int64)CurrentThread);
}
}
}Referenced by:
PspAssignProcessToJob
PspEnforceLimitsJobPostCallback
PspRundownSingleProcess
PspTerminateProcessesJobCallback