RtlQueryAtomsInAtomTable
INT64 __stdcall RtlQueryAtomsInAtomTable(
PVOID AtomTableHandle,
UINT64 MaximumNumberOfAtoms,
UINT64 *NumberOfAtoms,
UINT16 *Atoms){
unsigned int v6;
__int64 v9;
__int64 i;
_RTL_ATOM_TABLE_ENTRY *j;
unsigned int v12;
v6 = MaximumNumberOfAtoms;
if( !RtlpLockAtomTable((_RTL_ATOM_TABLE *)AtomTableHandle) )
return 3221225485i64;
v12 = 0;
v9 = 0i64;
for( i = 0i64; (unsigned int)i < *((_DWORD *)AtomTableHandle + 7); i = (unsigned int)(i + 1) )
{
for( j = (_RTL_ATOM_TABLE_ENTRY *)*((_QWORD *)AtomTableHandle + i + 4); j; j = j->HashLink )
{
if( RtlpLookupLowBox((_RTL_ATOM_TABLE *)AtomTableHandle, j, 0i64) )
{
if( (unsigned int)v9 >= v6 )
v12 = -1073741820;
else
Atoms[v9] = j->Atom;
v9 = (unsigned int)(v9 + 1);
}
}
}
*(_DWORD *)NumberOfAtoms = v9;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)AtomTableHandle + 1, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)AtomTableHandle + 1);
KeAbPostRelease((char *)AtomTableHandle + 8);
KeLeaveCriticalRegion();
return v12;
}Referenced by:
NtQueryInformationAtom