PfpPrefetchFiles

NTSTATUS __stdcall PfpPrefetchFiles(PFP_PREFETCH_CONTEXT *PrefetchContext, UINT8 PrefetchImagePages){
  __int64 v2; 
  int v3; 
  unsigned int v4; 
  UINT8 v5; 
  PFP_PREFETCH_CONTEXT *v6; 
  unsigned int v7; 
  int v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  __int64 v12; 
  _DWORD *v13; 
  VOID **PoolWithTag; 
  NTSTATUS v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  _DWORD *v19; 
  __int64 v20; 
  int v21; 
  __int64 v22; 
  VOID **v23; 
  int v24; 
  NTSTATUS v25; 
  INT64 v26; 
  __int64 v27; 
  __int64 v28; 
  int v29; 
  _READ_LIST **ReadLists; 
  int v32; 
  __int64 v33; 
  unsigned int v36; 
  __int64 v37; 

  v2 = *(_QWORD *)PrefetchContext;
  v3 = 0;
  v33 = *(_QWORD *)PrefetchContext;
  v4 = 0;
  v5 = PrefetchImagePages;
  v6 = PrefetchContext;
  v7 = *(_DWORD *)(*(_QWORD *)PrefetchContext + 8i64);
  v8 = ((KUSER_SHARED_DATA.TickCountMultiplier * KUSER_SHARED_DATA.TickCount.High1Time) << 8)
     + ((KUSER_SHARED_DATA.TickCount.LowPart * (unsigned __int64)KUSER_SHARED_DATA.TickCountMultiplier) >> 24);
  v32 = v8;
  v36 = *(_DWORD *)(*(_QWORD *)PrefetchContext + 28i64) & 7 | (8 * (*(_WORD *)(*(_QWORD *)PrefetchContext + 30i64) & 7));
  if( !v7 )
    goto LABEL_49;
  v9 = 0i64;
  v10 = *(_QWORD *)(v2 + 32) + 12i64;
  v11 = v7;
  do
  {
    if( (*(_QWORD *)(v9 + *((_QWORD *)v6 + 2) + 24) & 0x400000000i64) != 0 )
    {
      v12 = 0i64;
      if( (*(_DWORD *)v10 & 0xFFFFFFFE) != 0 )
      {
        while( 1 )
        {
          v13 = (_DWORD *)(*(_QWORD *)(v10 + 4) + 48 * v12);
          if( (*v13 & 0xA) != 0 || !v13[4] )
            goto LABEL_11;
          if( !v5 )
            break;
          if( (*v13 & 1) != 0 )
            goto LABEL_10;
LABEL_11:
          v12 = (unsigned int)(v12 + 1);
          if( (unsigned int)v12 >= *(_DWORD *)v10 >> 1 )
            goto LABEL_12;
        }
        ++*(_DWORD *)(v2 + 84);
LABEL_10:
        ++v4;
        goto LABEL_11;
      }
    }
LABEL_12:
    v10 += 40i64;
    v9 += 64i64;
    --v11;
  }
  while( v11 );
  if( v4 )
  {
    PoolWithTag = ExAllocatePoolWithTag(1ui64, v4 << 6, 1095984720i64);
    if( PoolWithTag )
    {
      ReadLists = (_READ_LIST **)&PoolWithTag[7 * v4];
      memset(PoolWithTag, 0i64, v4 << 6);
      v16 = 0i64;
      if( !*(_DWORD *)(v2 + 8) )
        goto LABEL_44;
      do
      {
        if( (*(_QWORD *)(((unsigned __int64)(unsigned int)v16 << 6) + *((_QWORD *)v6 + 2) + 24) & 0x400000000i64) != 0 )
        {
          v17 = *(_QWORD *)(v2 + 32);
          v18 = 0i64;
          v37 = v17;
          if( (*(_DWORD *)(v17 + 40 * v16 + 12) & 0xFFFFFFFE) != 0 )
          {
            do
            {
              v19 = (_DWORD *)(*(_QWORD *)(v17 + 40 * v16 + 16) + 48 * v18);
              if( (*v19 & 0xA) == 0 && v19[4] && (!v5 || (*v19 & 1) != 0) )
              {
                v20 = (__int64)&PoolWithTag[7 * v3];
                PfpReadSupportInitialize(v20);
                if( (int)PfpFileBuildReadSupport(PrefetchContext, v19, v16, PrefetchImagePages, v20) < 0 )
                {
                  PfpReadSupportCleanup(*((_PFP_PREFETCH_CONTEXT_SHARED **)PrefetchContext + 5), v20);
                  PfpReadSupportInitialize(v20);
                }
                else
                {
                  ++v3;
                }
                v5 = PrefetchImagePages;
                v17 = v37;
              }
              v18 = (unsigned int)(v18 + 1);
            }
            while( (unsigned int)v18 < *(_DWORD *)(v17 + 40 * v16 + 12) >> 1 );
            v2 = v33;
          }
          v6 = PrefetchContext;
        }
        v16 = (unsigned int)(v16 + 1);
      }
      while( (unsigned int)v16 < *(_DWORD *)(v2 + 8) );
      if( v3 )
      {
        if( (unsigned int)PfpCheckPrefetchAbort(v6) )
        {
          v15 = -1073741248;
        }
        else
        {
          v21 = 0;
          if( v3 > 0 )
          {
            v22 = 0i64;
            v23 = PoolWithTag;
            do
            {
              *(_QWORD *)*v23 = v23[2];
              ReadLists[v22] = (_READ_LIST *)*v23;
              v24 = *((_DWORD *)*v23 + 2);
              v21 += v24;
              if( v24 )
                *((_QWORD *)*v23 + 2) |= v36;
              ++v22;
              v23 += 7;
            }
            while( v22 < v3 );
          }
          if( v5 )
            *(_DWORD *)(v2 + 100) += v21;
          else
            *(_DWORD *)(v2 + 96) += v21;
          MmPrefetchPagesEx((unsigned int)v3, ReadLists, 0i64);
          v15 = v25;
        }
      }
      else
      {
LABEL_44:
        v15 = -1073741275;
      }
      if( v3 > 0 )
      {
        v26 = (INT64)PoolWithTag;
        v27 = (unsigned int)v3;
        do
        {
          PfpReadSupportCleanup(*((_PFP_PREFETCH_CONTEXT_SHARED **)v6 + 5), v26);
          v26 += 56i64;
          --v27;
        }
        while( v27 );
      }
      ExFreePoolWithTag(PoolWithTag, 0);
    }
    else
    {
      v15 = -1073741670;
    }
    v8 = v32;
  }
  else
  {
LABEL_49:
    v15 = -1073741275;
  }
  v28 = *(_QWORD *)v6;
  v29 = ((KUSER_SHARED_DATA.TickCountMultiplier * KUSER_SHARED_DATA.TickCount.High1Time) << 8)
      + ((KUSER_SHARED_DATA.TickCount.LowPart * (unsigned __int64)KUSER_SHARED_DATA.TickCountMultiplier) >> 24)
      - v8;
  if( v5 )
    *(_DWORD *)(v28 + 116) += v29;
  else
    *(_DWORD *)(v28 + 112) += v29;
  return v15;
}

Referenced by:

PfpPrefetchRequestPerform