PsUnregisterSiloMonitor

void __fastcall PsUnregisterSiloMonitor(PVOID P){
  _ETHREAD *CurrentThread; 
  PVOID *v3; 
  _EJOB *i; 
  _EJOB *NextSilo; 
  _EJOB *v6; 
  INT64 v7; 
  PVOID *v8; 
  INT64 HostSiloStorage; 
  int v10; 
  _KAPC_STATE ApcState; 
  memset(&ApcState, 0, sizeof(ApcState));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)&PspSiloMonitorLock, 0i64);
  v3 = *(PVOID **)P;
  if( *(_OWORD *)P != 0i64 )
  {
    if( *((_QWORD *)P + 4) )
    {
      KiStackAttachProcess(PsInitialSystemProcess, 0i64, &ApcState);
      for( i = 0i64; ; i = v6 )
      {
        NextSilo = PspGetNextSilo(i, 1u);
        v6 = NextSilo;
        if( !NextSilo )
          break;
        if( (unsigned int)(*(_DWORD *)PspGetServerSiloStatePointer((INT64)NextSilo) - 1) <= 2 )
          (*((void(__fastcall **)(_EJOB *))P + 4))(v6);
      }
      if( *((_BYTE *)P + 16) )
      {
        v7 = HalSystemVectorDispatchEntry();
        (*((void(__fastcall **)(INT64))P + 4))(v7);
      }
      KiUnstackDetachProcess(&ApcState, 0i64);
      v3 = *(PVOID **)P;
    }
    if( v3[1] != P || (v8 = (PVOID *)*((_QWORD *)P + 1), *v8 != P) )
      __fastfail(3u);
    *v8 = v3;
    v3[1] = v8;
    *(_QWORD *)P = 0i64;
    *((_QWORD *)P + 1) = 0i64;
  }
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&PspSiloMonitorLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)&PspSiloMonitorLock);
  KeAbPostRelease(&PspSiloMonitorLock);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  if( *((_BYTE *)P + 16) )
  {
    KiStackAttachProcess(PsInitialSystemProcess, 0i64, &ApcState);
    HostSiloStorage = PspGetHostSiloStorage();
    v10 = PspStorageRemoveObject(HostSiloStorage, *((unsigned int *)P + 5), 1, 0i64);
    KiUnstackDetachProcess(&ApcState, 0i64);
    if( v10 )
    {
      if( v10 != -1073741275 )
        NT_ASSERT("Status == ((NTSTATUS)0x00000000L) || Status == ((NTSTATUS)0xC0000225L)");
    }
  }
  PspStorageFreeSlot(*((unsigned int *)P + 5));
  ExFreePoolWithTag(P, 0x4D6C6953u);
}

Referenced by:

No references.