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