MiAllocatePagesForMdl
_MDL *__stdcall MiAllocatePagesForMdl(
_MI_PARTITION *Partition,
_LARGE_INTEGER LowAddress,
_LARGE_INTEGER HighAddress,
_LARGE_INTEGER SkipBytes,
UINT64 TotalBytes,
_MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
UINT16 IdealNode,
UINT64 Flags){
LARGE_INTEGER PerformanceCounter;
EVENT_DESCRIPTOR *v13;
unsigned __int64 v14;
_MI_PFN_CACHE_ATTRIBUTE v15;
_DWORD *v16;
unsigned int v17;
MDL *v18;
_MI_PFN_CACHE_ATTRIBUTE v19;
UINT64 v20;
int v21;
PVOID v22;
int v24;
LPCGUID ActivityId;
LPCGUID RelatedActivityId;
INT64 UserDataCount;
UINT64 UserDataCounta;
PEVENT_DATA_DESCRIPTOR UserData;
PEVENT_DATA_DESCRIPTOR UserDataa;
INT64 v31;
UINT16 v32;
int v33;
INT64 result;
UINT64 Flagsa;
unsigned __int64 v36;
PVOID P;
__int64 v38[6];
int v39;
int v40;
EVENT_DATA_DESCRIPTOR v41;
memset((INT64)&result, 0i64);
PerformanceCounter = KeQueryPerformanceCounter(0i64);
LODWORD(v31) = Flags;
LODWORD(UserData) = IdealNode;
LODWORD(UserDataCount) = CacheAttribute;
if( (int)MiValidateMdlAllocationRequest(
(INT64)&result,
(INT64)Partition,
LowAddress.QuadPart,
HighAddress.QuadPart,
SkipBytes.QuadPart,
TotalBytes,
UserDataCount,
(INT64)UserData,
v31) >= 0
&& (int)MiObtainMdlCharges((INT64)&result) >= 0 )
{
v16 = P;
v41.Ptr = v36;
*((_DWORD *)P + 10) = 0;
v17 = 0;
while( 1 )
{
v33 = v16[10];
MiFindPagesForMdl(
(_MI_PARTITION *)&result,
(_MDL *)v14,
(UINT64)v13,
v15,
(UINT64)ActivityId,
(UINT64)RelatedActivityId,
UserDataCounta,
(UINT64)UserDataa,
v32);
v14 = (unsigned int)v16[10];
if( v14 >> 12 == v41.Ptr )
break;
v24 = Flagsa;
if( (Flagsa & 0x80u) == 0i64 )
goto LABEL_21;
if( v33 == (_DWORD)v14 )
{
if( v17 > 3 || KeGetCurrentIrql() >= 2u || (Flagsa & 8) != 0 )
{
LABEL_21:
MiReturnMdlExcess((INT64)&result);
break;
}
KeDelayExecutionThread(0, 0, (PLARGE_INTEGER)&Mi10Milliseconds);
v24 = Flagsa;
++v17;
}
else
{
v17 = 0;
}
LODWORD(Flagsa) = v24 & 0xFFFEFFFF;
}
v18 = (MDL *)P;
if( P )
{
if( (Flags & 0x40) == 0 )
{
MiInitializeMdlBatchPages((INT64)&result);
MiInitializeMdlPages(v18, (unsigned int)Flagsa, v19, v20, (UINT64)ActivityId);
}
if( (Flagsa & 0x100) != 0 )
P = MiRemoveMdlPages(v18, (unsigned int)Flagsa);
}
}
v21 = Flagsa;
v22 = P;
if( EtwEventEnabled(EtwpMemoryProvRegHandle, (EVENT_DESCRIPTOR *)&KERNEL_MEM_EVENT_MDL_ALLOCATION, v13) )
{
v38[0] = EtwpGetDurationSince(PerformanceCounter.QuadPart);
v38[1] = TotalBytes;
v38[5] = (__int64)v22;
v41.Ptr = (unsigned __int64)v38;
LODWORD(UserDataCounta) = 1;
v38[2] = LowAddress.QuadPart;
v38[3] = HighAddress.QuadPart;
v38[4] = SkipBytes.QuadPart;
v39 = IdealNode;
v40 = v21;
*(_QWORD *)&v41.Size = 56i64;
EtwWriteEx(
EtwpMemoryProvRegHandle,
(EVENT_DESCRIPTOR *)&KERNEL_MEM_EVENT_MDL_ALLOCATION,
0i64,
1ui64,
0i64,
0i64,
UserDataCounta,
&v41);
}
return(_MDL *)P;
}Referenced by:
MiAllocatePartitionPhysicalPages
MiAllocateUserPhysicalPages
MiPopulateCombineMdls
MmAllocateNonCachedMemory
MmAllocatePagesForMdl
MmAllocatePartitionNodePagesForMdlEx