PspNotifyServerSiloTermination

VOID __stdcall PspNotifyServerSiloTermination(_EJOB *Silo){
  _SERVERSILO_STATE *ServerSiloStatePointer; 
  _ETHREAD *CurrentThread; 
  _SERVERSILO_STATE *v4; 
  _SILO_MONITOR *i; 
  _SILO_MONITOR *v6; 

  ServerSiloStatePointer = PspGetServerSiloStatePointer(Silo);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = ServerSiloStatePointer;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockSharedEx(&PspSiloMonitorLock, 0i64);
  if( *v4 != SERVERSILO_TERMINATING )
    __fastfail(5u);
  for( i = PspGetNextMonitor(0i64); ; i = PspGetNextMonitor(v6) )
  {
    v6 = i;
    if( !i )
      break;
    if( *((_QWORD *)i + 4) )
      PspInvokeTerminateCallback(Silo, (INT64)i);
  }
  *v4 = SERVERSILO_TERMINATED;
  EtwTraceJobServerSiloStateChange((__int64)Silo, 4);
  if( _InterlockedCompareExchange64(&PspSiloMonitorLock._bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(&PspSiloMonitorLock);
  KeAbPostRelease(&PspSiloMonitorLock);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
}

Referenced by:

PspCompleteServerSiloShutdownDeferred