MiFreeMdlPageRun

UINT64 __stdcall MiFreeMdlPageRun(UINT64 BasePage, UINT64 PageCount, UINT64 Flags){
  UINT64 v3; 
  int v4; 
  UINT64 v5; 
  unsigned int v6; 
  UINT64 v7; 
  __int64 v9; 
  unsigned __int64 v10; 
  UINT64 v11; 
  UINT64 v13; 
  v3 = -1i64;
  v4 = Flags & 1;
  v5 = 0i64;
  v6 = Flags;
  v7 = PageCount;
  while( v7 )
  {
    if( (BasePage & 0xF) == 0 )
    {
      v9 = (KeFeatureBits & 0x2000000000i64) == 0;
      while( 1 )
      {
        v10 = MiLargePageSizes[v9];
        if( ((v10 - 1) & BasePage) == 0
          && v7 >= v10
          && (unsigned int)MiResidentPageDangleFree(BasePage, (unsigned int)v9) )
        {
          break;
        }
        v9 = (unsigned int)(v9 + 1);
        if( (unsigned int)v9 >= 3 )
          goto LABEL_10;
      }
      v5 += MiFreeLargePageMemory(BasePage, v11, (unsigned int)(v4 + 6));
      BasePage += v10;
      v7 -= v10;
      if( (unsigned int)v9 < 3 )
        continue;
    }
LABEL_10:
    if( v3 != (BasePage & 0xFFFFFFFFFFFFFE00ui64) )
    {
      v3 = BasePage & 0xFFFFFFFFFFFFFE00ui64;
      LODWORD(v13) = 0;
      MiUpdateLargePageBitMap(
        *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)MmGetPfnDb() + 6 * BasePage + 5) >> 39) & 0x3FFi64)),
        BasePage & 0xFFFFFFFFFFFFFE00ui64,
        0x200ui64,
        0i64,
        v13);
    }
    v5 += MiFreeSmallPageFromMdl(BasePage++, v6);
    --v7;
  }
  return v5;
}

Referenced by:

MiAllocatePartitionPhysicalPages
MiDeleteAweInfoPages
MiFreePagesFromMdl
MiFreePartitionPageRun