PspCreateSilo

NTSTATUS __stdcall PspCreateSilo(_EJOB *Job){
  _ETHREAD *CurrentThread; 
  PSP_STORAGE *v2; 
  NTSTATUS result; 
  NTSTATUS v5; 
  __int64 v6; 
  PSP_STORAGE *Storage; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v2 = 0i64;
  Storage = 0i64;
  if( PsIsCurrentThreadInServerSilo() )
    return -1073741727;
  if( !*((_QWORD *)Job + 163) )
  {
    result = PspAllocStorage(&Storage);
    if( result < 0 )
      return result;
    v2 = Storage;
  }
  PspLockJobExclusive(Job, CurrentThread);
  if( PspJobHasChildren((INT64)Job) )
  {
    v5 = -1073740529;
  }
  else if( (*((_DWORD *)Job + 330) & 0x40000000) != 0 )
  {
    v5 = -1073740536;
  }
  else if( (*((_DWORD *)Job + 64) & 0x402000) != 0 )
  {
    v6 = -(__int64)(_InterlockedCompareExchange64((volatile signed __int64 *)Job + 163, (signed __int64)v2, 0i64) != 0);
    Storage = (PSP_STORAGE *)(v6 & (unsigned __int64)Storage);
    _InterlockedOr((volatile signed __int32 *)Job + 330, 0x40000000u);
    v2 = Storage;
    v5 = 0;
  }
  else
  {
    v5 = -1073741811;
  }
  PspUnlockJob(Job, CurrentThread);
  if( v2 )
    PspFreeStorage(v2);
  return v5;
}

Referenced by:

NtSetInformationJobObject