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.