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