PfpPrefetchDirectoryStream
INT64 __fastcall PfpPrefetchDirectoryStream(UINT64 *a1, INT64 a2, INT64 a3, INT64 a4, INT64 a5, INT64 a6){
__int64 v6;
unsigned int *Src;
UINT64 v10;
unsigned __int64 v11;
unsigned int v12;
UINT64 v13;
int v14;
unsigned int v15;
unsigned int v16;
unsigned int v17;
__int64 v18;
unsigned __int64 v19;
unsigned __int64 v20;
unsigned __int64 v21;
int v22;
UINT64 v24;
size_t Size;
SIZE_T Length;
__int64 v27;
__int64 v28;
__int64 v29[2];
int v30[2];
__int128 v31;
__int64 v32;
unsigned int SublistMax;
v6 = a1[5];
Src = (unsigned int *)a1[3];
*(_OWORD *)v29 = 0i64;
v32 = 0x200000000i64;
v10 = *a1;
v11 = 0i64;
v28 = v6;
*(_QWORD *)v30 = 0i64;
v12 = *(unsigned __int16 *)(v10 + 30);
*Src = 4;
v13 = *a1;
SublistMax = v12;
v31 = 0i64;
*((_QWORD *)Src + 1) = (8 * (v12 & 7)) | (unsigned __int64)(*(_DWORD *)(v13 + 28) & 7);
v14 = PfpOpenHandleCreate((__int64)v30, v6, *(_QWORD *)(a5 + 16), *(_QWORD *)(a5 + 8), 1048577, a6, 0, a2);
if( v14 >= 0 )
{
if( (*(_DWORD *)(*a1 + 80) & 4) != 0 )
MmQueryMemoryListInformation((PVOID)0xFFFFFFFFFFFFFFFFi64, (UINT64)(a1 + 6), (UINT64 *)0xB0);
v15 = 0;
while( v15 < *(_DWORD *)(a3 + 16) )
{
Src[1] = 0;
if( v15 >= *(_DWORD *)(a3 + 16) )
break;
v16 = *((_DWORD *)a1 + 8);
v17 = 0;
do
{
v18 = *(_QWORD *)(a3 + 24);
v19 = *(_QWORD *)(v18 + 16i64 * v15);
v20 = v11;
v21 = v19 + *(unsigned int *)(v18 + 16i64 * v15 + 8);
if( v19 >= v11 )
v20 = *(_QWORD *)(v18 + 16i64 * v15);
while( v20 < v21 )
{
*(_QWORD *)&Src[2 * Src[1] + 4] = v20;
v20 += 4096i64;
v17 = Src[1] + 1;
Src[1] = v17;
v16 = *((_DWORD *)a1 + 8);
if( v17 >= v16 )
{
v11 = v20;
break;
}
}
if( v17 >= v16 )
break;
++v15;
}
while( v15 < *(_DWORD *)(a3 + 16) );
if( !v17 )
break;
if( PfpCheckPrefetchAbort(a1)
|| (*(_DWORD *)(*a1 + 80) & 4) != 0 && a1[6] + a1[7] + PfpGetPageListCount(a1 + 11, 0i64, SublistMax) < 0x80 )
{
v14 = -1073741248;
goto LABEL_24;
}
LOBYTE(v27) = 0;
LODWORD(Length) = 0;
LODWORD(Size) = 8 * v22 + 16;
LODWORD(v24) = 590112;
v14 = IopXxxControlFile(*(void **)v30, 0i64, 0i64, 0i64, (__int64)v29, v24, Src, Size, 0i64, Length, v27);
if( (*(_DWORD *)(*a1 + 80) & 4) != 0 )
PfpUpdateRepurposedByPrefetch((_SYSTEM_MEMORY_LIST_INFORMATION *)(a1 + 6), Src[1]);
if( v14 < 0 )
{
if( v14 == -1073741807 )
break;
goto LABEL_24;
}
if( v14 == 259 )
KeBugCheckEx(0x191u, 0x14BCui64, 0i64, 0i64, 0i64);
}
v14 = 0;
LABEL_24:
v6 = v28;
}
if( (v32 & 0x400000000i64) != 0 )
PfpOpenHandleClose(v30, v6);
return(unsigned int)v14;
}Referenced by:
PfpVolumePrefetchMetadata