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