MiGetHardFaultPages
VOID __fastcall 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;
UINT64 v16;
INT64 v17;
UINT64 v18;
unsigned int v19;
UINT64 v20;
_MI_PARTITION *v21;
_MMPFN *PageChain;
INT64 SlabPage;
__int64 v24;
_MMPFN *v25;
_MMPFN *v26;
UINT64 AvailablePagesBelowPriority;
UINT64 v28;
ULONG_PTR v29;
UINT64 v30;
unsigned int a4;
_MI_PARTITION *v32;
__int64 v33;
v32 = a3;
a4 = 0;
v8 = *(_MMPFN **)a1;
v9 = a3;
PfnDb = MmGetPfnDb();
if( *(_QWORD *)a1 )
{
v12 = (v8 - PfnDb) / 48;
while( 1 )
{
v24 = *((_QWORD *)v8 + 3) & 0xFFFFFFFFFi64;
if( v24 == 0xFFFFFFFFFi64 )
break;
v8 = (_MMPFN *)((char *)PfnDb + 48 * v24);
}
}
else
{
v12 = 0xFFFFFFFFFi64;
}
v13 = *(_QWORD *)(NumberOfPages + 208);
v14 = (*(unsigned __int16 *)(v13 + 32) >> 1) & 0x1F;
if( r9 )
{
if( *(_BYTE *)r9 == 1 )
{
AvailablePagesBelowPriority = MiGetAvailablePagesBelowPriority(a3, ((*(_DWORD *)(r9 + 80) >> 3) & 7u) + 1);
if( a2 > AvailablePagesBelowPriority )
{
if( !AvailablePagesBelowPriority )
return;
a2 = AvailablePagesBelowPriority;
}
}
}
v15 = MiUseSlabAllocator((INT64)v9, (_BYTE *)v13, a7, &a4);
v17 = a5;
if( v15 && *(_QWORD *)(a1 + 8) < a2 )
{
while( 1 )
{
LODWORD(v30) = 0;
SlabPage = MiGetSlabPage(v16, v14, a4, (INT64 *)(v17 + 120), v30);
v33 = SlabPage;
if( SlabPage == -1 )
break;
v25 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * SlabPage);
MiSetPfnBlink(v25, v12, 0i64);
v26 = v25;
v12 = v33;
v16 = (UINT64)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 = *(_QWORD *)(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,
v19,
v30,
0xFFFFFFFFFFFFFFFFui64,
&NumberOfPages);
if( PageChain )
{
if( *(_QWORD *)a1 )
MiSetPfnBlink(v8, (PageChain - PfnDb) / 48, 0i64);
else
*(_QWORD *)a1 = PageChain;
*(_QWORD *)(a1 + 8) += (unsigned int)NumberOfPages;
}
}
}Referenced by:
MiBuildMdlForMappedFileFault