PspNotifyServerSiloCreation
NTSTATUS __stdcall PspNotifyServerSiloCreation(_EJOB *Silo){
char v2;
_SERVERSILO_STATE *ServerSiloStatePointer;
_ETHREAD *CurrentThread;
_SERVERSILO_STATE *v5;
_SILO_MONITOR *NextMonitor;
NTSTATUS v7;
v2 = 0;
ServerSiloStatePointer = PspGetServerSiloStatePointer(Silo);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = ServerSiloStatePointer;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx(&PspSiloMonitorLock, 0i64);
if( *v5 )
__fastfail(5u);
NextMonitor = PspGetNextMonitor(0i64);
if( !NextMonitor )
goto LABEL_10;
do
{
if( *((_QWORD *)NextMonitor + 3) && (int)PspInvokeCreateCallback(Silo, (__int64)NextMonitor) < 0 )
v2 = 1;
NextMonitor = PspGetNextMonitor(NextMonitor);
}
while( NextMonitor );
if( v2 )
{
v7 = -1073741248;
}
else
{
LABEL_10:
*v5 = SERVERSILO_STARTED;
EtwTraceJobServerSiloStateChange((__int64)Silo, 1);
v7 = 0;
}
if( _InterlockedCompareExchange64(&PspSiloMonitorLock._bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(&PspSiloMonitorLock);
KeAbPostRelease(&PspSiloMonitorLock);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v7;
}Referenced by:
PspInitializeServerSiloDeferred