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