PspMarkServerSiloAsTerminating

UINT8 __stdcall PspMarkServerSiloAsTerminating(_EJOB *Silo){
  _SERVERSILO_STATE *ServerSiloStatePointer; 
  _ETHREAD *CurrentThread; 
  volatile signed __int32 *v4; 
  signed __int32 v5; 
  signed __int32 v6; 
  UINT8 v7; 

  ServerSiloStatePointer = PspGetServerSiloStatePointer(Silo);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = (volatile signed __int32 *)ServerSiloStatePointer;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockSharedEx(&PspSiloMonitorLock, 0i64);
  v5 = *v4;
  do
  {
    if( v5 >= 3 )
    {
      v7 = 0;
      goto LABEL_5;
    }
    v6 = v5;
    v5 = _InterlockedCompareExchange(v4, 3, v5);
  }
  while( v6 != v5 );
  EtwTraceJobServerSiloStateChange((__int64)Silo, 3);
  v7 = 1;
LABEL_5:
  if( _InterlockedCompareExchange64(&PspSiloMonitorLock._bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(&PspSiloMonitorLock);
  KeAbPostRelease(&PspSiloMonitorLock);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v7;
}

Referenced by:

PspTerminateProcessesJobCallback