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