PfpRpCHashAddEntries

__int64 __fastcall PfpRpCHashAddEntries(
        __int64 a1,
        __m128i *a2,
        volatile signed __int64 *a3,
        __int64 *a4,
        unsigned int a5){
  unsigned int v5; 
  __int64 v6; 
  __int32 v7; 
  UINT8 *v8; 
  unsigned int v9; 
  UINT8 *v10; 
  int v13; 
  PVOID v14; 
  __int64 v16; 
  __int32 v17; 
  __int32 v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  UINT8 *v22; 
  __int64 v23; 
  __int64 v24; 
  _ETHREAD *CurrentThread; 
  __int64 v27; 
  __int64 v28; 
  PVOID P; 
  v5 = a5;
  v6 = a1;
  v7 = a2->m128i_i32[2];
  P = 0i64;
  v8 = (UINT8 *)a4 + ((unsigned __int64)a5 << v7);
  v9 = 1 << v7;
  v10 = (UINT8 *)a4;
  if( a5 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    ExAcquirePushLockExclusiveEx((UINT64)a3, 0i64);
  }
  if( v10 < v8 )
  {
    while( 1 )
    {
      if( (unsigned int)(2 * a2[1].m128i_i32[0]) >= a2->m128i_i32[3] )
      {
        if( (_InterlockedExchangeAdd64(a3, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
          ExfTryToWakePushLock(a3);
        KeAbPostRelease((PVOID)a3);
        KeLeaveCriticalRegion();
        v13 = PfpRpCHashGrow(v6, a2, (UINT64)a3, &P);
        if( v13 < 0 )
          goto LABEL_6;
      }
      v16 = *(_QWORD *)v10;
      v17 = a2->m128i_i32[3];
      if( !v17 )
        break;
      v18 = a2->m128i_i32[2];
      v19 = (unsigned int)(v17 - 1);
      v27 = *(_QWORD *)v10;
      v20 = (HIBYTE(v27)
           + 37
           * (BYTE6(v27)
            + 37
            * (BYTE5(v27)
             + 37
             * (BYTE4(v27)
              + 37 * (BYTE3(v27) + 37 * (BYTE2(v27) + 37 * (BYTE1(v27) + 37 * ((unsigned __int8)v16 + 11623883)))))))) & (unsigned int)v19;
      v28 = v19;
      v21 = 0i64;
      v22 = (UINT8 *)(a2->m128i_i64[0] + (v20 << v18));
      if( !*(_QWORD *)v22 )
        goto LABEL_21;
      v23 = *(_QWORD *)v22;
      do
      {
        v24 = v23;
        if( v23 == v16 )
          break;
        if( !v21 )
        {
          v21 = 2654435761i64 * v16 + 1;
          if( ((-79 * (_BYTE)v16) & 1) != 0 )
            v21 = 2654435761i64 * v16;
        }
        v20 = v28 & (v21 + v20);
        v22 = (UINT8 *)(a2->m128i_i64[0] + (v20 << v18));
        v24 = *(_QWORD *)v22;
        v23 = *(_QWORD *)v22;
      }
      while( *(_QWORD *)v22 );
      v5 = a5;
      if( !v24 )
        goto LABEL_21;
LABEL_14:
      v10 += v9;
      if( v10 >= v8 )
        goto LABEL_4;
      v6 = a1;
    }
    v22 = 0i64;
LABEL_21:
    memmove(v22, v10, v9);
    ++a2[1].m128i_i32[0];
    goto LABEL_14;
  }
LABEL_4:
  if( v5 )
  {
    if( (_InterlockedExchangeAdd64(a3, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(a3);
    KeAbPostRelease((PVOID)a3);
    KeLeaveCriticalRegion();
  }
  v13 = 0;
LABEL_6:
  while( 1 )
  {
    v14 = P;
    if( !P )
      break;
    P = *(PVOID *)P;
    ExFreePoolWithTag(v14, 0);
  }
  return(unsigned int)v13;
}

Referenced by:

PfpRpControlRequestUpdate