PfpPrefetchFilesTrickle

NTSTATUS __stdcall PfpPrefetchFilesTrickle(PFP_PREFETCH_CONTEXT *PrefetchContext){
  __int64 v1; 
  NTSTATUS v3; 
  unsigned int v4; 
  __int64 v5; 
  unsigned int v6; 
  int *v7; 
  int v8; 
  char v9; 
  int v10; 
  int v11; 
  bool v12; 
  NTSTATUS result; 
  INT64 v14; 
  unsigned int v15; 
  unsigned int v16; 
  int v17; 
  int v18; 
  int v19; 
  int v20; 
  int v21; 
  unsigned int v22; 
  unsigned int v23; 
  INT64 v24; 
  __int64 v25; 
  __int64 v26; 
  _READ_LIST *ReadLists; 
  __int64 v28; 
  INT64 a2[2]; 
  __int128 v30; 
  __int128 v31; 
  __int64 v32; 
  char v33; 
  int v34; 
  unsigned int v35; 
  unsigned int SublistMax; 

  v1 = *(_QWORD *)PrefetchContext;
  v32 = 0i64;
  v3 = 0;
  *(_OWORD *)a2 = 0i64;
  v4 = 0;
  v30 = 0i64;
  v31 = 0i64;
  v33 = 0;
  v35 = 0;
  SublistMax = *(unsigned __int16 *)(*(_QWORD *)PrefetchContext + 30i64);
  v28 = ((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) + *((_QWORD *)PrefetchContext + 2) + 24) & 0x400000000i64) == 0 )
      goto LABEL_14;
    v5 = *(_QWORD *)(v1 + 32);
    v26 = 5i64 * v4;
    v6 = 0;
    v23 = 0;
    v25 = v5;
    if( (*(_DWORD *)(v5 + 40i64 * v4 + 12) & 0xFFFFFFFE) == 0 )
      goto LABEL_14;
    do
    {
      v7 = (int *)(*(_QWORD *)(v5 + 8 * v26 + 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)a2);
      if( (int)PfpFileBuildReadSupport(PrefetchContext, v7, v4, v9, (__int64)a2) >= 0 )
      {
        v14 = a2[0];
        v24 = a2[0];
        v15 = 0;
        ReadLists = (_READ_LIST *)a2[0];
        *(_QWORD *)a2[0] = v30;
        v22 = *(_DWORD *)(v14 + 8);
        v34 = 0;
        MmQueryMemoryListInformation((VOID *)0xFFFFFFFFFFFFFFFFi64, (UINT64)(PrefetchContext + 12), (UINT64 *)0xB0);
        if( v22 )
        {
          while( !(unsigned int)PfpCheckPrefetchAbort(PrefetchContext)
               && *((_QWORD *)PrefetchContext + 6)
                + *((_QWORD *)PrefetchContext + 7)
                + PfpGetPageListCount((UINT64 *)PrefetchContext + 11, 0i64, SublistMax) >= 0x80 )
          {
            if( v15 + 16 > v16 )
              v17 = v16 - v15;
            else
              v17 = 16;
            *(_DWORD *)(v24 + 8) = v17;
            memmove((VOID *)(v24 + 16), (const VOID *)(v24 + 16 + 8i64 * v15), 8 * v17);
            *(_QWORD *)(v24 + 16) |= (8 * (SublistMax & 7)) | (unsigned __int64)(*(_DWORD *)(*(_QWORD *)PrefetchContext
                                                                                           + 28i64) & 7);
            MmPrefetchPagesEx(1ui64, &ReadLists, 0i64);
            v19 = v18;
            PfpUpdateRepurposedByPrefetch((__int64)(PrefetchContext + 12), *(unsigned int *)(v24 + 8));
            v20 = v34;
            if( v19 >= 0 )
            {
              v21 = *(_DWORD *)(v24 + 8);
              v20 = v21 + v34;
              v15 += v21;
              v34 += v21;
              if( v15 < v22 )
                continue;
            }
            v4 = v35;
            goto LABEL_26;
          }
          v4 = v35;
          v20 = v34;
          v33 = 1;
        }
        else
        {
          v20 = 0;
        }
LABEL_26:
        if( v9 )
          *(_DWORD *)(v1 + 100) += v20;
        else
          *(_DWORD *)(v1 + 96) += v20;
      }
      PfpReadSupportCleanup(*((_PFP_PREFETCH_CONTEXT_SHARED **)PrefetchContext + 5), (INT64)a2);
      if( v33 || (unsigned int)PfpCheckPrefetchAbort(PrefetchContext) )
      {
        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 = v25;
      if( v12 )
        ++*(_DWORD *)(v1 + 84);
LABEL_13:
      v6 = v23 + 1;
      v23 = v6;
    }
    while( v6 < *(_DWORD *)(v5 + 8 * v26 + 12) >> 1 );
LABEL_14:
    v35 = ++v4;
  }
LABEL_15:
  result = v3;
  *(_DWORD *)(*(_QWORD *)PrefetchContext + 112i64) += ((KUSER_SHARED_DATA.TickCountMultiplier
                                                      * KUSER_SHARED_DATA.TickCount.High1Time) << 8)
                                                    + ((KUSER_SHARED_DATA.TickCount.LowPart
                                                      * (unsigned __int64)KUSER_SHARED_DATA.TickCountMultiplier) >> 24)
                                                    - v28;
  return result;
}

Referenced by:

PfpPrefetchRequestPerform