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