PfpRpCHashDeleteEntries

INT64 __fastcall PfpRpCHashDeleteEntries(INT64 a1, INT64 a2, INT64 *a3, UINT64 a4, INT64 a5){
  _ETHREAD *CurrentThread; 
  volatile INT64 *v8; 
  unsigned int v9; 
  unsigned int v10; 
  INT64 v11; 
  _ETHREAD *v12; 
  char v13; 
  __int64 v14; 
  unsigned int v15; 
  int v16; 
  unsigned int v17; 
  int v18; 
  unsigned int v19; 
  UINT8 *v20; 
  UINT8 *v21; 
  int v22; 
  __int64 v23; 
  _ETHREAD *v24; 
  unsigned int v26; 
  UINT8 *v27; 
  __int64 v28; 
  __int64 v29; 
  __int64 i; 
  __int64 v31; 
  int v32[8]; 
  char *PoolWithTag; 
  UINT8 *v34; 
  INT64 v35; 
  int v36; 
  int v37; 
  PVOID P[2]; 
  __int64 v39; 
  char v40; 
  __int64 v41; 
  char v42; 
  unsigned int v43; 
  v43 = a4;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v8 = (volatile INT64 *)(a1 + 128);
  v35 = a1 + 128;
  ExAcquirePushLockExclusiveEx(a1 + 128, 0i64);
  v9 = 0;
  v10 = *(_DWORD *)(a2 + 12) << *(_DWORD *)(a2 + 8);
  if( v10 )
  {
    PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, v10, 0x48436650ui64);
    v11 = (INT64)PoolWithTag;
    if( PoolWithTag )
    {
      v12 = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)v12 + 242);
      ExAcquirePushLockSharedEx((UINT64)a3, 0i64);
      v13 = -1;
      v14 = *(_QWORD *)(a2 + 16);
      *(_OWORD *)P = *(_OWORD *)a2;
      v39 = v14;
      v40 = _mm_cvtsi128_si32(_mm_srli_si128(*(__m128i *)P, 8));
      v15 = 1 << v40;
      v16 = -1;
      v17 = 1 << v40;
      if( 1 << v40 )
      {
        do
        {
          ++v16;
          v17 >>= 1;
        }
        while( v17 );
      }
      v18 = v16 + 1;
      if( ((v15 - 1) & v15) == 0 )
        v18 = v16;
      v42 = v18;
      v19 = v10 >> v18;
      if( ((v19 - 1) & v19) != 0 )
      {
        for( ; v19; v19 >>= 1 )
          ++v13;
        v19 = 1 << v13;
      }
      v37 = 0;
      v36 = v18;
      memset(v11, 0i64);
      v20 = (UINT8 *)P[0];
      v21 = (UINT8 *)P[0] + ((unsigned __int64)HIDWORD(P[1]) << v40);
      v34 = v21;
      if( P[0] < v21 )
      {
        v22 = 0;
        do
        {
          v23 = *(_QWORD *)v20;
          if( *(_QWORD *)v20 )
          {
            if( !a5 )
              goto LABEL_26;
            v26 = 0;
            if( !v43 )
              goto LABEL_26;
            do
            {
              if( *(_QWORD *)(a5 + 8i64 * v26) == v23 )
                break;
              ++v26;
            }
            while( v26 < v43 );
            if( v26 >= v43 )
            {
LABEL_26:
              if( v19 )
              {
                v28 = v19 - 1;
                v29 = 0i64;
                v41 = *(_QWORD *)v20;
                for( i = 37
                        * (BYTE6(v41)
                         + 37
                         * (BYTE5(v41)
                          + 37
                          * (BYTE4(v41)
                           + 37
                           * (BYTE3(v41) + 37
                                         * (BYTE2(v41) + 37 * (BYTE1(v41) + 37 * ((unsigned __int8)v23 + 11623883)))))))
                        + (unsigned int)HIBYTE(v41); ; i = v19 - 1 )
                {
                  v31 = i & v28;
                  v27 = (UINT8 *)&PoolWithTag[v31 << v42];
                  if( !*(_QWORD *)v27 || *(_QWORD *)v27 == v23 )
                    break;
                  if( !v29 )
                  {
                    v29 = 2654435761i64 * v23 + 1;
                    if( ((-79 * (_BYTE)v23) & 1) != 0 )
                      v29 = 2654435761i64 * v23;
                  }
                  v28 = v29 + v31;
                }
              }
              else
              {
                v27 = 0i64;
              }
              memmove(v27, v20, v15);
              v21 = v34;
              v37 = ++v22;
            }
          }
          v20 += v15;
        }
        while( v20 < v21 );
        v8 = (volatile INT64 *)v35;
      }
      *(_QWORD *)a2 = PoolWithTag;
      *(_DWORD *)(a2 + 16) = v37;
      if( _InterlockedCompareExchange64(a3, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared(a3);
      KeAbPostRelease(a3);
      KeLeaveCriticalRegion();
      v24 = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)v24 + 242);
      _InterlockedOr(v32, 0);
      if( (*a3 & 1) != 0 )
        ExfAcquireReleasePushLockExclusive(a3);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      ExFreePoolWithTag(P[0], 0);
    }
    else
    {
      v9 = -1073741670;
    }
  }
  if( (_InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v8);
  KeAbPostRelease((PVOID)v8);
  KeLeaveCriticalRegion();
  return v9;
}

Referenced by:

PfpRpControlRequestUpdate