MiRemoveMdlPages
_MDL *__stdcall MiRemoveMdlPages(PVOID MemoryDescriptorList, UINT64 Flags){
__int64 *v2;
unsigned __int64 v3;
_MDL *v4;
__int64 *v5;
__int64 v6;
int v7;
UINT64 v8;
__int64 v9;
UINT64 v10;
__int64 v11;
bool v12;
int v13;
_MMPFN *v14;
UINT64 v15;
UINT64 v16;
UINT64 ReferenceCount;
unsigned int v20;
int v21;
__int64 *v22;
v20 = Flags;
v2 = (__int64 *)((char *)MemoryDescriptorList + 48);
v3 = (unsigned __int64)*((unsigned int *)MemoryDescriptorList + 10) >> 12;
v4 = (_MDL *)MemoryDescriptorList;
v5 = (__int64 *)((char *)MemoryDescriptorList + 8 * v3 + 48);
v22 = v5;
MiSortMdlFrames((INT64)MemoryDescriptorList);
v6 = -1i64;
v7 = 0;
v21 = 0;
v8 = 0i64;
v9 = 0i64;
v10 = -1i64;
v11 = -1i64;
v12 = v2 == v5;
if( v2 <= v5 )
{
do
{
if( v12 || (v6 = *v2, *v2 != v11) )
{
if( v8 )
{
if( v7 < 0 || (MiRemovePhysicalMemory(v10, v8, HIWORD(v20) & 8), v21 = v13, v7 = v13, v13 < 0) )
{
v14 = &MmGetPfnDb()[v10];
v15 = v8;
do
{
LODWORD(ReferenceCount) = 2;
MiSetPfnOwnedAndActive(
v14,
0i64,
(_MMPTE *)0xFFFFFFFFFFFFFFF8i64,
(_MI_PFN_CACHE_ATTRIBUTE)(*((unsigned __int8 *)&v14->u3 + 2) >> 6),
ReferenceCount);
++v14;
--v15;
}
while( v15 );
v5 = v22;
MiFreeContiguousPages((_MI_PARTITION *)v10, v8, v16);
v7 = v21;
v9 += v8;
}
}
v10 = v6;
v8 = 1i64;
}
else
{
++v8;
}
++v2;
v11 = v6 + 1;
v12 = v2 == v5;
}
while( v2 <= v5 );
v4 = (_MDL *)MemoryDescriptorList;
}
_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 569, -(__int64)v3);
if( v9 )
{
if( v9 == v3 )
{
ExFreePoolWithTag(v4, 0);
return 0i64;
}
else
{
v4->ByteCount += -4096 * v9;
}
}
return v4;
}Referenced by:
MiAllocatePagesForMdl