MiPickClusterForMappedFileFault
INT64 __fastcall MiPickClusterForMappedFileFault(
INT64 a1,
INT64 a2,
INT64 a3,
UINT64 a4,
UINT64 a5,
INT64 a6,
UINT64 *a7,
UINT64 *a8){
__int64 v8;
unsigned int v9;
__int64 v10;
unsigned int v11;
unsigned __int64 v12;
_ETHREAD *CurrentThread;
unsigned int v15;
UINT64 v16;
unsigned __int64 v17;
UINT64 v18;
INT64 result;
unsigned int v20;
int v21;
unsigned int v22;
unsigned __int64 i;
UINT64 v24;
unsigned __int64 v25;
unsigned __int64 v26;
int v27;
__int64 v28;
int v29;
__int64 v30;
__int64 v31;
v8 = *(_QWORD *)(a2 + 208);
v9 = 0;
v10 = *(_QWORD *)(a2 + 168);
v11 = 1;
v12 = *(_QWORD *)(a2 + 232);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v15 = 1;
v31 = *(_QWORD *)v8;
if( (v10 & 0x400) == 0 )
goto LABEL_5;
if( *((_BYTE *)CurrentThread + 1309) )
goto LABEL_5;
v29 = *(_DWORD *)(*(_QWORD *)v8 + 56i64);
if( (v29 & 8) != 0 && *((_BYTE *)CurrentThread + 1308) != 2 )
goto LABEL_5;
if( *(__int64 *)(a1 + 7168) < 160 )
goto LABEL_5;
if( dword_140C4EA00 )
{
--dword_140C4EA00;
LABEL_5:
v16 = v12;
v17 = v12;
goto LABEL_6;
}
if( !(unsigned int)MiSufficientAvailablePages(a1, 0x140ui64) )
goto LABEL_5;
v20 = *(_DWORD *)(a2 + 184);
if( v20 == 1 )
goto LABEL_5;
v17 = a4 - 8 + 8 * (*(unsigned int *)(v8 + 44) - (unsigned __int64)(*(_DWORD *)(v8 + 52) & 0x3FFFFFFF));
v21 = v29;
if( !a3 )
{
if( (v29 & 0x20) != 0 )
{
v20 = 4;
if( (*(_BYTE *)(v8 + 32) & 4) != 0 )
v20 = 8;
}
else if( !v20 )
{
v20 = *((_DWORD *)CurrentThread + 322) + 1;
}
}
v30 = 8i64 * v20;
if( v17 > v12 + v30 - 8 )
v17 = v12 + v30 - 8;
if( !a3 && (v21 & 0x20000000) != 0 )
{
v22 = MiStartingOffset(v8, v12, a5);
v27 = v22 & (dword_140C4EA90 - 1);
if( v17 > v12 + 8 * (((unsigned int)(dword_140C4EA90 - v27) >> 12) - 1i64) )
v17 = v12 + 8 * (((unsigned int)(dword_140C4EA90 - v27) >> 12) - 1i64);
}
else
{
v22 = 0;
}
if( v17 > (v12 & 0xFFFFFFFFFFFFF000ui64 | 0xFF8) )
v17 = v12 & 0xFFFFFFFFFFFFF000ui64 | 0xFF8;
for( i = v17; i > v12; i -= 8i64 )
{
if( MI_READ_PTE_LOCK_FREE(i) == v10 )
{
++v15;
}
else if( i == v17 )
{
v17 -= 8i64;
}
}
v24 = v17 - v30 + 8;
if( v24 < a4 )
v24 = a4;
v25 = v12 & 0xFFFFFFFFFFFFF000ui64;
if( v24 >= (v12 & 0xFFFFFFFFFFFFF000ui64) )
v25 = v24;
if( a3 || (*(_DWORD *)(a2 + 192) & 0x40) != 0 )
{
v26 = v12;
}
else
{
v26 = v25;
if( (*(_DWORD *)(v31 + 56) & 0x20000000) != 0 )
{
v28 = (v22 >> 12) & ((unsigned int)(dword_140C4EA90 - 1) >> 12);
if( v25 < v12 - 8 * v28 )
v26 = v12 - 8i64 * (unsigned int)v28;
}
}
v16 = v26;
while( v26 < v12 )
{
if( MI_READ_PTE_LOCK_FREE(v26) == v10 )
{
++v15;
}
else if( v26 == v16 )
{
v16 += 8i64;
}
v26 += 8i64;
}
LABEL_6:
v18 = v15 - 1;
if( a6 == -1 )
v18 = v15;
if( (_DWORD)v18 )
{
if( a6 == -1 )
v11 = 3;
v9 = MiObtainFaultCharges((_MI_PARTITION *)a1, v18, v11);
}
result = v9 + 1;
if( a6 == -1 )
result = v9;
*a7 = v16;
*a8 = v17;
return result;
}Referenced by:
MiResolveMappedFileFault