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