PspCreateSilo

NTSTATUS __stdcall PspCreateSilo(_EJOB *Job){
  _ETHREAD *CurrentThread; 
  CHAR *v2; 
  NTSTATUS result; 
  NTSTATUS v5; 
  __int64 v6; 
  CHAR *v7; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v2 = 0i64;
  v7 = 0i64;
  if( PsIsCurrentThreadInServerSilo() )
    return -1073741727;
  if( !Job->Storage )
  {
    result = PspAllocStorage(&v7);
    if( result < 0 )
      return result;
    v2 = v7;
  }
  PspLockJobExclusive((__int64)Job, (__int64)CurrentThread);
  if( PspJobHasChildren((INT64)Job) )
  {
    v5 = -1073740529;
  }
  else if( (Job->JobFlags & 0x40000000) != 0 )
  {
    v5 = -1073740536;
  }
  else if( (Job->LimitFlags & 0x402000) != 0 )
  {
    v6 = -(__int64)(_InterlockedCompareExchange64((volatile signed __int64 *)&Job->Storage, (signed __int64)v2, 0i64) != 0);
    v7 = (CHAR *)(v6 & (unsigned __int64)v7);
    _InterlockedOr((volatile signed __int32 *)&Job->1320, 0x40000000u);
    v2 = v7;
    v5 = 0;
  }
  else
  {
    v5 = -1073741811;
  }
  PspUnlockJob((__int64)Job, (__int64)CurrentThread);
  if( v2 )
    PspFreeStorage((INT64)v2);
  return v5;
}

Referenced by:

NtSetInformationJobObject