MiPfExecuteReadList

INT64 __fastcall MiPfExecuteReadList(INT64 a1, CHAR a2, UINT64 a3, VOID *a4){
  INT64 result; 
  _ETHREAD *CurrentThread; 
  INT64 v6; 
  __int64 v7; 
  int v8; 
  char v9; 
  unsigned int v10; 
  int v11; 
  _MDL *v12; 
  _FILE_OBJECT *v13; 
  __int64 v14; 
  UINT64 Flags; 
  void *retaddr; 
  result = (INT64)&retaddr;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v6 = a1 + 120;
  v7 = *(_QWORD *)(a1 + 120);
  v8 = a2 & 2;
  v9 = 0;
  v10 = a3;
  if( v7 != a1 + 120 )
  {
    v11 = a2 & 1;
    do
    {
      v12 = *(_MDL **)(v7 + 256);
      v12->MdlFlags |= 0x42u;
      *(_DWORD *)(v7 + 184) = v12->ByteCount;
      v13 = MiReferenceInPageFile(v7, v10);
      if( v13 )
      {
        v14 = 0i64;
      }
      else
      {
        v14 = *(_QWORD *)(v7 + 200);
        v13 = *(_FILE_OBJECT **)(v14 + 56);
      }
      *(_QWORD *)(v7 + 200) = v13;
      *(_QWORD *)(v7 + 168) = 0i64;
      *(_QWORD *)(v7 + 232) = *(_QWORD *)(v7 + 240);
      if( v11 )
      {
        v9 = *((_BYTE *)CurrentThread + 1308);
        *((_BYTE *)CurrentThread + 1308) = 1;
      }
      if( v14 && (*(_WORD *)(v14 + 204) & 0x800) != 0 )
      {
        result = 0i64;
      }
      else if( (*(_DWORD *)(v7 + 192) & 0x100) != 0 )
      {
        result = SmPageRead(
                   (union MM_STORE_KEY *)(v7 + 96),
                   (v7 + 272) | ((-(__int64)(v8 != 0) & 0xFFFFFFFFFFFFFFFEui64) + 3));
      }
      else
      {
        LODWORD(Flags) = 6;
        MiPageRead(
          *(_FILE_OBJECT **)(v7 + 200),
          v12,
          (_LARGE_INTEGER *)(v7 + 96),
          (_KEVENT *)(v7 + 32),
          (_IO_STATUS_BLOCK *)(v7 + 80),
          Flags,
          a4);
      }
      if( v11 )
        *((_BYTE *)CurrentThread + 1308) = v9;
      if( (int)result < 0 )
      {
        *(_QWORD *)(v7 + 88) = 0i64;
        *(_DWORD *)(v7 + 80) = result;
        LODWORD(result) = KeSetEvent((PRKEVENT)(v7 + 32), 0);
      }
      v7 = *(_QWORD *)v7;
    }
    while( v7 != v6 );
  }
  return result;
}

Referenced by:

MiPrefetchControlArea
MmPrefetchForCacheManager
MmPrefetchPagesEx