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