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