MiGetHardFaultPages
VOID __stdcall MiGetHardFaultPages(
INT64 a1,
UINT64 a2,
_MI_PARTITION *a3,
INT64 r9,
INT64 a5,
UINT64 NumberOfPages,
INT64 a7){
_MMPFN *v8;
_MI_PARTITION *v9;
_MMPFN *PfnDb;
__int64 v12;
__int64 v13;
unsigned int v14;
int v15;
INT64 v16;
INT64 v17;
UINT64 v18;
_MI_PFN_CACHE_ATTRIBUTE v19;
UINT64 v20;
PVOID *v21;
_MMPFN *PageChain;
__int64 v23;
__int64 v24;
_MMPFN *v25;
_MMPFN *v26;
UINT64 v27;
UINT64 v28;
_SUBSECTION *v29;
UINT64 v30;
UINT64 v31;
_MI_PARTITION *v32;
__int64 v33;
v32 = a3;
LODWORD(v31) = 0;
v8 = *(_MMPFN **)a1;
v9 = a3;
PfnDb = MmGetPfnDb();
if( *(_QWORD *)a1 )
{
v12 = v8 - PfnDb;
while( 1 )
{
v24 = v8->u2._bf_0 & 0xFFFFFFFFFi64;
if( v24 == 0xFFFFFFFFFi64 )
break;
v8 = &PfnDb[v24];
}
}
else
{
v12 = 0xFFFFFFFFFi64;
}
v13 = *(_QWORD *)(NumberOfPages + 208);
v14 = (*(unsigned __int16 *)(v13 + 32) >> 1) & 0x1F;
if( r9 )
{
if( *(_BYTE *)r9 == 1 )
{
LODWORD(v27) = MiGetAvailablePagesBelowPriority(a3, ((*(_DWORD *)(r9 + 80) >> 3) & 7u) + 1);
if( a2 > v27 )
{
if( !v27 )
return;
a2 = v27;
}
}
}
v15 = MiUseSlabAllocator((__int64)v9, (_BYTE *)v13, a7, &v31);
v17 = a5;
if( v15 && *(_QWORD *)(a1 + 8) < a2 )
{
while( 1 )
{
LODWORD(v30) = 0;
LODWORD(v23) = MiGetSlabPage(v16, v14, (unsigned int)v31, (INT64 *)(v17 + 120), v30);
v33 = v23;
if( v23 == -1 )
break;
v25 = &MmGetPfnDb()[v23];
MiSetPfnBlink(v25, v12, 0i64);
v26 = v25;
v12 = v33;
v16 = (INT64)v32;
if( *(_QWORD *)a1 )
v26 = v8;
++*(_QWORD *)(a1 + 8);
v8 = v26;
*(_QWORD *)a1 = v25;
if( *(_QWORD *)(a1 + 8) >= a2 )
goto LABEL_15;
}
if( *(_QWORD *)(v17 + 120) )
{
v28 = NumberOfPages;
*(_QWORD *)(v17 + 128) = a2 - *(_QWORD *)(a1 + 8);
v29 = *(_SUBSECTION **)(v28 + 208);
*(_QWORD *)(v17 + 104) = v29;
MiRetainSubsection(v29);
a2 = *(_QWORD *)(a1 + 8);
}
LABEL_15:
PfnDb = MmGetPfnDb();
}
v18 = *(_QWORD *)(a1 + 8);
if( v18 < a2 )
{
NumberOfPages = a2 - v18;
v19 = MiProtectionToCacheAttribute(v14);
LODWORD(v30) = 0;
PageChain = MiGetPageChain(
v21,
*(_MMSUPPORT_INSTANCE **)(v17 + 56),
v20,
(unsigned int)v19,
v30,
0xFFFFFFFFFFFFFFFFui64,
&NumberOfPages);
if( PageChain )
{
if( *(_QWORD *)a1 )
MiSetPfnBlink(v8, PageChain - PfnDb, 0i64);
else
*(_QWORD *)a1 = PageChain;
*(_QWORD *)(a1 + 8) += (unsigned int)NumberOfPages;
}
}
}Referenced by:
MiBuildMdlForMappedFileFault