MiPopulateCombineMdls
INT64 __fastcall MiPopulateCombineMdls(INT64 a1, INT64 a2, INT64 a3){
unsigned __int64 *v3;
_MI_PFN_CACHE_ATTRIBUTE CacheAttribute;
INT64 v5;
UINT16 IdealNode;
_MI_PARTITION *v8;
char *v9;
INT64 result;
unsigned __int64 v11;
unsigned __int64 v12;
_QWORD **v13;
_MDL *PagesForMdl;
_QWORD *i;
UINT64 Flags;
v3 = (unsigned __int64 *)(a1 + 88);
CacheAttribute = MiNonCached;
v5 = a3 - a1;
IdealNode = a2;
v8 = **(_MI_PARTITION ***)a1;
v9 = (char *)MiCombineMinimumPages - a1;
result = 1048574i64;
do
{
v11 = *(unsigned __int64 *)((char *)v3 + v5 - 88);
if( v11 )
{
v12 = *v3;
v13 = (_QWORD **)*(v3 - 3);
if( v11 > 0xFFFFE )
v11 = 1048574i64;
if( !v12 || v12 < v11 )
{
if( (*(_DWORD *)(a1 + 60) & 2) != 0 && v11 < *(unsigned __int64 *)((char *)v3 + (_QWORD)v9 - 88) )
v11 = *(unsigned __int64 *)((char *)v3 + (_QWORD)v9 - 88);
LODWORD(Flags) = 19;
PagesForMdl = MiAllocatePagesForMdl(
v8,
0i64,
(_LARGE_INTEGER)-1i64,
0i64,
(v11 - v12) << 12,
CacheAttribute,
IdealNode,
Flags);
if( PagesForMdl )
{
*v3 += (unsigned __int64)PagesForMdl->ByteCount >> 12;
if( *(v3 - 3) )
{
for( i = *v13; i; i = (_QWORD *)*i )
v13 = (_QWORD **)i;
*v13 = &PagesForMdl->Next;
}
else
{
*(v3 - 3) = (unsigned __int64)PagesForMdl;
}
}
result = 1048574i64;
}
}
++CacheAttribute;
++v3;
}
while( (unsigned int)CacheAttribute < MiNotMapped );
return result;
}Referenced by:
MiProcessCrcList