PspMarkServerSiloAsTerminating

UINT8 __stdcall PspMarkServerSiloAsTerminating(PEJOB Silo){
  INT64 ServerSiloStatePointer; 
  _ETHREAD *CurrentThread; 
  volatile signed __int32 *v4; 
  signed __int32 v5; 
  signed __int32 v6; 
  UINT8 v7; 
  ServerSiloStatePointer = PspGetServerSiloStatePointer((INT64)Silo);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = (volatile signed __int32 *)ServerSiloStatePointer;
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockSharedEx((UINT64)&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, (INT64 **)3);
  v7 = 1;
LABEL_5:
  if( _InterlockedCompareExchange64((volatile signed __int64 *)&PspSiloMonitorLock, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared((INT64 *)&PspSiloMonitorLock);
  KeAbPostRelease(&PspSiloMonitorLock);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return v7;
}

Referenced by:

PspTerminateProcessesJobCallback