RtlEmptyAtomTable
NTSTATUS __stdcall RtlEmptyAtomTable(VOID *AtomTableHandle, UINT8 IncludePinnedAtoms){
unsigned int v5;
_RTL_ATOM_TABLE_ENTRY *i;
_RTL_ATOM_TABLE_ENTRY *v7;
_RTL_ATOM_TABLE_ENTRY *v8;
_RTL_ATOM_TABLE_REFERENCE *p_Reference;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v11;
_RTL_ATOM_TABLE_ENTRY *HashLink;
if( !RtlpLockAtomTable((_RTL_ATOM_TABLE *)AtomTableHandle) )
return -1073741811;
v5 = 0;
for( i = (_RTL_ATOM_TABLE_ENTRY *)((char *)AtomTableHandle + 32); v5 < *((_DWORD *)AtomTableHandle + 7); ++v5 )
{
v7 = i;
i = (_RTL_ATOM_TABLE_ENTRY *)((char *)i + 8);
while( 1 )
{
HashLink = v7->HashLink;
if( !v7->HashLink )
break;
if( IncludePinnedAtoms || (HashLink->Reference.Flags & 1) == 0 )
{
v8 = v7->HashLink;
v7->HashLink = HashLink->HashLink;
HashLink->HashLink = 0i64;
RtlpFreeHandleForAtom((_RTL_ATOM_TABLE *)AtomTableHandle, v8);
p_Reference = &HashLink->Reference;
while( 1 )
{
Flink = p_Reference->LowBoxList.Flink;
if( (_RTL_ATOM_TABLE_REFERENCE *)p_Reference->LowBoxList.Flink == p_Reference )
break;
if( (_RTL_ATOM_TABLE_REFERENCE *)Flink->Blink != p_Reference
|| (v11 = Flink->Flink, Flink->Flink->Blink != Flink) )
{
__fastfail(3u);
}
p_Reference->LowBoxList.Flink = v11;
v11->Blink = &p_Reference->LowBoxList;
RtlpFreeAtom(Flink);
}
RtlpFreeAtom(HashLink);
}
else
{
v7 = v7->HashLink;
}
}
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)AtomTableHandle + 1, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)AtomTableHandle + 1);
KeAbPostRelease((char *)AtomTableHandle + 8);
KeLeaveCriticalRegion();
return 0;
}Referenced by:
No references.