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