MiPfAllocateMdls

NTSTATUS __stdcall MiPfAllocateMdls(_MI_READ_LIST *MiReadList, UINT64 SessionId, VOID *SystemCacheAddress){
  _MI_READ_LIST v4; 
  _FILE_OBJECT *v5; 
  _CONTROL_AREA *v6; 
  _MI_READ_LIST *v7; 
  unsigned __int64 v8; 
  _MI_READ_LIST *v9; 
  _MI_READ_LIST *v10; 
  _SUBSECTION *v11; 
  _MI_READ_LIST *v12; 
  NTSTATUS v13; 
  __int64 v14; 
  __int64 v15; 
  unsigned __int64 v16; 
  _MMPTE *v18; 
  unsigned __int64 v19; 
  _MMINPAGE_SUPPORT *v20; 
  _MMINPAGE_SUPPORT *v21; 
  _MDL *v22; 
  UINT64 v23; 
  _SUBSECTION *v24; 
  __int64 *v25; 
  unsigned int v26; 
  unsigned __int64 SubsectionBase; 
  _LARGE_INTEGER v28; 
  ULONG LowPart; 
  _MDL *v30; 
  _MI_READ_LIST **v31; 
  _MI_PER_SESSION_PROTOS *SubsectionDriverProtos; 
  unsigned __int64 v33; 
  NTSTATUS v34; 
  unsigned int v35; 
  __int64 v36; 
  _RTL_BALANCED_NODE *SharedProtos; 
  _RTL_BALANCED_NODE *v38; 
  _MMPTE *v39; 
  _SUBSECTION *Subsection; 
  _MI_READ_LIST *v41; 
  _MI_READ_LIST *v42; 
  _MDL *p_Mdl; 
  unsigned int FinalPriority; 
  unsigned int FinalPriority_4; 
  __int64 *v46; 
  _MMPTE *v47; 
  _CONTROL_AREA *ControlArea; 
  _MMINPAGE_SUPPORT *v49; 
  _MI_READ_LIST *v50; 
  unsigned __int64 v51; 
  unsigned int SessionIda; 
  unsigned int v55; 

  SessionIda = SessionId;
  FinalPriority = MiReadList[20];
  v4 = MiReadList[21];
  v5 = 0i64;
  v6 = (_CONTROL_AREA *)*((_QWORD *)MiReadList + 1);
  v7 = 0i64;
  v55 = 0;
  v8 = 0i64;
  v46 = 0i64;
  v47 = 0i64;
  v9 = (_MI_READ_LIST *)*((_QWORD *)MiReadList + 12);
  v10 = &MiReadList[2 * MiReadList[23] + 34];
  FinalPriority_4 = v4;
  ControlArea = v6;
  v50 = v10;
  v41 = v9;
  if( v9 >= v10 )
    return 0;
  v11 = (_SUBSECTION *)&v6[1];
  v12 = v9 + 2;
  v42 = v9 + 2;
  if( *((_QWORD *)MiReadList + 2) )
    v11 = (_SUBSECTION *)*((_QWORD *)MiReadList + 2);
  v13 = 0;
  Subsection = v11;
  while( 1 )
  {
    v14 = *(_QWORD *)v9;
    v15 = (*(_QWORD *)v9 >> 2) & 0x3FFFFFFFi64;
    if( (*(_QWORD *)v9 & 2) != 0 )
      break;
LABEL_6:
    if( (v14 & 1) != 0 )
    {
      if( v15 )
      {
        v33 = v14 & 0xFFFFFFFFFFFFFFFCui64;
        if( v5 )
        {
          if( (__int64)(v33 - v8) >> 3 > *(&stru_140C4DB30 + 947) )
            goto LABEL_17;
        }
        else
        {
          v7 = v9;
          v47 = (_MMPTE *)v9;
        }
        v5 = (_FILE_OBJECT *)v9;
        v8 = v33;
      }
      if( v5 )
        goto LABEL_18;
    }
    else
    {
      v16 = v14 & 0xFFFFFFFFFFFFFFFCui64;
      if( v5 )
      {
        if( (__int64)(v16 - v8) >> 3 > *(&stru_140C4DB30 + 947) )
          goto LABEL_17;
      }
      else
      {
        v7 = v9;
        v47 = (_MMPTE *)v9;
      }
      v5 = (_FILE_OBJECT *)v9;
      v8 = v16;
      if( v12 == v10 )
        goto LABEL_18;
    }
LABEL_10:
    v9 += 2;
    v12 += 2;
    v41 = v9;
    v42 = v12;
    if( v9 >= v10 )
      return v13;
  }
  if( !v5 )
  {
    if( !v15 )
      goto LABEL_10;
    goto LABEL_6;
  }
  if( !v15 )
    goto LABEL_18;
LABEL_17:
  v41 = v9 - 2;
  v42 = v12 - 2;
LABEL_18:
  v51 = *(_QWORD *)&v5->Type & 0xFFFFFFFFFFFFFFFCui64;
  v18 = (_MMPTE *)(*(_QWORD *)v7 & 0xFFFFFFFFFFFFFFFCui64);
  v19 = ((__int64)(v51 - (_QWORD)v18) >> 3) + 1;
  MiGetInPageSupportBlock();
  v49 = v20;
  v21 = v20;
  if( !v20 )
    return -1073741670;
  v20->Pfn = 0i64;
  MiSetInPagePriority(v20, FinalPriority_4, FinalPriority);
  v23 = v19 << 12;
  if( v19 <= 0x10 )
  {
    p_Mdl = &v21->Mdl;
    v21->Mdl.Size = 8 * (((__int64)(v51 - (_QWORD)v18) >> 3) + 7);
    v21->Mdl.Next = v22;
    v21->Mdl.MdlFlags = (__int16)v22;
    v21->Mdl.StartVa = v22;
    v21->Mdl.ByteOffset = (unsigned int)v22;
    v21->Mdl.ByteCount = v23;
    goto LABEL_21;
  }
  p_Mdl = MmCreateMdl(0i64, 0i64, v23);
  if( p_Mdl )
  {
LABEL_21:
    v24 = Subsection;
    v25 = v46;
    v26 = v55;
    while( 1 )
    {
      SubsectionBase = (unsigned __int64)v24->SubsectionBase;
      if( (unsigned __int64)v18 >= SubsectionBase
        && (unsigned __int64)v18 < SubsectionBase + 8i64 * v24->PtesInSubsection )
      {
        break;
      }
      if( (v24->u.SubsectionFlags._bf_2 & 2) != 0 && (ControlArea->u.LongFlags & 0x4000000) != 0 )
      {
        if( v24->GlobalPerSessionHead.Root )
        {
          SharedProtos = MiGetSharedProtos(ControlArea, SessionIda, v24);
          if( SharedProtos )
          {
            v38 = SharedProtos[3].Children[0];
            if( v18 >= (_MMPTE *)v38 && v18 < (_MMPTE *)&v38->Children[v24->PtesInSubsection] )
              break;
          }
        }
      }
      if( (ControlArea->u.LongFlags & 0x20) != 0 )
      {
        SubsectionDriverProtos = MiGetSubsectionDriverProtos(v24);
        if( SubsectionDriverProtos )
        {
          v39 = SubsectionDriverProtos->SubsectionBase;
          if( v18 >= v39 && v18 < &v39[v24->PtesInSubsection] )
            break;
        }
      }
      if( *((_QWORD *)MiReadList + 2) )
      {
        if( v25 )
        {
          if( v26 >= *((_DWORD *)v25 + 4) )
          {
            v25 = (__int64 *)*v25;
            v26 = 1;
            v24 = (_SUBSECTION *)v25[3];
          }
          else
          {
            v36 = v26++;
            v24 = (_SUBSECTION *)v25[v36 + 3];
          }
        }
        else
        {
          v25 = (__int64 *)*((_QWORD *)MiReadList + 3);
          v26 = 1;
          v24 = (_SUBSECTION *)v25[3];
        }
      }
      else
      {
        v24 = v24->NextSubsection;
      }
    }
    v55 = v26;
    v46 = v25;
    Subsection = v24;
    v28.anonymous_0.LowPart = MiStartingOffset(v24, v18, SessionIda);
    LowPart = v28.anonymous_0.LowPart;
    v9 = v41;
    v12 = v42;
    v10 = v50;
    v8 = v51;
    v49->ReadOffset = v28;
    if( (v5->Type & 1) != 0 && (ControlArea->u.LongFlags & 0x20) != 0 )
    {
      v34 = MiEndingOffsetWithLock(Subsection);
      v30 = p_Mdl;
      v35 = v34 - LowPart;
      if( v35 <= p_Mdl->ByteCount )
        p_Mdl->ByteCount = (v35 + 511) & 0xFFFFFE00;
    }
    else
    {
      v30 = p_Mdl;
    }
    v7 = (_MI_READ_LIST *)v47;
    v49->BasePte = v47;
    v49->FilePointer = v5;
    v49->ControlArea = ControlArea;
    v49->FaultingAddress = SystemCacheAddress;
    if( SystemCacheAddress )
      v49->u1.e1._bf_0 |= 0x8000u;
    v49->PrefetchMdl = v30;
    v31 = (_MI_READ_LIST **)*((_QWORD *)MiReadList + 16);
    if( *v31 != MiReadList + 30 )
      __fastfail(3u);
    *(_QWORD *)v49->gap0 = MiReadList + 30;
    *(_QWORD *)&v49->gap0[8] = v31;
    *v31 = (_MI_READ_LIST *)v49;
    *((_QWORD *)MiReadList + 16) = v49;
    ++MiReadList[27];
    v13 = 0;
    v5 = 0i64;
    goto LABEL_10;
  }
  MiFreeInPageSupportBlock(v21);
  return -1073741670;
}

Referenced by:

MiPfPrepareReadList
MiPfPrepareSequentialReadList