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