MiPfExecuteReadList

VOID __stdcall MiPfExecuteReadList(
        _MI_READ_LIST *ReadList,
        UINT64 ReadListFlags,
        UINT64 SessionId,
        VOID *AttributionContext){
  _ETHREAD *CurrentThread; 
  _MI_READ_LIST *v5; 
  _MI_READ_LIST *v6; 
  int v7; 
  unsigned __int8 CacheManagerActive; 
  unsigned int v9; 
  int v10; 
  _MDL *v11; 
  _FILE_OBJECT *v12; 
  __int64 v13; 
  NTSTATUS v14; 
  UINT64 Flags; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v5 = ReadList + 30;
  v6 = (_MI_READ_LIST *)*((_QWORD *)ReadList + 15);
  v7 = ReadListFlags & 2;
  CacheManagerActive = 0;
  v9 = SessionId;
  if( v6 != ReadList + 30 )
  {
    v10 = ReadListFlags & 1;
    do
    {
      v11 = (_MDL *)*((_QWORD *)v6 + 32);
      v11->MdlFlags |= 0x42u;
      v6[46] = v11->ByteCount;
      v12 = MiReferenceInPageFile((_MMINPAGE_SUPPORT *)v6, v9);
      if( v12 )
      {
        v13 = 0i64;
      }
      else
      {
        v13 = *((_QWORD *)v6 + 25);
        v12 = *(_FILE_OBJECT **)(v13 + 56);
      }
      *((_QWORD *)v6 + 25) = v12;
      *((_QWORD *)v6 + 21) = 0i64;
      *((_QWORD *)v6 + 29) = *((_QWORD *)v6 + 30);
      if( v10 )
      {
        CacheManagerActive = CurrentThread->CacheManagerActive;
        CurrentThread->CacheManagerActive = 1;
      }
      if( v13 && (*(_WORD *)(v13 + 204) & 0x800) != 0 )
      {
        v14 = 0;
      }
      else if( (v6[48] & 0x100) != 0 )
      {
        v14 = SmPageRead(
                (_MM_STORE_KEY *)v6 + 12,
                (_MDL *)((unsigned __int64)(v6 + 68) | ((-(__int64)(v7 != 0) & 0xFFFFFFFFFFFFFFFEui64) + 3)),
                (_KEVENT *)(v6 + 8),
                (_IO_STATUS_BLOCK *)v6 + 5);
      }
      else
      {
        LODWORD(Flags) = 6;
        MiPageRead(
          *((_FILE_OBJECT **)v6 + 25),
          v11,
          (_LARGE_INTEGER *)v6 + 12,
          (_KEVENT *)(v6 + 8),
          (_IO_STATUS_BLOCK *)v6 + 5,
          Flags,
          AttributionContext);
      }
      if( v10 )
        CurrentThread->CacheManagerActive = CacheManagerActive;
      if( v14 < 0 )
      {
        *((_QWORD *)v6 + 11) = 0i64;
        v6[20] = v14;
        KeSetEvent((PRKEVENT)(v6 + 8), 0, 0);
      }
      v6 = *(_MI_READ_LIST **)v6;
    }
    while( v6 != v5 );
  }
}

Referenced by:

MiPrefetchControlArea
MmPrefetchForCacheManager
MmPrefetchPagesEx