PsStartSiloMonitor
INT64 __fastcall PsStartSiloMonitor(INT64 a1){
int v1;
_ETHREAD *CurrentThread;
_EJOB *i;
_EJOB *NextSilo;
_EJOB *v6;
char v7;
int v8;
_EJOB *j;
_EJOB *v10;
INT64 v11;
INT64 *v12;
char v13;
_EJOB *v15;
int v16;
_EJOB *k;
_EJOB *v18;
_EJOB *v19;
INT64 v20;
_KAPC_STATE ApcState;
v1 = 0;
memset(&ApcState, 0, sizeof(ApcState));
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx((UINT64)&PspSiloMonitorLock, 0i64);
if( *(_OWORD *)a1 == 0i64 )
{
if( !*(_BYTE *)(a1 + 17) )
{
for( i = 0i64; ; i = v15 )
{
NextSilo = PspGetNextSilo(i, 1u);
if( !NextSilo )
break;
if( (unsigned int)(*(_DWORD *)PspGetServerSiloStatePointer((INT64)NextSilo) - 1) <= 2 )
{
v1 = -1073741637;
goto LABEL_14;
}
}
}
if( *(_QWORD *)(a1 + 24) )
{
if( !*(_BYTE *)(a1 + 16) )
goto LABEL_9;
KiStackAttachProcess(PsInitialSystemProcess, 0i64, &ApcState);
v6 = (_EJOB *)HalSystemVectorDispatchEntry();
v1 = PspInvokeCreateCallback((INT64)v6, a1);
if( v1 < 0 && *(_QWORD *)(a1 + 32) )
PspInvokeTerminateCallback(v6, a1);
KiUnstackDetachProcess(&ApcState, 0i64);
if( v1 >= 0 )
{
LABEL_9:
v7 = 0;
v8 = 0;
KiStackAttachProcess(PsInitialSystemProcess, 0i64, &ApcState);
for( j = 0i64; ; j = (_EJOB *)v11 )
{
v10 = PspGetNextSilo(j, 1u);
v11 = (INT64)v10;
if( !v10 )
break;
if( (unsigned int)(*(_DWORD *)PspGetServerSiloStatePointer((INT64)v10) - 1) <= 2 )
{
++v8;
if( (int)PspInvokeCreateCallback(v11, a1) < 0 )
v7 = 1;
}
}
KiUnstackDetachProcess(&ApcState, 0i64);
if( v7 )
{
if( *(_QWORD *)(a1 + 32) )
{
v16 = 0;
KiStackAttachProcess(PsInitialSystemProcess, 0i64, &ApcState);
for( k = 0i64; ; k = v19 )
{
v18 = PspGetNextSilo(k, 1u);
v19 = v18;
if( !v18 )
break;
if( (unsigned int)(*(_DWORD *)PspGetServerSiloStatePointer((INT64)v18) - 1) <= 2 )
{
PspInvokeTerminateCallback(v19, a1);
++v16;
}
}
if( v8 != v16 )
__int2c();
if( *(_BYTE *)(a1 + 16) )
{
v20 = HalSystemVectorDispatchEntry();
PspInvokeCreateCallback(v20, a1);
}
KiUnstackDetachProcess(&ApcState, 0i64);
}
v1 = -1073741248;
}
else
{
v12 = (INT64 *)qword_140C1DEB8;
if( *(__int64 **)qword_140C1DEB8 != &PspSiloMonitorList )
__fastfail(3u);
*(_QWORD *)a1 = &PspSiloMonitorList;
v1 = 0;
*(_QWORD *)(a1 + 8) = v12;
*v12 = a1;
qword_140C1DEB8 = a1;
}
}
}
}
LABEL_14:
v13 = _InterlockedExchangeAdd64((volatile signed __int64 *)&PspSiloMonitorLock, 0xFFFFFFFFFFFFFFFFui64);
if( (v13 & 2) != 0 && (v13 & 4) == 0 )
ExfTryToWakePushLock((volatile INT64 *)&PspSiloMonitorLock);
KeAbPostRelease(&PspSiloMonitorLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return(unsigned int)v1;
}Referenced by:
No references.