PfpRpCHashEmpty
VOID __fastcall PfpRpCHashEmpty(INT64 a1, INT64 a2, volatile INT64 *a3){
int v3;
int v4;
unsigned int v7;
unsigned int v8;
_ETHREAD *CurrentThread;
volatile INT64 *v10;
_ETHREAD *v11;
void *v12;
__int128 v13;
__int64 v14;
HIDWORD(v14) = 0;
v3 = 1 << *(_DWORD *)(a2 + 8);
v4 = -1;
v7 = v3;
if( v3 )
{
do
{
++v4;
v7 >>= 1;
}
while( v7 );
}
LODWORD(v14) = 0;
v8 = v4 + 1;
if( ((v3 - 1) & v3) == 0 )
v8 = v4;
*(_QWORD *)&v13 = 0i64;
*((_QWORD *)&v13 + 1) = v8;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v10 = (volatile INT64 *)(a1 + 128);
ExAcquirePushLockExclusiveEx(a1 + 128, 0i64);
v11 = (_ETHREAD *)KeGetCurrentThread();
v12 = *(void **)a2;
--*((_WORD *)v11 + 242);
ExAcquirePushLockExclusiveEx((UINT64)a3, 0i64);
*(_OWORD *)a2 = v13;
*(_QWORD *)(a2 + 16) = v14;
if( (_InterlockedExchangeAdd64(a3, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(a3);
KeAbPostRelease((PVOID)a3);
KeLeaveCriticalRegion();
if( (_InterlockedExchangeAdd64(v10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v10);
KeAbPostRelease((PVOID)v10);
KeLeaveCriticalRegion();
if( v12 )
ExFreePoolWithTag(v12, 0);
}Referenced by:
PfpRpControlRequestReset