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