EtwDeleteSiloState

void __fastcall EtwDeleteSiloState(PVOID P){
  unsigned int v2; 
  unsigned int v3; 
  unsigned int i; 
  _ETHREAD *CurrentThread; 
  INT64 *v6; 
  signed int j; 
  unsigned int k; 
  struct _EX_RUNDOWN_REF_CACHE_AWARE *v9; 
  void *v10; 
  if( !P )
    goto LABEL_19;
  v2 = *((_DWORD *)P + 4);
  v3 = 0;
  if( v2 )
  {
    while( *(_QWORD *)(*((_QWORD *)P + 57) + 8i64 * v3) == 1i64 )
    {
      if( ++v3 >= v2 )
        goto LABEL_5;
    }
LABEL_19:
    KeBugCheck(0x11Dui64);
  }
LABEL_5:
  for( i = 0; i < 0x40; ++i )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v6 = (INT64 *)((char *)P + 56 * i + 464);
    --*((_WORD *)CurrentThread + 242);
    ExAcquirePushLockSharedEx((UINT64)(v6 + 6), 0i64);
    for( j = 0; (unsigned int)j < 3; ++j )
    {
      if( (INT64 *)v6[2 * j] != &v6[2 * j] )
        goto LABEL_19;
    }
    if( _InterlockedCompareExchange64(v6 + 6, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(v6 + 6);
    KeAbPostRelease(v6 + 6);
    KeLeaveCriticalRegion();
  }
  for( k = 0; k < *((_DWORD *)P + 4); ++k )
  {
    v9 = *(struct _EX_RUNDOWN_REF_CACHE_AWARE **)(*((_QWORD *)P + 56) + 8i64 * k);
    if( v9 )
      ExFreeCacheAwareRundownProtection(v9);
  }
  ExFreePoolWithTag(*((PVOID *)P + 517), 0x61777445u);
  ExFreePoolWithTag(*((PVOID *)P + 56), 0x61777445u);
  v10 = (void *)*((_QWORD *)P + 524);
  if( v10 )
    ExFreePoolWithTag(v10, 0x61777445u);
  ExFreePoolWithTag(P, 0x61777445u);
}

Referenced by:

PspDeleteServerSiloGlobals