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