PfpPrefetchFiles
INT64 __fastcall PfpPrefetchFiles(INT64 *rcx0, CHAR a2){
INT64 v2;
int v3;
unsigned int v4;
CHAR v5;
INT64 *v6;
unsigned int v7;
int v8;
__int64 v9;
__int64 v10;
__int64 v11;
__int64 v12;
_DWORD *v13;
_QWORD *PoolWithTag;
unsigned int v15;
__int64 v16;
__int64 v17;
__int64 v18;
_DWORD *v19;
INT64 a5;
int v21;
__int64 v22;
_QWORD *v23;
int v24;
INT64 v25;
__int64 v26;
INT64 v27;
int v28;
_READ_LIST **ReadLists;
int v31;
INT64 v32;
unsigned int v35;
__int64 v36;
v2 = *rcx0;
v3 = 0;
v32 = *rcx0;
v4 = 0;
v5 = a2;
v6 = rcx0;
v7 = *(_DWORD *)(*rcx0 + 8);
v8 = ((KUSER_SHARED_DATA.TickCountMultiplier * KUSER_SHARED_DATA.TickCount.High1Time) << 8)
+ ((KUSER_SHARED_DATA.TickCount.LowPart * (unsigned __int64)KUSER_SHARED_DATA.TickCountMultiplier) >> 24);
v31 = v8;
v35 = *(_DWORD *)(*rcx0 + 28) & 7 | (8 * (*(_WORD *)(*rcx0 + 30) & 7));
if( !v7 )
goto LABEL_49;
v9 = 0i64;
v10 = *(_QWORD *)(v2 + 32) + 12i64;
v11 = v7;
do
{
if( (*(_QWORD *)(v9 + 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(PagedPool, v4 << 6, 0x41536650ui64);
if( PoolWithTag )
{
ReadLists = (_READ_LIST **)&PoolWithTag[7 * v4];
memset((INT64)PoolWithTag, 0i64);
v16 = 0i64;
if( !*(_DWORD *)(v2 + 8) )
goto LABEL_44;
do
{
if( (*(_QWORD *)(((unsigned __int64)(unsigned int)v16 << 6) + v6[2] + 24) & 0x400000000i64) != 0 )
{
v17 = *(_QWORD *)(v2 + 32);
v18 = 0i64;
v36 = 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) )
{
a5 = (INT64)&PoolWithTag[7 * v3];
PfpReadSupportInitialize(a5);
if( (int)PfpFileBuildReadSupport(rcx0, v19, (unsigned int)v16, a2, a5) < 0 )
{
PfpReadSupportCleanup(rcx0[5], a5);
PfpReadSupportInitialize(a5);
}
else
{
++v3;
}
v5 = a2;
v17 = v36;
}
v18 = (unsigned int)(v18 + 1);
}
while( (unsigned int)v18 < *(_DWORD *)(v17 + 40 * v16 + 12) >> 1 );
v2 = v32;
}
v6 = rcx0;
}
v16 = (unsigned int)(v16 + 1);
}
while( (unsigned int)v16 < *(_DWORD *)(v2 + 8) );
if( v3 )
{
if( 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 + 8i64);
v21 += v24;
if( v24 )
*(_QWORD *)(*v23 + 16i64) |= v35;
++v22;
v23 += 7;
}
while( v22 < v3 );
}
if( v5 )
*(_DWORD *)(v2 + 100) += v21;
else
*(_DWORD *)(v2 + 96) += v21;
v15 = MmPrefetchPagesEx((unsigned int)v3, ReadLists, 0i64);
}
}
else
{
LABEL_44:
v15 = -1073741275;
}
if( v3 > 0 )
{
v25 = (INT64)PoolWithTag;
v26 = (unsigned int)v3;
do
{
PfpReadSupportCleanup(v6[5], v25);
v25 += 56i64;
--v26;
}
while( v26 );
}
ExFreePoolWithTag(PoolWithTag, 0);
}
else
{
v15 = -1073741670;
}
v8 = v31;
}
else
{
LABEL_49:
v15 = -1073741275;
}
v27 = *v6;
v28 = ((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 *)(v27 + 116) += v28;
else
*(_DWORD *)(v27 + 112) += v28;
return v15;
}Referenced by:
PfpPrefetchRequestPerform