PspNotifyServerSiloCreation
INT64 __stdcall PspNotifyServerSiloCreation(PEJOB Silo){
char v2;
INT64 ServerSiloStatePointer;
_ETHREAD *CurrentThread;
_DWORD *v5;
INT64 *NextMonitor;
unsigned int v7;
v2 = 0;
ServerSiloStatePointer = PspGetServerSiloStatePointer((INT64)Silo);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = (_DWORD *)ServerSiloStatePointer;
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockSharedEx((UINT64)&PspSiloMonitorLock, 0i64);
if( *v5 )
__fastfail(5u);
NextMonitor = PspGetNextMonitor(0i64);
if( !NextMonitor )
goto LABEL_10;
do
{
if( NextMonitor[3] && (int)PspInvokeCreateCallback((INT64)Silo, (INT64)NextMonitor) < 0 )
v2 = 1;
NextMonitor = PspGetNextMonitor((INT64 **)NextMonitor);
}
while( NextMonitor );
if( v2 )
{
v7 = -1073741248;
}
else
{
LABEL_10:
*v5 = 1;
EtwTraceJobServerSiloStateChange((INT64)Silo, (INT64 **)1);
v7 = 0;
}
if( _InterlockedCompareExchange64((volatile signed __int64 *)&PspSiloMonitorLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&PspSiloMonitorLock);
KeAbPostRelease(&PspSiloMonitorLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return v7;
}Referenced by:
PspInitializeServerSiloDeferred