MiPopulateCombineMdls

INT64 __fastcall MiPopulateCombineMdls(INT64 a1, INT64 a2, INT64 a3){
  unsigned __int64 *v3; 
  _MI_PFN_CACHE_ATTRIBUTE CacheAttribute; 
  INT64 v5; 
  UINT16 IdealNode; 
  _MI_PARTITION *v8; 
  char *v9; 
  INT64 result; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  _QWORD **v13; 
  _MDL *PagesForMdl; 
  _QWORD *i; 
  UINT64 Flags; 
  v3 = (unsigned __int64 *)(a1 + 88);
  CacheAttribute = MiNonCached;
  v5 = a3 - a1;
  IdealNode = a2;
  v8 = **(_MI_PARTITION ***)a1;
  v9 = (char *)MiCombineMinimumPages - a1;
  result = 1048574i64;
  do
  {
    v11 = *(unsigned __int64 *)((char *)v3 + v5 - 88);
    if( v11 )
    {
      v12 = *v3;
      v13 = (_QWORD **)*(v3 - 3);
      if( v11 > 0xFFFFE )
        v11 = 1048574i64;
      if( !v12 || v12 < v11 )
      {
        if( (*(_DWORD *)(a1 + 60) & 2) != 0 && v11 < *(unsigned __int64 *)((char *)v3 + (_QWORD)v9 - 88) )
          v11 = *(unsigned __int64 *)((char *)v3 + (_QWORD)v9 - 88);
        LODWORD(Flags) = 19;
        PagesForMdl = MiAllocatePagesForMdl(
                        v8,
                        0i64,
                        (_LARGE_INTEGER)-1i64,
                        0i64,
                        (v11 - v12) << 12,
                        CacheAttribute,
                        IdealNode,
                        Flags);
        if( PagesForMdl )
        {
          *v3 += (unsigned __int64)PagesForMdl->ByteCount >> 12;
          if( *(v3 - 3) )
          {
            for( i = *v13; i; i = (_QWORD *)*i )
              v13 = (_QWORD **)i;
            *v13 = &PagesForMdl->Next;
          }
          else
          {
            *(v3 - 3) = (unsigned __int64)PagesForMdl;
          }
        }
        result = 1048574i64;
      }
    }
    ++CacheAttribute;
    ++v3;
  }
  while( (unsigned int)CacheAttribute < MiNotMapped );
  return result;
}

Referenced by:

MiProcessCrcList