PsUnregisterSiloMonitor

VOID __stdcall PsUnregisterSiloMonitor(_SILO_MONITOR *Monitor){
  _ETHREAD *CurrentThread; 
  __int64 v3; 
  _EJOB *i; 
  _EJOB *NextSilo; 
  PKINTERRUPT_ROUTINE **v6; 
  UINT32 v7; 
  PKINTERRUPT_ROUTINE *v8; 
  _EJOB *v9; 
  __int64 v10; 
  _SILO_MONITOR **v11; 
  PSP_STORAGE *v12; 
  NTSTATUS v13; 
  _KAPC_STATE ApcState; 

  memset(&ApcState, 0, sizeof(ApcState));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx(&PspSiloMonitorLock, 0i64);
  v3 = *(_QWORD *)Monitor;
  if( *(_OWORD *)Monitor != 0i64 )
  {
    if( *((_QWORD *)Monitor + 4) )
    {
      KiStackAttachProcess(PsInitialSystemProcess, 0i64, &ApcState);
      for( i = 0i64; ; i = v9 )
      {
        NextSilo = PspGetNextSilo(i, 1u);
        v9 = NextSilo;
        if( !NextSilo )
          break;
        if( (unsigned int)(*PspGetServerSiloStatePointer(NextSilo) - 1) <= 2 )
          (*((void(__fastcall **)(_EJOB *))Monitor + 4))(v9);
      }
      if( *((_BYTE *)Monitor + 16) )
      {
        LODWORD(v10) = HalSystemVectorDispatchEntry(v7, v6, v8);
        (*((void(__fastcall **)(__int64))Monitor + 4))(v10);
      }
      KiUnstackDetachProcess(&ApcState, 0i64);
      v3 = *(_QWORD *)Monitor;
    }
    if( *(_SILO_MONITOR **)(v3 + 8) != Monitor || (v11 = (_SILO_MONITOR **)*((_QWORD *)Monitor + 1), *v11 != Monitor) )
      __fastfail(3u);
    *v11 = (_SILO_MONITOR *)v3;
    *(_QWORD *)(v3 + 8) = v11;
    *(_QWORD *)Monitor = 0i64;
    *((_QWORD *)Monitor + 1) = 0i64;
  }
  if( (_InterlockedExchangeAdd64(&PspSiloMonitorLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(&PspSiloMonitorLock);
  KeAbPostRelease(&PspSiloMonitorLock);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  if( *((_BYTE *)Monitor + 16) )
  {
    KiStackAttachProcess(PsInitialSystemProcess, 0i64, &ApcState);
    LODWORD(v12) = PspGetHostSiloStorage();
    v13 = PspStorageRemoveObject(v12, (unsigned int)Monitor[5], 1u, 0i64);
    KiUnstackDetachProcess(&ApcState, 0i64);
    if( v13 )
    {
      if( v13 != -1073741275 )
        NT_ASSERT("Status == ((NTSTATUS)0x00000000L) || Status == ((NTSTATUS)0xC0000225L)");
    }
  }
  PspStorageFreeSlot((unsigned int)Monitor[5]);
  ExFreePoolWithTag(Monitor, 0x4D6C6953u);
}

Referenced by:

No references.