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