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