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