PfpVolumePrefetchMetadata
NTSTATUS __stdcall PfpVolumePrefetchMetadata(PFP_PREFETCH_CONTEXT *PrefetchContext, UINT64 VolumeIndex){
__int64 v3;
__int64 v4;
UINT64 InputBufferLength;
__int64 v6;
__int64 v7;
unsigned int v8;
__int64 v9;
__int64 v10;
__int64 v11;
__int64 v12;
__int64 v13;
__int64 v14;
__int64 v15;
_DWORD *v16;
int v17;
NTSTATUS result;
INT64 v19;
NTSTATUS v20;
unsigned __int64 v21;
unsigned int v22;
unsigned int v23;
unsigned int v24;
__int64 v25;
unsigned __int64 v26;
unsigned __int64 v27;
unsigned __int64 v28;
unsigned __int64 v29;
UINT64 v30;
__int64 v31;
UINT64 IoControlCode;
INT64 IoControlCodea;
__int64 v34;
__int64 v35;
int v36;
UINT64 v37[2];
__int128 v38;
INT64 a5[2];
__int128 v40;
__int128 v41;
unsigned int SublistMax;
unsigned int v43;
INT64 a6;
int v45;
v43 = VolumeIndex;
LODWORD(a6) = 0;
v45 = 0;
*(_OWORD *)v37 = 0i64;
v35 = (unsigned int)VolumeIndex;
v38 = 0i64;
v3 = 0i64;
v4 = 5i64 * (unsigned int)VolumeIndex;
InputBufferLength = *((_QWORD *)PrefetchContext + 3);
v6 = *(_QWORD *)PrefetchContext;
*(_OWORD *)a5 = 0i64;
v40 = 0i64;
v7 = *(_QWORD *)(v6 + 32);
v34 = 0i64;
v36 = ((KUSER_SHARED_DATA.TickCountMultiplier * KUSER_SHARED_DATA.TickCount.High1Time) << 8)
+ ((KUSER_SHARED_DATA.TickCount.LowPart * (unsigned __int64)KUSER_SHARED_DATA.TickCountMultiplier) >> 24);
v8 = *(unsigned __int16 *)(v6 + 30);
*(_DWORD *)InputBufferLength = 3;
v9 = *(_QWORD *)PrefetchContext;
v41 = 0i64;
SublistMax = v8;
*(_QWORD *)(InputBufferLength + 8) = (8 * (v8 & 7)) | (unsigned __int64)(*(_DWORD *)(v9 + 28) & 7);
if( (*(_DWORD *)(*(_QWORD *)PrefetchContext + 80i64) & 4) != 0 )
MmQueryMemoryListInformation((VOID *)0xFFFFFFFFFFFFFFFFi64, (UINT64)(PrefetchContext + 12), (UINT64 *)0xB0);
v10 = 0i64;
if( (*(_DWORD *)(v7 + 8 * v4 + 12) & 0xFFFFFFFE) != 0 )
{
do
{
*(_DWORD *)(InputBufferLength + 4) = 0;
if( (unsigned int)v10 >= *(_DWORD *)(v7 + 8 * v4 + 12) >> 1 )
break;
do
{
v11 = *(unsigned int *)(InputBufferLength + 4);
v12 = 48 * v10;
v10 = (unsigned int)(v10 + 1);
v13 = *(_QWORD *)(v7 + 8 * v4 + 16) + v12;
v14 = *(_QWORD *)(v13 + 8);
if( (*(_BYTE *)v13 & 0x10) != 0 )
v3 = v13;
if( v14 )
{
*(_QWORD *)(InputBufferLength + 8 * v11 + 16) = v14;
LODWORD(v11) = *(_DWORD *)(InputBufferLength + 4) + 1;
*(_DWORD *)(InputBufferLength + 4) = v11;
if( (unsigned int)v11 >= PrefetchContext[8] )
break;
}
}
while( (unsigned int)v10 < *(_DWORD *)(v7 + 8 * v4 + 12) >> 1 );
v34 = v3;
if( !(_DWORD)v11 )
break;
if( (unsigned int)PfpCheckPrefetchAbort(PrefetchContext)
|| (*(_DWORD *)(*(_QWORD *)PrefetchContext + 80i64) & 4) != 0
&& *((_QWORD *)PrefetchContext + 6)
+ *((_QWORD *)PrefetchContext + 7)
+ PfpGetPageListCount((UINT64 *)PrefetchContext + 11, 0i64, v30) < 0x80 )
{
LABEL_52:
v17 = -1073741248;
goto LABEL_15;
}
LODWORD(IoControlCode) = 590112;
v17 = IopXxxControlFile(
*(VOID **)((v31 << 6) + *((_QWORD *)PrefetchContext + 2)),
0i64,
0i64,
0i64,
v37,
IoControlCode,
InputBufferLength);
if( (*(_DWORD *)(*(_QWORD *)PrefetchContext + 80i64) & 4) != 0 )
PfpUpdateRepurposedByPrefetch((__int64)(PrefetchContext + 12), *(unsigned int *)(InputBufferLength + 4));
if( v17 < 0 )
goto LABEL_15;
if( v17 == 259 )
KeBugCheckEx(0x191u, (PVOID)0x15FB, 0i64, 0i64, 0i64);
v3 = v34;
}
while( (unsigned int)v10 < *(_DWORD *)(v7 + 8 * v4 + 12) >> 1 );
if( v3 )
{
v21 = 0i64;
v22 = 0;
++*(_DWORD *)(*(_QWORD *)PrefetchContext + 88i64);
if( *(_DWORD *)(v3 + 16) )
{
do
{
*(_DWORD *)(InputBufferLength + 4) = 0;
if( v22 >= *(_DWORD *)(v3 + 16) )
break;
v23 = PrefetchContext[8];
v24 = 0;
do
{
v25 = *(_QWORD *)(v3 + 24);
v26 = v21;
v27 = *(_QWORD *)(v25 + 16i64 * v22);
v28 = v27 + *(unsigned int *)(v25 + 16i64 * v22 + 8);
if( v27 >= v21 )
v26 = *(_QWORD *)(v25 + 16i64 * v22);
while( v26 < v28 )
{
v29 = v26 >> 10;
v26 += 4096i64;
*(_QWORD *)(InputBufferLength + 8i64 * *(unsigned int *)(InputBufferLength + 4) + 16) = v29;
v24 = *(_DWORD *)(InputBufferLength + 4) + 1;
*(_DWORD *)(InputBufferLength + 4) = v24;
v23 = PrefetchContext[8];
if( v24 >= v23 )
{
v21 = v26;
break;
}
}
if( v24 >= v23 )
break;
++v22;
}
while( v22 < *(_DWORD *)(v3 + 16) );
if( !v24 )
break;
if( (unsigned int)PfpCheckPrefetchAbort(PrefetchContext)
|| (*(_DWORD *)(*(_QWORD *)PrefetchContext + 80i64) & 4) != 0
&& *((_QWORD *)PrefetchContext + 6)
+ *((_QWORD *)PrefetchContext + 7)
+ PfpGetPageListCount((UINT64 *)PrefetchContext + 11, 0i64, SublistMax) < 0x80 )
{
goto LABEL_52;
}
LODWORD(IoControlCode) = 590112;
v17 = IopXxxControlFile(
*(VOID **)((v35 << 6) + *((_QWORD *)PrefetchContext + 2)),
0i64,
0i64,
0i64,
v37,
IoControlCode,
InputBufferLength);
if( (*(_DWORD *)(*(_QWORD *)PrefetchContext + 80i64) & 4) != 0 )
PfpUpdateRepurposedByPrefetch((__int64)(PrefetchContext + 12), *(unsigned int *)(InputBufferLength + 4));
if( v17 < 0 )
goto LABEL_15;
if( v17 == 259 )
KeBugCheckEx(0x191u, (PVOID)0x1660, 0i64, 0i64, 0i64);
v3 = v34;
}
while( v22 < *(_DWORD *)(v34 + 16) );
}
}
}
v15 = 0i64;
if( (*(_DWORD *)(v7 + 8 * v4 + 12) & 0xFFFFFFFE) != 0 )
{
do
{
v16 = (_DWORD *)(*(_QWORD *)(v7 + 8 * v4 + 16) + 48 * v15);
if( (*v16 & 2) != 0 )
{
PfpFileSetupObjectAttributes((__int64)PrefetchContext, (__int64)v16, v43, (__int64)&v38, (__int64)a5, &a6);
LODWORD(IoControlCodea) = a6;
v20 = PfpPrefetchDirectoryStream(
PrefetchContext,
*((_QWORD *)PrefetchContext + 2) + (v35 << 6),
(INT64)v16,
v19,
(INT64)a5,
IoControlCodea);
v17 = v20;
if( v20 < 0 )
{
if( v20 == -1073741248 )
goto LABEL_15;
}
else
{
++*(_DWORD *)(*(_QWORD *)PrefetchContext + 88i64);
}
}
v15 = (unsigned int)(v15 + 1);
}
while( (unsigned int)v15 < *(_DWORD *)(v7 + 8 * v4 + 12) >> 1 );
}
v17 = 0;
LABEL_15:
result = v17;
*(_DWORD *)(*(_QWORD *)PrefetchContext + 108i64) += ((KUSER_SHARED_DATA.TickCountMultiplier
* KUSER_SHARED_DATA.TickCount.High1Time) << 8)
+ ((KUSER_SHARED_DATA.TickCount.LowPart
* (unsigned __int64)KUSER_SHARED_DATA.TickCountMultiplier) >> 24)
- v36;
return result;
}Referenced by:
PfpPrefetchRequestPerform