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