PspNotifyServerSiloCreation

INT64 __stdcall PspNotifyServerSiloCreation(PEJOB Silo){
  char v2; 
  INT64 ServerSiloStatePointer; 
  _ETHREAD *CurrentThread; 
  _DWORD *v5; 
  INT64 *NextMonitor; 
  unsigned int v7; 
  v2 = 0;
  ServerSiloStatePointer = PspGetServerSiloStatePointer((INT64)Silo);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v5 = (_DWORD *)ServerSiloStatePointer;
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockSharedEx((UINT64)&PspSiloMonitorLock, 0i64);
  if( *v5 )
    __fastfail(5u);
  NextMonitor = PspGetNextMonitor(0i64);
  if( !NextMonitor )
    goto LABEL_10;
  do
  {
    if( NextMonitor[3] && (int)PspInvokeCreateCallback((INT64)Silo, (INT64)NextMonitor) < 0 )
      v2 = 1;
    NextMonitor = PspGetNextMonitor((INT64 **)NextMonitor);
  }
  while( NextMonitor );
  if( v2 )
  {
    v7 = -1073741248;
  }
  else
  {
LABEL_10:
    *v5 = 1;
    EtwTraceJobServerSiloStateChange((INT64)Silo, (INT64 **)1);
    v7 = 0;
  }
  if( _InterlockedCompareExchange64((volatile signed __int64 *)&PspSiloMonitorLock, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared((INT64 *)&PspSiloMonitorLock);
  KeAbPostRelease(&PspSiloMonitorLock);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return v7;
}

Referenced by:

PspInitializeServerSiloDeferred