MiComputeZeroClusterMaximum
unsigned __int64 __fastcall MiComputeZeroClusterMaximum(__int64 a1, __int64 a2, __int64 a3){
__int64 v3;
__int64 v6;
unsigned __int64 v7;
unsigned __int64 v8;
unsigned __int64 v9;
__int64 v10;
unsigned __int64 v11;
INT64 v12;
unsigned __int64 v13;
__int64 v14;
unsigned __int64 v15;
int v16;
__int64 v17;
unsigned __int64 result;
unsigned __int64 v19;
unsigned __int64 v20;
unsigned int v21;
UINT64 AvailablePagesBelowPriority;
v3 = *(_QWORD *)(a1 + 32);
v6 = *(_QWORD *)(a1 + 8) + 16i64 * *(_QWORD *)(a1 + 24);
v7 = (((unsigned __int64)(*(_DWORD *)v6 & 0xFFF) + *(_QWORD *)(v6 + 8) + 4095i64) >> 12) - v3;
v8 = *(_QWORD *)v6 + (v3 << 12);
if( a3 )
{
v9 = (*(unsigned int *)(a3 + 28) | ((unsigned __int64)*(unsigned __int8 *)(a3 + 33) << 32)) - (v8 >> 12);
if( v7 > v9 + 1 )
v7 = v9 + 1;
}
v10 = *(unsigned __int16 *)(a2 + 174);
v11 = 20000i64;
v12 = *(_QWORD *)(qword_140C4E388 + 8 * v10);
v13 = *(_QWORD *)(*(_QWORD *)(v12 + 6848) + 2384i64);
v14 = 20000i64;
if( v13 > 0x4E20 )
v14 = *(_QWORD *)(*(_QWORD *)(v12 + 6848) + 2384i64);
if( (v14 & 0xFFFFFFFFFFFFFFFEui64) <= 0x4E20 )
{
v15 = 10000i64;
}
else
{
if( v13 > 0x4E20 )
v11 = *(_QWORD *)(*(_QWORD *)(v12 + 6848) + 2384i64);
v15 = v11 >> 1;
}
v16 = MiSufficientAvailablePages(v12, v15 >> 1);
v17 = 1i64;
if( !v16 )
v7 = 1i64;
if( (*(_BYTE *)(a2 + 184) & 0x40) != 0 && (*(_BYTE *)a1 != 1 || (*(_DWORD *)(a1 + 80) & 0x4000) == 0) )
{
v19 = *(_QWORD *)(a2 + 120);
v20 = *(_QWORD *)(a2 + 152);
if( v19 >= v20 )
return 1i64;
if( v19 + v7 > v20 )
v7 = v20 - v19;
}
if( *(_BYTE *)a1 == 1 )
{
v21 = *(_DWORD *)(a1 + 80);
if( (v21 & 0x4000) != 0 )
{
AvailablePagesBelowPriority = MiGetAvailablePagesBelowPriority((_MI_PARTITION *)v12, ((v21 >> 3) & 7) + 1);
if( v7 > AvailablePagesBelowPriority )
v7 = AvailablePagesBelowPriority;
}
}
if( !v7 )
v7 = v17;
result = 512 - ((((unsigned int)MmGetPteBase() + ((v8 >> 9) & 0xFFFFFFF8)) >> 3) & 0x1FF);
if( v7 <= result )
return v7;
return result;
}Referenced by:
MiExpandSharedZeroCluster
MiGetClusterPage
MiResolvePrivateZeroFault