ExAllocateContiguousHeapPool

VOID *__fastcall ExAllocateContiguousHeapPool(__int64 a1, _LIST_ENTRY *a2, __int64 a3, unsigned __int64 a4, UINT64 a5){
  __int64 v6; 
  VOID *v8; 
  __int64 v9; 
  __int64 v10; 
  VOID *v11; 
  unsigned __int64 v12; 
  UINT16 *v14; 
  unsigned __int64 v15; 
  VOID *v16; 
  __int64 v17; 
  int v18; 
  INT64 v19; 
  unsigned int v20; 
  __int64 v21; 
  int v22; 
  __int64 v23; 
  int v24; 
  int v25; 
  INT64 SlushSize; 
  INT64 SlushSizea; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  INT64 v29; 

  v6 = 0i64;
  v8 = 0i64;
  LODWORD(v9) = ExGetHeapFromType(512i64, (unsigned int)a5, 0i64);
  v11 = (VOID *)v9;
  if( v12 > *(_QWORD *)(**(&stru_140C4DB30 + 267) + 6912i64)
    || (unsigned __int64)a2 < *(_QWORD *)(**(&stru_140C4DB30 + 267) + 6920i64)
    || (unsigned __int64)(v10 - 1) <= 0x1FE )
  {
    goto LABEL_3;
  }
  if( (*(_BYTE *)(v9 + 269) & 7) == 0 || a4 >= *(unsigned int *)(v9 + 464) )
    return(VOID *)v6;
  v14 = (UINT16 *)(v9 + 256);
  v15 = (a4 + 4095) & 0xFFFFFFFFFFFFF000ui64;
  if( v15 > *(unsigned int *)(v9 + 272) )
    v14 = (UINT16 *)(v9 + 448);
  LODWORD(SlushSize) = 0x800000;
  v16 = (VOID *)RtlpHpSegAlloc(v14, v15, v15, v15, SlushSize);
  v8 = v16;
  if( !v16 )
    return(VOID *)v6;
  LOWORD(SlushSizea) = 0;
  if( !ExpAddTagForBigPages(v16, 0x746E6F43ui64, v15, NonPagedPoolNx, SlushSizea, 0) )
  {
LABEL_3:
    if( v8 )
      RtlpHpFreeHeap(v11, v8, 0i64);
    return(VOID *)v6;
  }
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( PoolHitTag == 1953394499 )
    __debugbreak();
  v17 = (unsigned int)*(&PerfGlobalGroupMask + 1);
  LODWORD(v17) = KeGetPcr()->Prcb.Number;
  v18 = PoolTrackTableMask;
  v19 = PoolTrackTableSize;
  v20 = PoolTrackTableMask & 0x5DA6EBDA;
  v29 = PoolTrackTableSize;
  v21 = *((_QWORD *)&WheapDeferredInternalLogsEventLock + v17 + 372);
  v22 = PoolTrackTableMask & 0x5DA6EBDA;
  do
  {
    while( 1 )
    {
      v23 = 56i64 * v20;
      v24 = *(_DWORD *)(v23 + v21);
      if( v24 == 1953394499 )
      {
        _InterlockedIncrement64((volatile signed __int64 *)(v23 + v21 + 16));
        _InterlockedExchangeAdd64((volatile signed __int64 *)(v23 + v21 + 8), v15);
        return v8;
      }
      if( v24 )
        break;
      v25 = *(_DWORD *)(v23 + *(&WheapDeferredInternalLogsEventLock + 371));
      if( v25 )
      {
        *(_DWORD *)(v23 + v21) = v25;
      }
      else
      {
        if( v20 == v19 - 1 )
          break;
        KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&ExpTaggedPoolLock, &LockHandle);
        if( !*(_DWORD *)(v23 + *(&WheapDeferredInternalLogsEventLock + 371)) )
        {
          *(_DWORD *)(v23 + *(&WheapDeferredInternalLogsEventLock + 371)) = 1953394499;
          *(_DWORD *)(v23 + v21) = 1953394499;
        }
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
        __writecr8(LockHandle.OldIrql);
        v19 = v29;
      }
    }
    v20 = v18 & (v20 + 1);
  }
  while( v20 != v22 );
  ExpInsertPoolTrackerExpansion(0x746E6F43ui64, v15, NonPagedPoolNx);
  return v8;
}

Referenced by:

MiAllocateContiguousMemory