MiComputeFaultCluster
NTSTATUS __stdcall MiComputeFaultCluster(
_MI_PARTITION *Partition,
_MI_FAULT_VA_LIST *FaultHead,
_MMVAD *Vad,
UINT64 StoreFault){
__int64 v4;
__int64 v5;
__int64 v6;
unsigned __int64 v7;
unsigned __int64 v10;
__int64 v11;
unsigned __int64 v12;
unsigned __int64 v13;
NTSTATUS result;
INT64 v15;
unsigned __int64 ReadClusterSizeMax;
unsigned __int64 v17;
__int64 LongFlags1;
unsigned __int64 v19;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v20;
_MMPTE v21;
__int64 v22;
_MMPTE PointerPte;
unsigned __int64 v24;
__int64 v25;
__int64 v26;
int v28;
int v29;
v29 = StoreFault;
v4 = *((_QWORD *)FaultHead + 4);
v5 = *((_QWORD *)FaultHead + 1);
v6 = 2i64 * *((_QWORD *)FaultHead + 3);
v7 = *((_QWORD *)FaultHead + 2);
v25 = *((_QWORD *)FaultHead + 3);
v10 = *(_QWORD *)(v5 + 8 * v6) + (v4 << 12);
v26 = v4;
v24 = v7;
MiAdvanceFaultList(FaultHead);
v12 = *((_QWORD *)FaultHead + 3);
v13 = 1i64;
if( v12 < v7 )
{
v28 = 0;
v15 = (INT64)&MmGetPteBase()[1] + ((v10 >> 9) & 0x7FFFFFFFF8i64);
ReadClusterSizeMax = 256i64;
if( v29 && Partition->Store.ReadClusterSizeMax < 0x100ui64 )
ReadClusterSizeMax = Partition->Store.ReadClusterSizeMax;
if( Vad )
{
v17 = (Vad->Core.EndingVpn | ((unsigned __int64)Vad->Core.EndingVpnHigh << 32)) - (v10 >> 12) + 1;
if( ReadClusterSizeMax <= v17 )
v17 = ReadClusterSizeMax;
ReadClusterSizeMax = v17;
LongFlags1 = Vad->Core.u1.LongFlags1;
LODWORD(LongFlags1) = LongFlags1 & 0x7FFFFFFF;
if( LongFlags1 | ((unsigned __int64)Vad->Core.CommitChargeHigh << 31) )
{
Vad = 0i64;
v28 = 1;
}
}
if( ReadClusterSizeMax > 1 )
{
while( 1 )
{
if( !Vad )
{
if( (v15 & 0xFFF) == 0
|| (LODWORD(v20.Long) = MI_READ_PTE_LOCK_FREE(v15),
PointerPte.u.Long = v20.Long,
v21.u.Long = v20.Long,
(v20.Long & 1) != 0) )
{
LABEL_14:
v11 = v25;
v4 = v26;
break;
}
v22 = v20.Long & 0x400;
if( v28 )
{
if( !v22 )
goto LABEL_14;
}
else if( v22
|| (v21.u.Long & 0x800) != 0
|| !MiGetPagingFileOffset(&PointerPte)
|| v29 != MiIsPteInStore(Partition, v21) )
{
goto LABEL_14;
}
v15 += 8i64;
}
if( ((*(_QWORD *)(*((_QWORD *)FaultHead + 1) + 16 * v12) + (*((_QWORD *)FaultHead + 4) << 12)) & 0xFFFFFFFFFFFFF000ui64)
- 4096 == (v10 & 0xFFFFFFFFFFFFF000ui64) )
{
++v13;
MiAdvanceFaultList(FaultHead);
v12 = *((_QWORD *)FaultHead + 3);
if( v12 != v24 )
{
v10 = v19;
if( v13 < ReadClusterSizeMax )
continue;
}
}
goto LABEL_14;
}
}
}
*((_QWORD *)FaultHead + 4) = v4;
result = v13;
*((_QWORD *)FaultHead + 3) = v11;
return result;
}Referenced by:
MiResolveMappedFileFault
MiResolvePageFileFault