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