RtlQueryAtomInAtomTable
INT64 __stdcall RtlQueryAtomInAtomTable(
PVOID AtomTableHandle,
UINT16 Atom,
UINT64 *AtomUsage,
UINT64 *AtomFlags,
WCHAR *AtomName,
UINT64 *AtomNameLength){
int v8;
_RTL_ATOM_TABLE_ENTRY *v10;
_RTL_ATOM_TABLE_ENTRY *v11;
unsigned int v12;
unsigned int v13;
unsigned int v14;
unsigned int v15;
unsigned int v17;
wchar_t DstBuf[16];
v8 = Atom;
if( !RtlpLockAtomTable((_RTL_ATOM_TABLE *)AtomTableHandle) )
return 3221225485i64;
if( (unsigned __int16)v8 >= 0xC000u )
{
v17 = -1073741816;
v10 = RtlpAtomMapAtomToHandleEntry((_RTL_ATOM_TABLE *)AtomTableHandle, v8 & 0x3FFF);
v11 = v10;
if( !v10 || v10->Atom != (_WORD)v8 || !RtlpLookupLowBox((_RTL_ATOM_TABLE *)AtomTableHandle, v10, 0i64) )
goto LABEL_32;
v17 = 0;
if( AtomUsage )
*(_DWORD *)AtomUsage = v11->Reference.ReferenceCount;
if( AtomFlags )
*(_DWORD *)AtomFlags = v11->Reference.Flags;
if( !AtomName )
goto LABEL_32;
v12 = 2 * v11->NameLength;
v13 = *(_DWORD *)AtomNameLength;
if( v12 >= *(_DWORD *)AtomNameLength )
{
if( v13 < 2 )
{
*(_DWORD *)AtomNameLength = v12;
LABEL_31:
v17 = -1073741789;
goto LABEL_32;
}
v12 = v13 - 2;
}
if( v12 )
{
memmove((UINT8 *)AtomName, (UINT8 *)v11->Name, v12);
AtomName[(unsigned __int64)v12 >> 1] = 0;
*(_DWORD *)AtomNameLength = v12;
goto LABEL_32;
}
goto LABEL_31;
}
if( !(_WORD)v8 )
{
v17 = -1073741811;
goto LABEL_32;
}
v17 = 0;
if( AtomUsage )
*(_DWORD *)AtomUsage = 1;
if( AtomFlags )
*(_DWORD *)AtomFlags = 1;
if( !AtomName )
goto LABEL_32;
v14 = 2 * snwprintf_s(DstBuf, 0x10ui64, 0xFFFFFFFFFFFFFFFFui64, L"#%u", v8);
v15 = *(_DWORD *)AtomNameLength;
if( v14 >= *(_DWORD *)AtomNameLength )
{
if( v15 < 2 )
goto LABEL_29;
v14 = v15 - 2;
}
if( !v14 )
{
LABEL_29:
v17 = -1073741789;
goto LABEL_32;
}
memmove((UINT8 *)AtomName, (UINT8 *)DstBuf, v14);
AtomName[(unsigned __int64)v14 >> 1] = 0;
*(_DWORD *)AtomNameLength = v14;
LABEL_32:
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)AtomTableHandle + 1, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)AtomTableHandle + 1);
KeAbPostRelease((char *)AtomTableHandle + 8);
KeLeaveCriticalRegion();
return v17;
}Referenced by:
NtQueryInformationAtom