MiCreateSharedZeroPages
__int64 __fastcall MiCreateSharedZeroPages(int *a1, unsigned __int64 *a2){
UINT64 *v2;
__int64 v4;
UINT64 v6;
UINT64 v7;
unsigned int v8;
unsigned int v9;
_MI_PARTITION *v10;
_MMPFN *PageChain;
int v12;
unsigned __int64 v13;
unsigned int v14;
_MMPFN *PfnDb;
_RTL_BITMAP_EX *v16;
__int64 v17;
__int64 v18;
unsigned int v19;
int v20;
unsigned __int64 v22;
__int64 v23;
_MMPFN *ClusterPage;
unsigned int v25;
UINT8 *SuboptimalPage;
_QWORD *a1a;
int v28;
UINT64 v29;
v2 = (UINT64 *)*((_QWORD *)a1 + 3);
v4 = *((_QWORD *)a1 + 8);
v6 = *((_QWORD *)a1 + 2);
v7 = (UINT64)v2;
v8 = (*(_DWORD *)v2 >> 5) & 0x1F;
if( v4 )
{
v22 = *(unsigned int *)(v4 + 48);
if( (v22 & 0x100000) == 0 && MiVadPageSizes[(v22 >> 18) & 3] == 16 )
{
LODWORD(SuboptimalPage) = a1[9];
ClusterPage = MiGetClusterPage((_MMVAD *)v4, (VOID *)v6, *a2, (unsigned int)a1[8], SuboptimalPage);
PageChain = ClusterPage;
if( ClusterPage )
{
if( (*((_QWORD *)ClusterPage + 3) & 0xFFFFFFFFFi64) == 0xFFFFFFFFFi64 )
{
*a2 = 1i64;
}
else
{
*a2 = 16i64;
v25 = (unsigned int)v6 >> 12;
v6 &= 0xFFFFFFFFFFFF0000ui64;
*((_QWORD *)a1 + 2) = v6;
v2 -= v25 & 0xF;
}
goto LABEL_3;
}
v7 = *((_QWORD *)a1 + 3);
*a2 = 1i64;
}
}
MiSharedVaToPartition(*(_QWORD *)(*((_QWORD *)a1 + 1) + 56i64), v6, v7);
v9 = MiProtectionToCacheAttribute(v8);
LODWORD(SuboptimalPage) = 258;
PageChain = MiGetPageChain(
v10,
*(_MMSUPPORT_INSTANCE **)(*((_QWORD *)a1 + 1) + 56i64),
(unsigned int)a1[12],
v9,
(UINT64)SuboptimalPage,
0xFFFFFFFFFFFFFFFFui64,
a2);
if( !PageChain )
return 3221225495i64;
LABEL_3:
v12 = 0;
a1a = (_QWORD *)*((_QWORD *)a1 + 7);
v28 = 0;
if( v4 )
{
v23 = *(unsigned int *)(v4 + 52);
LODWORD(v23) = v23 & 0x7FFFFFFF;
if( (v23 | ((unsigned __int64)*(unsigned __int8 *)(v4 + 34) << 31)) == 0x7FFFFFFFEi64 )
{
v12 = 64;
v28 = 64;
}
}
v13 = v6 & 0xFFFFFFFFFFFFF000ui64;
v14 = 0;
if( *a2 )
{
PfnDb = MmGetPfnDb();
do
{
v16 = (_RTL_BITMAP_EX *)PageChain;
v17 = *((_QWORD *)PageChain + 3) & 0xFFFFFFFFFi64;
v29 = (UINT64)PageChain;
if( v17 == 0xFFFFFFFFFi64 )
PageChain = 0i64;
else
PageChain = (_MMPFN *)((char *)PfnDb + 48 * v17);
v18 = ((char *)v16 - (char *)PfnDb) / 48;
if( (MiFlags & 0x80u) != 0 && (++dword_140C4E50C & MmPageValidationFrequency) == 0 )
{
MiArePageContentsZero((PVOID)v18);
v12 = v28;
v16 = (_RTL_BITMAP_EX *)v29;
}
v19 = (*(_DWORD *)v2 >> 5) & 0x1F;
if( v19 == 24 )
v19 = 1;
v20 = v12 | 0x112;
v28 = v20;
if( (*a1 & 4) != 0 || ((v19 - 4) & 0xFFFFFFFD) != 0 )
v28 = v20 | 0x20;
MiInitializePfn(v16, v2, v19);
*v2 = MiMakeValidPte((UINT64)v2, v18, v19 | 0x20000000);
if( (*a1 & 4) != 0 )
{
MiLockAndDecrementShareCount(v29, 0);
if( a1a )
{
if( (*a1 & 8) == 0 && v13 == *(_QWORD *)(a1a[1] + 16i64 * a1a[3]) + (a1a[4] << 12) )
MiAdvanceFaultList(a1a);
}
}
v12 = v28;
++v14;
v13 += 4096i64;
++v2;
PfnDb = MmGetPfnDb();
}
while( v14 < *a2 );
}
return 273i64;
}Referenced by:
MiResolveDemandZeroFault