ExAllocateContiguousHeapPool

INT64 __fastcall ExAllocateContiguousHeapPool(INT64 a1, UINT64 a2, INT64 a3, UINT64 a4, UINT64 a5){
  INT64 v6; 
  void *v8; 
  INT64 HeapFromType; 
  __int64 v10; 
  unsigned __int64 v11; 
  INT64 v13; 
  UINT64 v14; 
  VOID *v15; 
  __int64 v16; 
  int v17; 
  __int64 v18; 
  unsigned int v19; 
  UINT8 *v20; 
  int v21; 
  __int64 v22; 
  int v23; 
  int v24; 
  UINT64 v25; 
  INT64 v26; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  __int64 v28; 
  v6 = 0i64;
  v8 = 0i64;
  HeapFromType = ExGetHeapFromType(512i64, (unsigned int)a5, 0i64);
  if( v11 > *(_QWORD *)(*(_QWORD *)qword_140C4E388 + 6912i64)
    || a2 < *(_QWORD *)(*(_QWORD *)qword_140C4E388 + 6920i64)
    || (unsigned __int64)(v10 - 1) <= 0x1FE )
  {
    goto LABEL_3;
  }
  if( (*(_BYTE *)(HeapFromType + 269) & 7) == 0 || a4 >= *(unsigned int *)(HeapFromType + 464) )
    return v6;
  v13 = HeapFromType + 256;
  v14 = (a4 + 4095) & 0xFFFFFFFFFFFFF000ui64;
  if( v14 > *(unsigned int *)(HeapFromType + 272) )
    v13 = HeapFromType + 448;
  LODWORD(v25) = 0x800000;
  v15 = (VOID *)RtlpHpSegAlloc(v13, v14, v14, v14, v25);
  v8 = v15;
  if( !v15 )
    return v6;
  LOWORD(v26) = 0;
  if( !(unsigned int)ExpAddTagForBigPages(v15, 0x746E6F43ui64, v14, NonPagedPoolNx, v26, 0) )
  {
LABEL_3:
    if( v8 )
      RtlpHpFreeHeap((PVOID)HeapFromType, v8, 0i64);
    return v6;
  }
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( PoolHitTag == 1953394499 )
    __debugbreak();
  v16 = HIDWORD(PerfGlobalGroupMask);
  LODWORD(v16) = *((_DWORD *)KeGetPcr() + 105);
  v17 = PoolTrackTableMask;
  v18 = PoolTrackTableSize;
  v19 = PoolTrackTableMask & 0x5DA6EBDA;
  v28 = PoolTrackTableSize;
  v20 = (&ExPoolTagTables)[v16];
  v21 = PoolTrackTableMask & 0x5DA6EBDA;
  do
  {
    while( 1 )
    {
      v22 = 56i64 * v19;
      v23 = *(_DWORD *)&v20[v22];
      if( v23 == 1953394499 )
      {
        _InterlockedIncrement64((volatile signed __int64 *)&v20[v22 + 16]);
        _InterlockedExchangeAdd64((volatile signed __int64 *)&v20[v22 + 8], v14);
        return(INT64)v8;
      }
      if( v23 )
        break;
      v24 = *(_DWORD *)((char *)PoolTrackTable + v22);
      if( v24 )
      {
        *(_DWORD *)&v20[v22] = v24;
      }
      else
      {
        if( v19 == v18 - 1 )
          break;
        KeAcquireInStackQueuedSpinLock(&ExpTaggedPoolLock, &LockHandle);
        if( !*(_DWORD *)((char *)PoolTrackTable + v22) )
        {
          *(_DWORD *)((char *)PoolTrackTable + v22) = 1953394499;
          *(_DWORD *)&v20[v22] = 1953394499;
        }
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
        __writecr8(LockHandle.OldIrql);
        v18 = v28;
      }
    }
    v19 = v17 & (v19 + 1);
  }
  while( v19 != v21 );
  ExpInsertPoolTrackerExpansion(0x746E6F43ui64, v14, NonPagedPoolNx);
  return(INT64)v8;
}

Referenced by:

MiAllocateContiguousMemory