PfpPrefetchPrivatePages

NTSTATUS __stdcall PfpPrefetchPrivatePages(PFP_PREFETCH_CONTEXT *PrefetchContext){
  __int64 v1; 
  PFP_PREFETCH_CONTEXT *v2; 
  int v3; 
  int v4; 
  int v5; 
  int v6; 
  int v7; 
  int v8; 
  unsigned int v9; 
  __int64 v10; 
  int *v11; 
  CHAR *v12; 
  _QWORD *v13; 
  unsigned int v14; 
  unsigned int v15; 
  NTSTATUS v16; 
  NTSTATUS result; 
  unsigned int v18; 
  unsigned int SublistMax; 
  CHAR *Handle[2]; 
  __int64 v21; 
  PVOID P[2]; 
  int v24; 
  unsigned int v25; 

  v1 = *(_QWORD *)PrefetchContext;
  v2 = PrefetchContext;
  v3 = 0;
  *(_OWORD *)P = 0i64;
  SublistMax = *(unsigned __int16 *)(*(_QWORD *)PrefetchContext + 30i64);
  v4 = *(_DWORD *)(*(_QWORD *)PrefetchContext + 28i64);
  v21 = ((KUSER_SHARED_DATA.TickCountMultiplier * KUSER_SHARED_DATA.TickCount.High1Time) << 8)
      + (unsigned int)((KUSER_SHARED_DATA.TickCount.LowPart * (unsigned __int64)KUSER_SHARED_DATA.TickCountMultiplier) >> 24);
  v5 = *(_DWORD *)(v1 + 80);
  v6 = (8 * (SublistMax & 7)) | v4 & 7;
  v7 = v6 | 0x100;
  if( (v5 & 0x10) != 0 )
    v7 = v6;
  v8 = v7 | 0x200;
  if( (v5 & 8) == 0 )
    v8 = v7;
  v9 = v8 | 0x800;
  if( (v5 & 0x20) == 0 )
    v9 = v8;
  v10 = 0i64;
  v25 = v9;
  v24 = 0;
  if( !*(_DWORD *)(v1 + 20) )
  {
LABEL_26:
    v16 = 0;
    goto LABEL_27;
  }
  while( 1 )
  {
    *(_OWORD *)Handle = 0i64;
    if( (unsigned int)PfpCheckPrefetchAbort(v2) )
    {
      v3 = 1;
LABEL_31:
      v12 = Handle[1];
      goto LABEL_22;
    }
    v11 = (int *)(*(_QWORD *)(v1 + 56) + 40 * v10);
    if( (int)PfpSourceBuildVaArray((__int64)v11, (__int64)P) < 0
      || (int)PfpSourceGetPrefetchSupport(v11, (__int64)Handle) < 0 )
    {
      goto LABEL_31;
    }
    v12 = Handle[1];
    if( (*(_DWORD *)(v1 + 80) & 4) == 0 )
    {
      v18 = (unsigned int)P[0];
      *(_DWORD *)(v1 + 104) += LODWORD(P[0]);
      MmPrefetchVirtualMemory(v12, v18, (INT64)P[1], v9);
LABEL_21:
      ++*(_DWORD *)(v1 + 92);
      goto LABEL_22;
    }
    v13 = v2 + 12;
    v14 = (unsigned int)P[0];
    Handle[0] = (CHAR *)P[1];
    MmQueryMemoryListInformation((VOID *)0xFFFFFFFFFFFFFFFFi64, (UINT64)(v2 + 12), (UINT64 *)0xB0);
    if( !v14 )
      goto LABEL_21;
    while( !(unsigned int)PfpCheckPrefetchAbort(v2)
         && *v13 + v13[1] + PfpGetPageListCount(v13 + 5, 0i64, SublistMax) >= 0x80 )
    {
      v15 = v14;
      if( v14 > 0x10 )
        v15 = 16;
      if( MmPrefetchVirtualMemory(v12, v15, (INT64)Handle[0], v25) >= 0 )
        *(_DWORD *)(v1 + 104) += v15;
      PfpUpdateRepurposedByPrefetch((__int64)v13, v15);
      Handle[0] += 16 * v15;
      v14 -= v15;
      v2 = PrefetchContext;
      if( !v14 )
      {
        LODWORD(v10) = v24;
        goto LABEL_21;
      }
    }
    LODWORD(v10) = v24;
    v3 = 1;
LABEL_22:
    if( v12 )
      NtClose((UINT64)v12);
    if( v3 )
      break;
    v9 = v25;
    v10 = (unsigned int)(v10 + 1);
    v24 = v10;
    if( (unsigned int)v10 >= *(_DWORD *)(v1 + 20) )
      goto LABEL_26;
  }
  v16 = -1073741248;
LABEL_27:
  if( P[1] )
    ExFreePoolWithTag(P[1], 0);
  result = v16;
  *(_DWORD *)(*(_QWORD *)v2 + 120i64) += ((KUSER_SHARED_DATA.TickCountMultiplier * KUSER_SHARED_DATA.TickCount.High1Time) << 8)
                                       + ((KUSER_SHARED_DATA.TickCount.LowPart
                                         * (unsigned __int64)KUSER_SHARED_DATA.TickCountMultiplier) >> 24)
                                       - v21;
  return result;
}

Referenced by:

PfpPrefetchRequestPerform