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