RtlEnumerateEntryHashTable

_RTL_DYNAMIC_HASH_TABLE_ENUMERATOR *__fastcall RtlEnumerateEntryHashTable(
        _RTL_DYNAMIC_HASH_TABLE *HashTable,
        _RTL_DYNAMIC_HASH_TABLE_ENUMERATOR *Enumerator){
  unsigned int BucketIndex; 
  unsigned int TableSize; 
  unsigned int v6; 
  unsigned int i; 
  _QWORD *Directory; 
  unsigned int v9; 
  unsigned int v10; 
  _LIST_ENTRY *ChainHead; 
  _RTL_DYNAMIC_HASH_TABLE_ENUMERATOR *v12; 
  _RTL_DYNAMIC_HASH_TABLE_ENUMERATOR *Flink; 
  _RTL_DYNAMIC_HASH_TABLE_ENUMERATOR *result; 
  _LIST_ENTRY *v15; 
  _LIST_ENTRY *Blink; 
  _LIST_ENTRY *v17; 
  _LIST_ENTRY *v18; 

  BucketIndex = Enumerator->BucketIndex;
  TableSize = HashTable->TableSize;
  v6 = BucketIndex;
  if( BucketIndex >= TableSize )
    return 0i64;
  for( i = BucketIndex + 128; ; ++i )
  {
    if( v6 == BucketIndex )
    {
      ChainHead = Enumerator->ChainHead;
      v12 = Enumerator;
    }
    else
    {
      Directory = HashTable->Directory;
      if( TableSize <= 0x80 )
      {
        v10 = v6;
      }
      else
      {
        _BitScanReverse(&v9, i);
        v10 = i ^ (1 << v9);
        Directory = (_QWORD *)Directory[v9 - 7];
      }
      ChainHead = (_LIST_ENTRY *)&Directory[2 * v10];
      v12 = (_RTL_DYNAMIC_HASH_TABLE_ENUMERATOR *)ChainHead;
    }
    Flink = (_RTL_DYNAMIC_HASH_TABLE_ENUMERATOR *)v12->HashEntry.Linkage.Flink;
    if( Flink != (_RTL_DYNAMIC_HASH_TABLE_ENUMERATOR *)ChainHead )
      break;
LABEL_8:
    if( ++v6 >= TableSize )
      return 0i64;
  }
  while( !Flink->HashEntry.Signature )
  {
    Flink = (_RTL_DYNAMIC_HASH_TABLE_ENUMERATOR *)Flink->HashEntry.Linkage.Flink;
    if( Flink == (_RTL_DYNAMIC_HASH_TABLE_ENUMERATOR *)ChainHead )
      goto LABEL_8;
  }
  v15 = Enumerator->HashEntry.Linkage.Flink;
  if( (_RTL_DYNAMIC_HASH_TABLE_ENUMERATOR *)Enumerator->HashEntry.Linkage.Flink->Blink != Enumerator )
    goto LABEL_22;
  Blink = Enumerator->HashEntry.Linkage.Blink;
  if( (_RTL_DYNAMIC_HASH_TABLE_ENUMERATOR *)Blink->Flink != Enumerator )
    goto LABEL_22;
  Blink->Flink = v15;
  v15->Blink = Blink;
  v17 = Enumerator->ChainHead;
  if( v17 != ChainHead )
  {
    if( v17->Flink == v17 )
      --HashTable->NonEmptyBuckets;
    if( ChainHead->Flink == ChainHead )
      ++HashTable->NonEmptyBuckets;
  }
  Enumerator->BucketIndex = v6;
  Enumerator->ChainHead = ChainHead;
  v18 = Flink->HashEntry.Linkage.Flink;
  if( (_RTL_DYNAMIC_HASH_TABLE_ENUMERATOR *)Flink->HashEntry.Linkage.Flink->Blink != Flink )
LABEL_22:
    __fastfail(3u);
  Enumerator->HashEntry.Linkage.Flink = v18;
  Enumerator->HashEntry.Linkage.Blink = &Flink->HashEntry.Linkage;
  v18->Blink = &Enumerator->HashEntry.Linkage;
  result = Flink;
  Flink->HashEntry.Linkage.Flink = &Enumerator->HashEntry.Linkage;
  return result;
}

Referenced by:

RtlWeaklyEnumerateEntryHashTable
SepCleanupMarkedForDeletionEntries
SepFindMatchingLowBoxNumberEntries
SepRmDestroyCapTable