PspNotifyServerSiloCreation

NTSTATUS __stdcall PspNotifyServerSiloCreation(_EJOB *Silo){
  char v2; 
  _SERVERSILO_STATE *ServerSiloStatePointer; 
  _ETHREAD *CurrentThread; 
  _SERVERSILO_STATE *v5; 
  _SILO_MONITOR *NextMonitor; 
  NTSTATUS v7; 

  v2 = 0;
  ServerSiloStatePointer = PspGetServerSiloStatePointer(Silo);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v5 = ServerSiloStatePointer;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockSharedEx(&PspSiloMonitorLock, 0i64);
  if( *v5 )
    __fastfail(5u);
  NextMonitor = PspGetNextMonitor(0i64);
  if( !NextMonitor )
    goto LABEL_10;
  do
  {
    if( *((_QWORD *)NextMonitor + 3) && (int)PspInvokeCreateCallback(Silo, (__int64)NextMonitor) < 0 )
      v2 = 1;
    NextMonitor = PspGetNextMonitor(NextMonitor);
  }
  while( NextMonitor );
  if( v2 )
  {
    v7 = -1073741248;
  }
  else
  {
LABEL_10:
    *v5 = SERVERSILO_STARTED;
    EtwTraceJobServerSiloStateChange((__int64)Silo, 1);
    v7 = 0;
  }
  if( _InterlockedCompareExchange64(&PspSiloMonitorLock._bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(&PspSiloMonitorLock);
  KeAbPostRelease(&PspSiloMonitorLock);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v7;
}

Referenced by:

PspInitializeServerSiloDeferred