MiUpdateForkMaps
INT64 __fastcall MiUpdateForkMaps(INT64 *a1, INT64 a2, INT64 a3, INT64 a4, INT64 CurrentProcess, CHAR WsIrql){
__int64 v8;
unsigned __int64 v9;
_MMPTE *PteBase;
__int64 v12;
__int64 v13;
__int64 v14;
INT64 v15;
INT64 v16;
MMPTE **v17;
int v18;
UINT64 v19;
UINT64 MakeValid;
char *v21;
__int64 v22;
UINT64 v23;
INT64 v24;
unsigned __int64 v25;
INT64 *v26;
CHAR v27;
UINT64 v28;
__int64 v29;
__int64 v30;
UINT64 v31[2];
__int128 v32;
int v33;
_QWORD *v34;
v34 = (_QWORD *)a4;
v33 = 0;
*(_OWORD *)v31 = 0i64;
v32 = 0i64;
MiGetNextPageTable(a2, a3, 0i64, WsIrql, 4, &v33);
v30 = v8;
v9 = v8;
if( !v8 )
return a3 + 8;
PteBase = MmGetPteBase();
v12 = ((v8 << 25) - ((_QWORD)PteBase << 25)) >> 16;
LODWORD(v13) = MI_IS_PHYSICAL_ADDRESS((PVOID)v12);
if( (_DWORD)v13 )
{
v14 = (unsigned int)v13;
do
{
v9 = (unsigned __int64)PteBase + ((v9 >> 9) & 0x7FFFFFFFF8i64);
--v14;
}
while( v14 );
v9 += 8i64;
v13 = (unsigned int)v13;
do
{
v9 = (__int64)((v9 << 25) - ((_QWORD)PteBase << 25)) >> 16;
--v13;
}
while( v13 );
}
else
{
if( ((v9 ^ a1[6]) & 0xFFFFFFFFFFFFF000ui64) != 0 )
{
MiFillPteHierarchy(v12, v31);
v16 = *a1;
v17 = (MMPTE **)&v32 + 1;
a1[6] = v9;
v18 = 4;
v29 = 3i64;
v19 = *(_QWORD *)(v16 + 40) >> 12;
MakeValid = v19;
v21 = 0i64;
do
{
LODWORD(v22) = MiMapSinglePage((PVOID)a1[7], v19, 0x40000020ui64);
v23 = v22 + 8i64 * ((*(_DWORD *)v17 >> 3) & 0x1FF);
v24 = MI_READ_PTE_LOCK_FREE(v23);
v28 = v24;
v25 = v24;
if( v24 )
{
if( (v24 & 1) != 0 )
{
MiPteInShadowRange((UINT64)&v28);
}
else if( qword_140C4DC80 )
{
if( (v24 & 0x10) != 0 )
v25 = v24 & 0xFFFFFFFFFFFFFFEFui64;
else
v25 = ~qword_140C4DC80 & v24;
}
v19 = (v25 >> 12) & 0xFFFFFFFFFi64;
}
else
{
v26 = &a1[4 - v18];
MiDoneWithThisPageGetAnother(v26 + 1, CurrentProcess, *a1, WsIrql);
v19 = v26[1];
MiBuildForkPageTable(*a1, (MMPTE *)v19, *v17, v23, MakeValid);
++*v34;
if( v21 )
MiIncreaseUsedPtesCount(v21, 1ui64);
}
v21 = (char *)MmGetPfnDb() + 48 * v19;
--v18;
--v17;
MakeValid = v19;
--v29;
}
while( v29 );
LODWORD(v15) = MiMapSinglePage((PVOID)a1[7], v19, 0x40000020ui64);
v9 = v30;
a1[4] = v15;
a1[8] = (INT64)v21;
}
else
{
v15 = a1[4];
}
v27 = WsIrql;
a1[5] = v15 | v9 & 0xFFF;
MiMakeSystemAddressValid(v9, 0i64, 0i64, v27, 1);
}
return v9;
}Referenced by:
MiCloneVads