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