RtlDeleteAtomFromAtomTable
INT64 __fastcall RtlDeleteAtomFromAtomTable(VOID *AtomTableHandle, UINT16 Atom){
unsigned int v4;
_RTL_ATOM_TABLE_ENTRY *v5;
INT64 v6;
_RTL_ATOM_TABLE_ENTRY *v7;
_RTL_ATOM_TABLE_REFERENCE *v8;
if( !RtlpLockAtomTable((_RTL_ATOM_TABLE *)AtomTableHandle) )
return 3221225485i64;
v4 = -1073741816;
if( Atom < 0xC000u )
{
if( Atom )
v4 = 0;
}
else
{
v5 = RtlpAtomMapAtomToHandleEntry((_RTL_ATOM_TABLE *)AtomTableHandle, Atom & 0x3FFF);
v7 = v5;
if( v5 )
{
if( v5->Atom == Atom )
{
LOBYTE(v6) = 1;
v8 = RtlpLookupLowBox((_RTL_ATOM_TABLE *)AtomTableHandle, v5, v6);
if( v8 )
{
v4 = 0;
if( (v8->Flags & 1) != 0 )
v4 = 1073741849;
else
RtlpDereferenceAtom(v7, v8, (_RTL_ATOM_TABLE *)AtomTableHandle);
}
}
}
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)AtomTableHandle + 1, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)AtomTableHandle + 1);
KeAbPostRelease((char *)AtomTableHandle + 8);
KeLeaveCriticalRegion();
return v4;
}Referenced by:
NtDeleteAtom