PfpRpCHashGrow

NTSTATUS __stdcall PfpRpCHashGrow(
        _PFPRP_CONTEXT *RpContext,
        _RTL_CHASH_TABLE *HashTable,
        _EX_PUSH_LOCK *TableLock,
        _SINGLE_LIST_ENTRY *FreeList){
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *v7; 
  unsigned int EntryMax; 
  unsigned int v9; 
  unsigned int v10; 
  NTSTATUS v11; 
  char v12; 
  size_t v13; 
  int v14; 
  unsigned int v15; 
  int v16; 
  unsigned int v17; 
  __int64 *v18; 
  unsigned __int64 v19; 
  int v20; 
  __int64 v21; 
  _QWORD *v22; 
  _ETHREAD *v23; 
  __int64 v25; 
  __int64 v26; 
  __int64 i; 
  __int64 v28; 
  _ETHREAD *v29; 
  VOID **PoolWithTag; 
  unsigned __int64 v31; 
  _PFPRP_CONTEXT *v32; 
  __int128 v33; 
  __int64 v34; 
  __int128 Src; 
  char v36; 
  __int64 v37; 
  char v38; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  v7 = (_EX_PUSH_LOCK *)(RpContext + 32);
  v32 = RpContext + 32;
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)RpContext + 16, 0i64);
  EntryMax = HashTable->EntryMax;
  if( 2 * HashTable->EntryCount < EntryMax )
  {
    v29 = (_ETHREAD *)KeGetCurrentThread();
    v11 = 0;
    --v29->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx(TableLock, 0i64);
  }
  else
  {
    v9 = 2 * EntryMax;
    if( v9 < 8 )
      v9 = 8;
    v10 = v9 << HashTable->EntrySizeShift;
    v11 = 0;
    PoolWithTag = ExAllocatePoolWithTag(1ui64, v10, 1212376656i64);
    if( PoolWithTag )
    {
      v12 = -1;
      Src = *(_OWORD *)&HashTable->Table;
      HIDWORD(v34) = 0;
      v36 = _mm_cvtsi128_si32(_mm_srli_si128(*(__m128i *)&HashTable->Table, 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;
      *((_QWORD *)&v33 + 1) = __PAIR64__(v17, v16);
      *(_QWORD *)&v33 = PoolWithTag;
      memset(PoolWithTag, 0i64, (unsigned __int64)v17 << v16);
      v18 = (__int64 *)Src;
      v19 = Src + ((unsigned __int64)HIDWORD(Src) << v36);
      v31 = v19;
      if( (unsigned __int64)Src < v19 )
      {
        v20 = 0;
        do
        {
          v21 = *v18;
          if( *v18 )
          {
            if( v17 )
            {
              v25 = v17 - 1;
              v26 = 0i64;
              v37 = *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 = (VOID **)((char *)PoolWithTag + (v28 << v38));
                if( !*v22 || *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 = (__int64 *)((char *)v18 + v13);
        }
        while( (unsigned __int64)v18 < v19 );
        v7 = (_EX_PUSH_LOCK *)v32;
      }
      v23 = (_ETHREAD *)KeGetCurrentThread();
      --v23->Tcb.KernelApcDisable;
      ExAcquirePushLockExclusiveEx(TableLock, 0i64);
      *(_OWORD *)&HashTable->Table = v33;
      *(_QWORD *)&HashTable->EntryCount = v34;
      if( (_QWORD)Src )
      {
        *(_SINGLE_LIST_ENTRY *)Src = (_SINGLE_LIST_ENTRY)FreeList->Next;
        FreeList->Next = (_SINGLE_LIST_ENTRY *)Src;
      }
    }
    else
    {
      v11 = -1073741670;
    }
  }
  if( (_InterlockedExchangeAdd64(&v7->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v7);
  KeAbPostRelease(v7);
  KeLeaveCriticalRegion();
  return v11;
}

Referenced by:

PfpRpCHashAddEntries