RtlDestroyAtomTable

INT64 __fastcall RtlDestroyAtomTable(VOID *AtomTableHandle){
  unsigned int v2; 
  _QWORD **i; 
  _QWORD *v4; 
  _QWORD *v5; 
  _HANDLE_TABLE *v6; 
  _QWORD **v8; 
  _QWORD *v9; 
  _QWORD *v10; 
  if( _InterlockedExchangeAdd((volatile signed __int32 *)AtomTableHandle + 1, 0xFFFFFFFF) != 1 )
    return 0i64;
  if( RtlpLockAtomTable((_RTL_ATOM_TABLE *)AtomTableHandle) )
  {
    v2 = 0;
    for( i = (_QWORD **)((char *)AtomTableHandle + 32); v2 < *((_DWORD *)AtomTableHandle + 7); ++v2 )
    {
      v4 = *i;
      *i++ = 0i64;
      while( 1 )
      {
        v5 = v4;
        if( !v4 )
          break;
        v4 = (_QWORD *)*v4;
        v8 = (_QWORD **)(v5 + 2);
        *v5 = 0i64;
        while( 1 )
        {
          v9 = *v8;
          if( *v8 == v8 )
            break;
          if( (_QWORD **)v9[1] != v8 || (v10 = (_QWORD *)*v9, *(_QWORD **)(*v9 + 8i64) != v9) )
            __fastfail(3u);
          *v8 = v10;
          v10[1] = v8;
          RtlpFreeAtom(v9);
        }
        RtlpFreeAtom(v5);
      }
    }
    *(_DWORD *)AtomTableHandle = 0;
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)AtomTableHandle + 1, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)AtomTableHandle + 1);
    KeAbPostRelease((char *)AtomTableHandle + 8);
    KeLeaveCriticalRegion();
    v6 = (_HANDLE_TABLE *)*((_QWORD *)AtomTableHandle + 2);
    ExpRemoveHandleTable((__int64)v6);
    ExpFreeHandleTable(v6);
    *(_OWORD *)AtomTableHandle = 0i64;
    *((_OWORD *)AtomTableHandle + 1) = 0i64;
    *((_QWORD *)AtomTableHandle + 4) = 0i64;
    RtlpFreeAtom(AtomTableHandle);
    return 0i64;
  }
  return 3221225485i64;
}

Referenced by:

RtlDereferenceAtomTable