PspNotifyServerSiloTermination

VOID __stdcall PspNotifyServerSiloTermination(PEJOB Silo){
  INT64 ServerSiloStatePointer; 
  _ETHREAD *CurrentThread; 
  _DWORD *v4; 
  INT64 *i; 
  INT64 **v6; 
  ServerSiloStatePointer = PspGetServerSiloStatePointer((INT64)Silo);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = (_DWORD *)ServerSiloStatePointer;
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockSharedEx((UINT64)&PspSiloMonitorLock, 0i64);
  if( *v4 != 3 )
    __fastfail(5u);
  for( i = PspGetNextMonitor(0i64); ; i = PspGetNextMonitor(v6) )
  {
    v6 = (INT64 **)i;
    if( !i )
      break;
    if( i[4] )
      PspInvokeTerminateCallback(Silo, (INT64)i);
  }
  *v4 = 4;
  EtwTraceJobServerSiloStateChange((INT64)Silo, (INT64 **)4);
  if( _InterlockedCompareExchange64((volatile signed __int64 *)&PspSiloMonitorLock, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared((INT64 *)&PspSiloMonitorLock);
  KeAbPostRelease(&PspSiloMonitorLock);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}

Referenced by:

PspCompleteServerSiloShutdownDeferred