PsStartSiloMonitor
NTSTATUS __stdcall PsStartSiloMonitor(_SILO_MONITOR *Monitor){
NTSTATUS v1;
_ETHREAD *CurrentThread;
_EJOB *i;
_EJOB *NextSilo;
PKINTERRUPT_ROUTINE **v6;
UINT32 v7;
PKINTERRUPT_ROUTINE *v8;
_EJOB *v9;
_EJOB *v10;
char v11;
int v12;
_EJOB *j;
_EJOB *v14;
_EJOB *v15;
_SILO_MONITOR **v16;
char v17;
_EJOB *v19;
int v20;
_EJOB *k;
_EJOB *v22;
PKINTERRUPT_ROUTINE **v23;
UINT32 v24;
PKINTERRUPT_ROUTINE *v25;
_EJOB *v26;
_EJOB *v27;
_KAPC_STATE ApcState;
v1 = 0;
memset(&ApcState, 0, sizeof(ApcState));
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&PspSiloMonitorLock, 0i64);
if( *(_OWORD *)Monitor == 0i64 )
{
if( !*((_BYTE *)Monitor + 17) )
{
for( i = 0i64; ; i = v19 )
{
NextSilo = PspGetNextSilo(i, 1u);
if( !NextSilo )
break;
if( (unsigned int)(*PspGetServerSiloStatePointer(NextSilo) - 1) <= 2 )
{
v1 = -1073741637;
goto LABEL_14;
}
}
}
if( *((_QWORD *)Monitor + 3) )
{
if( !*((_BYTE *)Monitor + 16) )
goto LABEL_9;
KiStackAttachProcess(PsInitialSystemProcess, 0i64, &ApcState);
LODWORD(v9) = HalSystemVectorDispatchEntry(v7, v6, v8);
v10 = v9;
v1 = PspInvokeCreateCallback(v9, (__int64)Monitor);
if( v1 < 0 && *((_QWORD *)Monitor + 4) )
PspInvokeTerminateCallback(v10, (INT64)Monitor);
KiUnstackDetachProcess(&ApcState, 0i64);
if( v1 >= 0 )
{
LABEL_9:
v11 = 0;
v12 = 0;
KiStackAttachProcess(PsInitialSystemProcess, 0i64, &ApcState);
for( j = 0i64; ; j = v15 )
{
v14 = PspGetNextSilo(j, 1u);
v15 = v14;
if( !v14 )
break;
if( (unsigned int)(*PspGetServerSiloStatePointer(v14) - 1) <= 2 )
{
++v12;
if( (int)PspInvokeCreateCallback(v15, (__int64)Monitor) < 0 )
v11 = 1;
}
}
KiUnstackDetachProcess(&ApcState, 0i64);
if( v11 )
{
if( *((_QWORD *)Monitor + 4) )
{
v20 = 0;
KiStackAttachProcess(PsInitialSystemProcess, 0i64, &ApcState);
for( k = 0i64; ; k = v26 )
{
v22 = PspGetNextSilo(k, 1u);
v26 = v22;
if( !v22 )
break;
if( (unsigned int)(*PspGetServerSiloStatePointer(v22) - 1) <= 2 )
{
PspInvokeTerminateCallback(v26, (INT64)Monitor);
++v20;
}
}
if( v12 != v20 )
__int2c();
if( *((_BYTE *)Monitor + 16) )
{
LODWORD(v27) = HalSystemVectorDispatchEntry(v24, v23, v25);
PspInvokeCreateCallback(v27, (__int64)Monitor);
}
KiUnstackDetachProcess(&ApcState, 0i64);
}
v1 = -1073741248;
}
else
{
v16 = (_SILO_MONITOR **)qword_140C1DEB8;
if( *(__int64 **)qword_140C1DEB8 != &PspSiloMonitorList )
__fastfail(3u);
*(_QWORD *)Monitor = &PspSiloMonitorList;
v1 = 0;
*((_QWORD *)Monitor + 1) = v16;
*v16 = Monitor;
qword_140C1DEB8 = (__int64)Monitor;
}
}
}
}
LABEL_14:
v17 = _InterlockedExchangeAdd64(&PspSiloMonitorLock._bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v17 & 2) != 0 && (v17 & 4) == 0 )
ExfTryToWakePushLock(&PspSiloMonitorLock);
KeAbPostRelease(&PspSiloMonitorLock);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v1;
}Referenced by:
No references.