PfpPrefetchFilesTrickle

__int64 __fastcall PfpPrefetchFilesTrickle(_QWORD *a1){
  __int64 v1; 
  unsigned int v3; 
  unsigned int v4; 
  __int64 v5; 
  unsigned int v6; 
  int *v7; 
  int v8; 
  CHAR v9; 
  int v10; 
  int v11; 
  bool v12; 
  __int64 result; 
  INT64 v14; 
  unsigned int v15; 
  unsigned int v16; 
  unsigned int v17; 
  NTSTATUS v18; 
  int v19; 
  int v20; 
  unsigned int v21; 
  unsigned int v22; 
  INT64 v23; 
  __int64 v24; 
  __int64 v25; 
  _READ_LIST *ReadLists; 
  __int64 v27; 
  INT64 a5[2]; 
  __int128 v29; 
  __int128 v30; 
  __int64 v31; 
  char v32; 
  int v33; 
  int v34; 
  unsigned int SublistMax; 
  v1 = *a1;
  v31 = 0i64;
  v3 = 0;
  *(_OWORD *)a5 = 0i64;
  v4 = 0;
  v29 = 0i64;
  v30 = 0i64;
  v32 = 0;
  v34 = 0;
  SublistMax = *(unsigned __int16 *)(*a1 + 30i64);
  v27 = ((KUSER_SHARED_DATA.TickCountMultiplier * KUSER_SHARED_DATA.TickCount.High1Time) << 8)
      + (unsigned int)((KUSER_SHARED_DATA.TickCount.LowPart * (unsigned __int64)KUSER_SHARED_DATA.TickCountMultiplier) >> 24);
  while( v4 < *(_DWORD *)(v1 + 8) )
  {
    if( (*(_QWORD *)(((unsigned __int64)v4 << 6) + a1[2] + 24) & 0x400000000i64) == 0 )
      goto LABEL_14;
    v5 = *(_QWORD *)(v1 + 32);
    v25 = 5i64 * v4;
    v6 = 0;
    v22 = 0;
    v24 = v5;
    if( (*(_DWORD *)(v5 + 40i64 * v4 + 12) & 0xFFFFFFFE) == 0 )
      goto LABEL_14;
    do
    {
      v7 = (int *)(*(_QWORD *)(v5 + 8 * v25 + 16) + 48i64 * v6);
      v8 = *v7;
      if( (*v7 & 2) != 0 || !v7[4] )
        goto LABEL_13;
      v9 = 0;
      while( !v9 )
      {
        if( (v8 & 1) == 0 )
          goto LABEL_17;
LABEL_9:
        LOBYTE(v10) = v8;
LABEL_10:
        ++v9;
        LOBYTE(v11) = v10;
        if( (unsigned __int8)v9 > 1u )
          goto LABEL_11;
      }
      if( (v8 & 1) == 0 )
        goto LABEL_9;
LABEL_17:
      PfpReadSupportInitialize((INT64)a5);
      if( (int)PfpFileBuildReadSupport(a1, v7, v4, v9, (INT64)a5) >= 0 )
      {
        v14 = a5[0];
        v23 = a5[0];
        v15 = 0;
        ReadLists = (_READ_LIST *)a5[0];
        *(_QWORD *)a5[0] = v29;
        v21 = *(_DWORD *)(v14 + 8);
        v33 = 0;
        MmQueryMemoryListInformation((PVOID)0xFFFFFFFFFFFFFFFFi64, (UINT64)(a1 + 6), (UINT64 *)0xB0);
        if( v21 )
        {
          while( !PfpCheckPrefetchAbort(a1) && a1[6] + a1[7] + PfpGetPageListCount(a1 + 11, 0i64, SublistMax) >= 0x80 )
          {
            if( v15 + 16 > v16 )
              v17 = v16 - v15;
            else
              v17 = 16;
            *(_DWORD *)(v23 + 8) = v17;
            memmove((UINT8 *)(v23 + 16), (UINT8 *)(v23 + 16 + 8i64 * v15), 8i64 * v17);
            *(_QWORD *)(v23 + 16) |= (8 * (SublistMax & 7)) | (unsigned __int64)(*(_DWORD *)(*a1 + 28i64) & 7);
            v18 = MmPrefetchPagesEx(1ui64, &ReadLists, 0i64);
            PfpUpdateRepurposedByPrefetch((_SYSTEM_MEMORY_LIST_INFORMATION *)(a1 + 6), *(unsigned int *)(v23 + 8));
            v19 = v33;
            if( v18 >= 0 )
            {
              v20 = *(_DWORD *)(v23 + 8);
              v19 = v20 + v33;
              v15 += v20;
              v33 += v20;
              if( v15 < v21 )
                continue;
            }
            v4 = v34;
            goto LABEL_26;
          }
          v4 = v34;
          v19 = v33;
          v32 = 1;
        }
        else
        {
          v19 = 0;
        }
LABEL_26:
        if( v9 )
          *(_DWORD *)(v1 + 100) += v19;
        else
          *(_DWORD *)(v1 + 96) += v19;
      }
      PfpReadSupportCleanup(a1[5], (INT64)a5);
      if( v32 || PfpCheckPrefetchAbort(a1) )
      {
        v3 = -1073741248;
        goto LABEL_15;
      }
      v8 = *v7;
      v10 = *v7;
      v11 = *v7;
      if( (*v7 & 8) == 0 )
        goto LABEL_10;
LABEL_11:
      v12 = (v11 & 8) == 0;
      v5 = v24;
      if( v12 )
        ++*(_DWORD *)(v1 + 84);
LABEL_13:
      v6 = v22 + 1;
      v22 = v6;
    }
    while( v6 < *(_DWORD *)(v5 + 8 * v25 + 12) >> 1 );
LABEL_14:
    v34 = ++v4;
  }
LABEL_15:
  result = v3;
  *(_DWORD *)(*a1 + 112i64) += ((KUSER_SHARED_DATA.TickCountMultiplier * KUSER_SHARED_DATA.TickCount.High1Time) << 8)
                             + ((KUSER_SHARED_DATA.TickCount.LowPart
                               * (unsigned __int64)KUSER_SHARED_DATA.TickCountMultiplier) >> 24)
                             - v27;
  return result;
}

Referenced by:

PfpPrefetchRequestPerform