ViPostPoolAllocation
VOID *__stdcall ViPostPoolAllocation(_VI_POOL_ENTRY *PoolEntry, _POOL_TYPE PoolType){
unsigned __int64 NextPage;
char v4;
unsigned __int64 v5;
__int64 v6;
unsigned __int64 v7;
unsigned __int64 v8;
unsigned __int64 Signature;
_VI_POOL_ENTRY **v10;
_SLIST_ENTRY *v11;
unsigned __int64 v12;
unsigned __int32 v13;
unsigned __int64 v14;
unsigned int v15;
unsigned __int64 v16;
unsigned __int32 v17;
unsigned __int64 v18;
unsigned int v19;
VOID *result;
NextPage = (unsigned __int64)PoolEntry->PageHeader.NextPage;
VerifierIsTrackingPool = 1;
v4 = PoolType;
v5 = NextPage & 1;
v6 = *(_QWORD *)(((unsigned __int64)PoolEntry & 0xFFFFFFFFFFFFF000ui64) + 8);
LODWORD(v7) = ExpSizeHeapPool(NextPage);
v8 = v7;
Signature = PoolEntry->PageHeader.Signature;
if( (NextPage & 1) != 0 )
{
NextPage &= ~1ui64;
v8 = PoolEntry->PageHeader.Signature;
PoolEntry->PageHeader.NextPage = (_SLIST_ENTRY *)NextPage;
}
else
{
if( Signature > 0xFE0 )
{
LABEL_12:
v10 = (_VI_POOL_ENTRY **)(NextPage + v8 - 8);
goto LABEL_13;
}
v8 -= 16i64;
}
if( !v5 )
goto LABEL_12;
v8 = Signature;
if( (NextPage & 0xFFF) != 0 )
v10 = (_VI_POOL_ENTRY **)((NextPage & 0xFFFFFFFFFFFFF000ui64) + 16);
else
v10 = (_VI_POOL_ENTRY **)(NextPage + 4064);
v11 = (_SLIST_ENTRY *)(NextPage & 0xFFFFFFFFFFFFF000ui64);
if( (NextPage & 0xFFF) == 0 )
v11 = (_SLIST_ENTRY *)(NextPage + 4080);
LODWORD(v11->Next) |= 0x4000u;
LABEL_13:
PoolEntry->PageHeader.NextPage = (_SLIST_ENTRY *)NextPage;
PoolEntry->PageHeader.Signature = v8;
if( (v4 & 1) != 0 )
{
v12 = v8 + _InterlockedExchangeAdd64((volatile signed __int64 *)(v6 + 120), v8);
if( v12 > *(_QWORD *)(v6 + 136) )
*(_QWORD *)(v6 + 136) = v12;
v13 = _InterlockedIncrement((volatile signed __int32 *)(v6 + 104));
if( v13 > *(_DWORD *)(v6 + 112) )
*(_DWORD *)(v6 + 112) = v13;
v14 = v8 + _InterlockedExchangeAdd64(&qword_140C2A670, v8);
if( v14 > qword_140C2A680 )
qword_140C2A680 = v14;
v15 = _InterlockedIncrement(&dword_140C2A660);
if( v15 > dword_140C2A668 )
dword_140C2A668 = v15;
}
else
{
v16 = v8 + _InterlockedExchangeAdd64((volatile signed __int64 *)(v6 + 128), v8);
if( v16 > *(_QWORD *)(v6 + 144) )
*(_QWORD *)(v6 + 144) = v16;
v17 = _InterlockedIncrement((volatile signed __int32 *)(v6 + 108));
if( v17 > *(_DWORD *)(v6 + 116) )
*(_DWORD *)(v6 + 116) = v17;
v18 = v8 + _InterlockedExchangeAdd64(&qword_140C2A678, v8);
if( v18 > qword_140C2A688 )
qword_140C2A688 = v18;
v19 = _InterlockedIncrement(&dword_140C2A664);
if( v19 > dword_140C2A66C )
dword_140C2A66C = v19;
}
result = (VOID *)NextPage;
*v10 = PoolEntry;
return result;
}Referenced by:
VeAllocatePoolWithTagPriority