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