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