RtlExpandHashTable
INT8 __fastcall RtlExpandHashTable(INT64 a1){
int v1;
unsigned int v3;
unsigned int v4;
__int64 v5;
_QWORD *v6;
UINT64 v7;
_LIST_ENTRY *ChainHead;
_LIST_ENTRY *v9;
__int64 v10;
_LIST_ENTRY *v11;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v13;
int v14;
_LIST_ENTRY *v15;
_LIST_ENTRY *Blink;
_LIST_ENTRY *v17;
int v18;
_LIST_ENTRY *SecondLevelDir;
VOID *v21;
VOID **PoolWithTag;
VOID **v23;
v1 = *(_DWORD *)(a1 + 8);
if( v1 == 8388480 || *(_DWORD *)(a1 + 28) )
return 0;
_BitScanReverse(&v3, v1 + 128);
v4 = (v1 + 128) ^ (1 << v3);
v5 = v3 - 7;
if( v1 == 128 )
{
v21 = *(VOID **)(a1 + 32);
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x80ui64, 1650545736i64);
v23 = PoolWithTag;
if( !PoolWithTag )
return 0;
memset(PoolWithTag + 1, 0i64, 0x78u);
*v23 = v21;
*(_QWORD *)(a1 + 32) = v23;
}
v6 = *(_QWORD **)(a1 + 32);
if( !v6[v5] )
{
SecondLevelDir = RtlpAllocateSecondLevelDir((unsigned int)v5);
if( SecondLevelDir )
{
v6[v5] = SecondLevelDir;
goto LABEL_5;
}
if( *(_DWORD *)(a1 + 8) == 128 )
{
*(_QWORD *)(a1 + 32) = *v6;
ExFreePoolWithTag(v6, 0);
}
return 0;
}
LABEL_5:
v7 = *(unsigned int *)(a1 + 12);
++*(_DWORD *)(a1 + 8);
ChainHead = RtlpGetChainHead((_RTL_DYNAMIC_HASH_TABLE *)a1, v7);
++*(_DWORD *)(a1 + 12);
v9 = ChainHead;
v11 = (_LIST_ENTRY *)(v10 + 16i64 * v4);
v11->Blink = v11;
v11->Flink = v11;
Flink = ChainHead->Flink;
if( ChainHead->Flink != ChainHead )
{
v13 = ChainHead;
do
{
v14 = LODWORD(Flink[1].Flink) >> *(_DWORD *)(a1 + 4);
if( (((2 * *(_DWORD *)(a1 + 16)) | 1) & ((69069 * v14 + 1) & 0xFFFF0000 | ((unsigned int)(1103515245 * v14 + 12345) >> 16))) == *(_DWORD *)(a1 + 8) - 1 )
{
v15 = Flink->Flink;
if( Flink->Flink->Blink != Flink
|| (Blink = Flink->Blink, Blink->Flink != Flink)
|| (Blink->Flink = v15, v15->Blink = Blink, v17 = v11->Blink, v17->Flink != v11) )
{
__fastfail(3u);
}
Flink->Flink = v11;
Flink->Blink = v17;
v17->Flink = Flink;
v11->Blink = Flink;
}
else
{
v13 = Flink;
}
Flink = v13->Flink;
}
while( v13->Flink != v9 );
if( v11->Flink != v11 )
++*(_DWORD *)(a1 + 24);
if( v9->Flink == v9 )
--*(_DWORD *)(a1 + 24);
}
v18 = *(_DWORD *)(a1 + 16);
if( *(_DWORD *)(a1 + 12) == v18 + 1 )
{
*(_DWORD *)(a1 + 12) = 0;
*(_DWORD *)(a1 + 16) = (2 * v18) | 1;
}
return 1;
}Referenced by:
No references.