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.