PfpRpRehashIfNeeded
UINT64 __stdcall PfpRpRehashIfNeeded(_RTL_HASH_TABLE *Hash, VOID **Buckets, UINT64 BucketCount, UINT64 a4){
unsigned int v5;
unsigned __int32 v7;
unsigned int bf_4;
unsigned int v9;
int v10;
_SINGLE_LIST_ENTRY *v12;
__int64 v13;
unsigned __int64 v14;
unsigned __int32 v15;
__int64 v16;
_SINGLE_LIST_ENTRY *v17;
_SINGLE_LIST_ENTRY *Next;
__int64 v19;
_SINGLE_LIST_ENTRY *v20;
char i;
__int64 v22;
v5 = 0;
v7 = 0;
bf_4 = Hash->_bf_4;
v9 = 2 * (bf_4 >> 5);
if( Hash->EntryCount >= v9 )
{
v7 = 2 * ((unsigned __int32)Hash->_bf_4 >> 5);
if( !v9 )
v7 = 64;
v10 = 1;
}
else
{
v10 = 0;
}
if( v10 && v7 <= (unsigned int)BucketCount )
{
v12 = (_SINGLE_LIST_ENTRY *)*Buckets;
v13 = (unsigned int)BucketCount;
if( (((_DWORD)BucketCount - 1) & (unsigned int)BucketCount) != 0 )
{
for( i = -1; (_DWORD)BucketCount; LODWORD(BucketCount) = (unsigned int)BucketCount >> 1 )
++i;
v13 = (unsigned int)(1 << i);
}
if( (unsigned int)v13 > 0x4000000 )
v13 = 0x4000000i64;
v14 = (unsigned int)v13;
if( v12 > &v12[v13] )
v14 = 0i64;
if( v14 )
memset64(v12, (unsigned __int64)Hash | 1, v14);
v15 = 0;
v16 = -1i64 << (Hash->_bf_4 & 0x1F);
if( (Hash->_bf_4 & 0xFFFFFFE0) != 0 )
{
do
{
v17 = Hash->Buckets;
while( 1 )
{
Next = v17[v15].Next;
if( ((unsigned __int8)Next & 1) != 0 )
break;
v17[v15] = (_SINGLE_LIST_ENTRY)Next->Next;
v22 = v16 & (__int64)Next[1].Next;
v19 = (37
* (BYTE6(v22)
+ 37
* (BYTE5(v22)
+ 37
* (BYTE4(v22)
+ 37 * (BYTE3(v22) + 37 * (BYTE2(v22) + 37 * (BYTE1(v22) + 37 * ((unsigned __int8)v22 + 11623883)))))))
+ HIBYTE(v22)) & (unsigned int)(v13 - 1);
Next->Next = (_SINGLE_LIST_ENTRY *)v12[v19];
v12[v19].Next = Next;
}
++v15;
}
while( v15 < (unsigned __int32)Hash->_bf_4 >> 5 );
}
v20 = Hash->Buckets;
bf_4 = Hash->_bf_4 & 0x1F | (32 * v13);
Hash->Buckets = v12;
Hash->_bf_4 = bf_4;
*Buckets = v20;
}
LOBYTE(v5) = bf_4 >= 0x20;
return v5;
}Referenced by:
PfpRpFileKeyUpdate