PfpRpCHashEmpty

VOID __stdcall PfpRpCHashEmpty(_PFPRP_CONTEXT *RpContext, _RTL_CHASH_TABLE *HashTable, _EX_PUSH_LOCK *TableLock){
  int v3; 
  int v4; 
  unsigned int v7; 
  unsigned int v8; 
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *v10; 
  _ETHREAD *v11; 
  _RTL_CHASH_ENTRY *Table; 
  __int128 v13; 
  __int64 v14; 

  HIDWORD(v14) = 0;
  v3 = 1 << HashTable->EntrySizeShift;
  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();
  --CurrentThread->Tcb.KernelApcDisable;
  v10 = (_EX_PUSH_LOCK *)(RpContext + 32);
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)RpContext + 16, 0i64);
  v11 = (_ETHREAD *)KeGetCurrentThread();
  Table = HashTable->Table;
  --v11->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx(TableLock, 0i64);
  *(_OWORD *)&HashTable->Table = v13;
  *(_QWORD *)&HashTable->EntryCount = v14;
  if( (_InterlockedExchangeAdd64(&TableLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(TableLock);
  KeAbPostRelease(TableLock);
  KeLeaveCriticalRegion();
  if( (_InterlockedExchangeAdd64(&v10->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v10);
  KeAbPostRelease(v10);
  KeLeaveCriticalRegion();
  if( Table )
    ExFreePoolWithTag(Table, 0);
}

Referenced by:

PfpRpControlRequestReset