PfpRpCHashGrow
NTSTATUS __stdcall PfpRpCHashGrow(
_PFPRP_CONTEXT *RpContext,
_RTL_CHASH_TABLE *HashTable,
_EX_PUSH_LOCK *TableLock,
_SINGLE_LIST_ENTRY *FreeList){
_ETHREAD *CurrentThread;
_EX_PUSH_LOCK *v7;
unsigned int EntryMax;
unsigned int v9;
unsigned int v10;
NTSTATUS v11;
char v12;
size_t v13;
int v14;
unsigned int v15;
int v16;
unsigned int v17;
__int64 *v18;
unsigned __int64 v19;
int v20;
__int64 v21;
_QWORD *v22;
_ETHREAD *v23;
__int64 v25;
__int64 v26;
__int64 i;
__int64 v28;
_ETHREAD *v29;
VOID **PoolWithTag;
unsigned __int64 v31;
_PFPRP_CONTEXT *v32;
__int128 v33;
__int64 v34;
__int128 Src;
char v36;
__int64 v37;
char v38;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v7 = (_EX_PUSH_LOCK *)(RpContext + 32);
v32 = RpContext + 32;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)RpContext + 16, 0i64);
EntryMax = HashTable->EntryMax;
if( 2 * HashTable->EntryCount < EntryMax )
{
v29 = (_ETHREAD *)KeGetCurrentThread();
v11 = 0;
--v29->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(TableLock, 0i64);
}
else
{
v9 = 2 * EntryMax;
if( v9 < 8 )
v9 = 8;
v10 = v9 << HashTable->EntrySizeShift;
v11 = 0;
PoolWithTag = ExAllocatePoolWithTag(1ui64, v10, 1212376656i64);
if( PoolWithTag )
{
v12 = -1;
Src = *(_OWORD *)&HashTable->Table;
HIDWORD(v34) = 0;
v36 = _mm_cvtsi128_si32(_mm_srli_si128(*(__m128i *)&HashTable->Table, 8));
v13 = 1 << v36;
v14 = -1;
v15 = 1 << v36;
if( 1 << v36 )
{
do
{
++v14;
v15 >>= 1;
}
while( v15 );
}
v16 = v14 + 1;
if( ((v13 - 1) & v13) == 0 )
v16 = v14;
v38 = v16;
v17 = v10 >> v16;
if( ((v17 - 1) & v17) != 0 )
{
for( ; v17; v17 >>= 1 )
++v12;
v17 = 1 << v12;
}
LODWORD(v34) = 0;
*((_QWORD *)&v33 + 1) = __PAIR64__(v17, v16);
*(_QWORD *)&v33 = PoolWithTag;
memset(PoolWithTag, 0i64, (unsigned __int64)v17 << v16);
v18 = (__int64 *)Src;
v19 = Src + ((unsigned __int64)HIDWORD(Src) << v36);
v31 = v19;
if( (unsigned __int64)Src < v19 )
{
v20 = 0;
do
{
v21 = *v18;
if( *v18 )
{
if( v17 )
{
v25 = v17 - 1;
v26 = 0i64;
v37 = *v18;
for( i = 37
* (BYTE6(v37)
+ 37
* (BYTE5(v37)
+ 37
* (BYTE4(v37)
+ 37
* (BYTE3(v37) + 37 * (BYTE2(v37) + 37 * (BYTE1(v37) + 37 * ((unsigned __int8)v21 + 11623883)))))))
+ (unsigned int)HIBYTE(v37); ; i = v17 - 1 )
{
v28 = i & v25;
v22 = (VOID **)((char *)PoolWithTag + (v28 << v38));
if( !*v22 || *v22 == v21 )
break;
if( !v26 )
{
v26 = 2654435761i64 * v21 + 1;
if( ((-79 * (_BYTE)v21) & 1) != 0 )
v26 = 2654435761i64 * v21;
}
v25 = v26 + v28;
}
}
else
{
v22 = 0i64;
}
memmove(v22, v18, v13);
v19 = v31;
LODWORD(v34) = ++v20;
}
v18 = (__int64 *)((char *)v18 + v13);
}
while( (unsigned __int64)v18 < v19 );
v7 = (_EX_PUSH_LOCK *)v32;
}
v23 = (_ETHREAD *)KeGetCurrentThread();
--v23->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(TableLock, 0i64);
*(_OWORD *)&HashTable->Table = v33;
*(_QWORD *)&HashTable->EntryCount = v34;
if( (_QWORD)Src )
{
*(_SINGLE_LIST_ENTRY *)Src = (_SINGLE_LIST_ENTRY)FreeList->Next;
FreeList->Next = (_SINGLE_LIST_ENTRY *)Src;
}
}
else
{
v11 = -1073741670;
}
}
if( (_InterlockedExchangeAdd64(&v7->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v7);
KeAbPostRelease(v7);
KeLeaveCriticalRegion();
return v11;
}Referenced by:
PfpRpCHashAddEntries