PspNotifyServerSiloTermination
VOID __stdcall PspNotifyServerSiloTermination(_EJOB *Silo){
_SERVERSILO_STATE *ServerSiloStatePointer;
_ETHREAD *CurrentThread;
_SERVERSILO_STATE *v4;
_SILO_MONITOR *i;
_SILO_MONITOR *v6;
ServerSiloStatePointer = PspGetServerSiloStatePointer(Silo);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = ServerSiloStatePointer;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx(&PspSiloMonitorLock, 0i64);
if( *v4 != SERVERSILO_TERMINATING )
__fastfail(5u);
for( i = PspGetNextMonitor(0i64); ; i = PspGetNextMonitor(v6) )
{
v6 = i;
if( !i )
break;
if( *((_QWORD *)i + 4) )
PspInvokeTerminateCallback(Silo, (INT64)i);
}
*v4 = SERVERSILO_TERMINATED;
EtwTraceJobServerSiloStateChange((__int64)Silo, 4);
if( _InterlockedCompareExchange64(&PspSiloMonitorLock._bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(&PspSiloMonitorLock);
KeAbPostRelease(&PspSiloMonitorLock);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}Referenced by:
PspCompleteServerSiloShutdownDeferred