PfpRpCHashGrow

__int64 __fastcall PfpRpCHashGrow(__int64 a1, __m128i *a2, UINT64 a3, _QWORD *a4){
  _ETHREAD *CurrentThread; 
  volatile INT64 *v7; 
  unsigned int v8; 
  unsigned int v9; 
  unsigned int v10; 
  unsigned int v11; 
  char v12; 
  unsigned int v13; 
  int v14; 
  unsigned int v15; 
  int v16; 
  unsigned int v17; 
  UINT8 *v18; 
  unsigned __int64 v19; 
  int v20; 
  __int64 v21; 
  UINT8 *v22; 
  _ETHREAD *v23; 
  __int64 v25; 
  __int64 v26; 
  __int64 i; 
  __int64 v28; 
  _ETHREAD *v29; 
  char *PoolWithTag; 
  unsigned __int64 v31; 
  __int64 v32; 
  __m128i v33; 
  __int64 v34; 
  __m128i Src; 
  char v36; 
  __int64 v37; 
  char v38; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v7 = (volatile INT64 *)(a1 + 128);
  v32 = a1 + 128;
  ExAcquirePushLockExclusiveEx(a1 + 128, 0i64);
  v8 = a2->m128i_u32[3];
  if( 2 * a2[1].m128i_i32[0] < v8 )
  {
    v29 = (_ETHREAD *)KeGetCurrentThread();
    v11 = 0;
    --*((_WORD *)v29 + 242);
    ExAcquirePushLockExclusiveEx(a3, 0i64);
  }
  else
  {
    v9 = 2 * v8;
    if( v9 < 8 )
      v9 = 8;
    v10 = v9 << a2->m128i_i32[2];
    v11 = 0;
    PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, v10, 0x48436650ui64);
    if( PoolWithTag )
    {
      v12 = -1;
      Src = *a2;
      HIDWORD(v34) = 0;
      v36 = _mm_cvtsi128_si32(_mm_srli_si128(*a2, 8));
      v13 = 1 << v36;
      v14 = -1;
      v15 = 1 << v36;
      if( 1 << v36 )
      {
        do
        {
          ++v14;
          v15 >>= 1;
        }
        while( v15 );
      }
      v16 = v14 + 1;
      if( ((v13 - 1) & v13) == 0 )
        v16 = v14;
      v38 = v16;
      v17 = v10 >> v16;
      if( ((v17 - 1) & v17) != 0 )
      {
        for( ; v17; v17 >>= 1 )
          ++v12;
        v17 = 1 << v12;
      }
      LODWORD(v34) = 0;
      v33.m128i_i64[1] = __PAIR64__(v17, v16);
      v33.m128i_i64[0] = (__int64)PoolWithTag;
      memset((INT64)PoolWithTag, 0i64);
      v18 = (UINT8 *)Src.m128i_i64[0];
      v19 = Src.m128i_i64[0] + ((unsigned __int64)Src.m128i_u32[3] << v36);
      v31 = v19;
      if( Src.m128i_i64[0] < v19 )
      {
        v20 = 0;
        do
        {
          v21 = *(_QWORD *)v18;
          if( *(_QWORD *)v18 )
          {
            if( v17 )
            {
              v25 = v17 - 1;
              v26 = 0i64;
              v37 = *(_QWORD *)v18;
              for( i = 37
                      * (BYTE6(v37)
                       + 37
                       * (BYTE5(v37)
                        + 37
                        * (BYTE4(v37)
                         + 37
                         * (BYTE3(v37) + 37 * (BYTE2(v37) + 37 * (BYTE1(v37) + 37 * ((unsigned __int8)v21 + 11623883)))))))
                      + (unsigned int)HIBYTE(v37); ; i = v17 - 1 )
              {
                v28 = i & v25;
                v22 = (UINT8 *)&PoolWithTag[v28 << v38];
                if( !*(_QWORD *)v22 || *(_QWORD *)v22 == v21 )
                  break;
                if( !v26 )
                {
                  v26 = 2654435761i64 * v21 + 1;
                  if( ((-79 * (_BYTE)v21) & 1) != 0 )
                    v26 = 2654435761i64 * v21;
                }
                v25 = v26 + v28;
              }
            }
            else
            {
              v22 = 0i64;
            }
            memmove(v22, v18, v13);
            v19 = v31;
            LODWORD(v34) = ++v20;
          }
          v18 += v13;
        }
        while( (unsigned __int64)v18 < v19 );
        v7 = (volatile INT64 *)v32;
      }
      v23 = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)v23 + 242);
      ExAcquirePushLockExclusiveEx(a3, 0i64);
      *a2 = v33;
      a2[1].m128i_i64[0] = v34;
      if( Src.m128i_i64[0] )
      {
        *(_QWORD *)Src.m128i_i64[0] = *a4;
        *a4 = Src.m128i_i64[0];
      }
    }
    else
    {
      v11 = -1073741670;
    }
  }
  if( (_InterlockedExchangeAdd64(v7, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v7);
  KeAbPostRelease((PVOID)v7);
  KeLeaveCriticalRegion();
  return v11;
}

Referenced by:

PfpRpCHashAddEntries