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