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