MiAllocateContiguousMemory
VOID __fastcall MiAllocateContiguousMemory(
UINT64 NumberOfBytes,
UINT64 LowestPage,
UINT64 HighestPage,
UINT64 BoundaryPage,
UINT64 ProtectionMask,
UINT64 PreferredNode,
UINT64 CatchOverruns){
UINT64 v9;
LARGE_INTEGER PerformanceCounter;
unsigned int v11;
PHYSICAL_ADDRESS PhysicalAddress;
LARGE_INTEGER v13;
_BOOL8 v14;
unsigned __int64 ContiguousHeapPool;
UINT64 v16;
int v17;
unsigned int v18;
char v19;
UINT64 v20;
_MI_PFN_CACHE_ATTRIBUTE v21;
unsigned int v22;
unsigned int v23;
_DWORD *v24;
__int64 v25;
_DWORD *v26;
int i;
VOID *v28;
UINT64 v29;
char *v30;
char *v31;
char *v32;
unsigned __int64 v33;
char *v34;
UINT64 v35;
LPCGUID ActivityId;
LPCGUID ActivityIda;
UINT64 UserDataCount;
PEVENT_DATA_DESCRIPTOR UserData;
PEVENT_DATA_DESCRIPTOR UserDataa;
UINT64 Flags;
UINT64 Flagsa;
unsigned __int8 v43;
unsigned int v44;
unsigned int v45;
int v47;
_MI_PFN_CACHE_ATTRIBUTE v48;
POOL_TYPE PoolType;
BOOL GuardPte;
_DWORD *v53;
LARGE_INTEGER v55;
__int64 v56[7];
int v57;
unsigned int v58;
unsigned int v59;
EVENT_DATA_DESCRIPTOR v60;
v9 = LowestPage;
v44 = ProtectionMask;
PerformanceCounter = KeQueryPerformanceCounter(0i64);
v11 = ProtectionMask;
PhysicalAddress.QuadPart = -1i64;
v55 = PerformanceCounter;
v13 = PerformanceCounter;
v14 = MmProtectFreedNonPagedPool != 0;
GuardPte = MmProtectFreedNonPagedPool != 0;
ContiguousHeapPool = 0i64;
v16 = (NumberOfBytes >> 12) + ((NumberOfBytes & 0xFFF) != 0);
if( (ProtectionMask & 2) != 0 && (MiFlags & 0x10000) != 0 )
{
v11 = ProtectionMask & 0xFFFFFFFD;
v44 = ProtectionMask & 0xFFFFFFFD;
}
if( !BoundaryPage || (v17 = 0, v16 <= BoundaryPage) )
{
v17 = 0;
if( v9 <= HighestPage && v9 + v16 > v9 && v9 + v16 - 1 <= HighestPage )
{
v21 = (unsigned int)MiProtectionToCacheAttribute(v11);
v22 = PreferredNode;
v48 = v21;
if( (unsigned __int16)KeNumberNodes <= 1u )
v22 = v18;
v45 = v22;
if( v22 == 0x80000000 )
{
v23 = *(unsigned __int16 *)(*((_QWORD *)*(&KiProcessorBlock + *((unsigned int *)KeGetCurrentThread() + 147)) + 24)
+ 146i64);
}
else
{
v23 = v22;
if( v22 >= (unsigned __int16)KeNumberNodes )
goto LABEL_31;
}
v24 = (_DWORD *)(qword_140C4DBD8 + 4i64 * v23 * (unsigned __int16)KeNumberNodes);
if( v22 == 0x80000000 )
v25 = (unsigned __int16)KeNumberNodes;
else
v25 = 1i64;
v53 = &v24[v25];
PoolType = NonPagedPoolNx;
if( (v19 & 2) != 0 )
{
PoolType = NonPagedPool;
}
else if( !v14 && v21 == MiCached && !MmProtectFreedNonPagedPool && v16 <= 0x200 )
{
while( 1 )
{
LODWORD(ActivityId) = *v24;
ContiguousHeapPool = ExAllocateContiguousHeapPool(
LowestPage,
v20,
BoundaryPage,
NumberOfBytes,
(UINT64)ActivityId);
if( ContiguousHeapPool )
break;
v20 = HighestPage;
if( ++v24 == v53 )
{
v21 = v48;
goto LABEL_20;
}
}
v17 = 1;
goto LABEL_31;
}
LABEL_20:
v47 = 135266304;
v26 = (_DWORD *)(qword_140C4DBD8 + 4i64 * v23 * (unsigned __int16)KeNumberNodes);
LODWORD(Flags) = 135266304;
LODWORD(UserData) = 0x80000000;
LODWORD(UserDataCount) = *v26;
for( i = MiFindContiguousPages(
(_MI_PARTITION *)&MiSystemPartition,
LowestPage,
v20,
BoundaryPage,
v16,
v21,
UserDataCount,
(UINT64)UserData,
Flags,
0i64);
i < 0;
i = MiFindContiguousPages(
(_MI_PARTITION *)&MiSystemPartition,
LowestPage,
HighestPage,
BoundaryPage,
v16,
v48,
UserDataCount,
(UINT64)UserDataa,
Flagsa,
0i64) )
{
if( ++v26 == v53 )
goto LABEL_49;
LODWORD(UserDataa) = 0x80000000;
LODWORD(UserDataCount) = *v26;
v47 &= ~0x8000000u;
LODWORD(Flagsa) = v47;
}
v28 = MiMapContiguousMemory((LARGE_INTEGER)-4096i64, v16 << 12, v44, GuardPte);
ContiguousHeapPool = (unsigned __int64)v28;
if( v28 )
{
LODWORD(ActivityIda) = GuardPte;
if( !(unsigned int)ExInsertPoolTag(v29, v28, v16 << 12, PoolType, (UINT64)ActivityIda) )
{
v35 = (v16 << 12) + 4096;
if( !GuardPte )
v35 = v16 << 12;
MmUnmapIoSpace((PVOID)ContiguousHeapPool, v35);
ContiguousHeapPool = 0i64;
}
}
v30 = (char *)MmGetPfnDb() - 48;
v31 = &v30[48 * v16];
if( ContiguousHeapPool )
v32 = (char *)MmGetPteBase() + ((ContiguousHeapPool >> 9) & 0x7FFFFFFFF8i64);
else
v32 = 0i64;
do
{
v43 = MiLockPageInline((INT64)v30);
v33 = *((_QWORD *)v30 + 5) & 0xFFFFFFF000000000ui64 | 0xFFFFFFFFDi64;
*((_QWORD *)v30 + 1) = v32;
*((_QWORD *)v30 + 5) = v33;
_InterlockedAnd64((volatile signed __int64 *)v30 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v43);
v34 = v32;
v30 += 48;
v32 += 8;
if( !v34 )
v32 = 0i64;
}
while( v30 < v31 );
v13 = v55;
if( ContiguousHeapPool )
{
v22 = v45;
v17 = 0;
goto LABEL_31;
}
v22 = v45;
LABEL_49:
v17 = 0;
LABEL_31:
v9 = LowestPage;
goto LABEL_32;
}
}
v22 = PreferredNode;
LABEL_32:
if( EtwEventEnabled(
EtwpMemoryProvRegHandle,
(EVENT_DESCRIPTOR *)&KERNEL_MEM_EVENT_CONT_ALLOCATION,
(EVENT_DESCRIPTOR *)v14) )
{
if( ContiguousHeapPool )
PhysicalAddress = MmGetPhysicalAddress((PVOID)ContiguousHeapPool);
v56[0] = EtwpGetDurationSince(v13.QuadPart);
v56[3] = HighestPage << 12;
v56[4] = BoundaryPage << 12;
v58 = v44;
v56[1] = NumberOfBytes;
v60.Ptr = (unsigned __int64)v56;
LODWORD(UserDataCount) = 1;
v56[6] = ContiguousHeapPool;
v56[5] = PhysicalAddress.QuadPart;
v56[2] = v9 << 12;
v57 = v17;
v59 = v22;
*(_QWORD *)&v60.Size = 68i64;
EtwWriteEx(
EtwpMemoryProvRegHandle,
(EVENT_DESCRIPTOR *)&KERNEL_MEM_EVENT_CONT_ALLOCATION,
0i64,
1ui64,
0i64,
0i64,
UserDataCount,
&v60);
}
}Referenced by:
MmAllocateContiguousMemory
MmAllocateContiguousNodeMemory