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