PspConvertSiloToServerSilo

INT64 __stdcall PspConvertSiloToServerSilo(_EJOB *Silo, INT8 PreviousMode, PVOID ServerSiloDeleteEvent){
  unsigned __int8 v3; 
  unsigned __int8 v4; 
  unsigned int v8; 
  _ESERVERSILO_GLOBALS *PoolWithTag; 
  _ESERVERSILO_GLOBALS *v11; 
  int SiloRootDirectoryPath; 
  _ETHREAD *CurrentThread; 
  volatile INT32 *v14; 
  INT64 v15; 
  char v16; 
  PVOID v17; 
  v4 = v3;
  v8 = 0;
  if( PsIsCurrentThreadInServerSilo() )
    return 3221225569i64;
  PoolWithTag = (_ESERVERSILO_GLOBALS *)ExAllocatePoolWithTag(NonPagedPoolNxCacheAligned, 0x4A0ui64, 0x476C6953ui64);
  v11 = PoolWithTag;
  if( !PoolWithTag )
    return 3221225626i64;
  memset((INT64)PoolWithTag, 0i64);
  v11->State = SERVERSILO_INITING;
  v11->ExitStatus = 259;
  v11->IsDownlevelContainer = v4;
  if( ServerSiloDeleteEvent )
  {
    SiloRootDirectoryPath = ObpReferenceObjectByHandleWithTag(
                              (ULONG_PTR)ServerSiloDeleteEvent,
                              2,
                              (__int64)ExEventObjectType,
                              PreviousMode,
                              0x65446953u,
                              (__int64)&v11->DeleteEvent,
                              0i64,
                              0i64);
    if( SiloRootDirectoryPath < 0 )
      goto LABEL_7;
  }
  SiloRootDirectoryPath = ObGetSiloRootDirectoryPath(Silo, &v11->SiloRootDirectoryName);
  if( SiloRootDirectoryPath < 0
    || ((CurrentThread = (_ETHREAD *)KeGetCurrentThread(),
         PspLockJobExclusive((__int64)Silo, (__int64)CurrentThread),
         PsIsServerSilo((INT64)Silo, v14),
         !v16) ? (!PsGetParentSilo(v15) ? (!PspJobHasChildren((INT64)Silo) ? ((Silo->LimitFlags & 0x400000) != 0 ? (Silo->ServerSiloGlobals = v11, SiloRootDirectoryPath = 0) : (SiloRootDirectoryPath = -1073741811)) : (SiloRootDirectoryPath = -1073740529)) : (SiloRootDirectoryPath = -1073741791)) : (SiloRootDirectoryPath = -1073740536),
        PspUnlockJob((__int64)Silo, (__int64)CurrentThread),
        SiloRootDirectoryPath < 0) )
  {
LABEL_7:
    PspDeleteServerSiloGlobals(v11);
    return(unsigned int)SiloRootDirectoryPath;
  }
  else
  {
    EtwTraceJobServerSiloStateChange((INT64)Silo, 0i64);
    if( (int)PspQueueDeferredWorkAndWait(v17) < 0 )
      return(unsigned int)-1073740955;
    return v8;
  }
}

Referenced by:

NtSetInformationJobObject