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