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