MiUpdateForkMaps
_MMPTE *__stdcall MiUpdateForkMaps(
_MI_FORK_MAPS *ForkMapInfo,
_MMPTE *PointerPte,
_MMPTE *LastPte,
UINT64 *PrivatePageCount,
_EPROCESS *CurrentProcess,
UINT8 WsIrql){
_MMPTE *NextPageTable;
unsigned __int64 v9;
_MMPTE *PteBase;
__int64 v12;
__int64 v13;
__int64 v14;
unsigned __int64 v15;
UINT64 v16;
_MMPTE **v17;
int v18;
UINT64 v19;
UINT64 v20;
_MMPFN *v21;
char *v22;
UINT64 v23;
unsigned __int64 v24;
_MI_FORK_MAPS *v25;
UINT8 v26;
UINT64 MakeValid;
UINT64 MakeValida;
UINT64 v29;
__int64 v30;
_MMPTE *v31;
UINT64 v32[2];
__int128 v33;
UINT64 v34;
UINT64 *v35;
v35 = PrivatePageCount;
LODWORD(v34) = 0;
LODWORD(MakeValid) = 4;
*(_OWORD *)v32 = 0i64;
v33 = 0i64;
NextPageTable = MiGetNextPageTable(PointerPte, LastPte, 0i64, WsIrql, MakeValid, &v34, v29);
v31 = NextPageTable;
v9 = (unsigned __int64)NextPageTable;
if( !NextPageTable )
return LastPte + 1;
PteBase = MmGetPteBase();
v12 = (__int64)(((_QWORD)NextPageTable << 25) - ((_QWORD)PteBase << 25)) >> 16;
LODWORD(v13) = MI_IS_PHYSICAL_ADDRESS((VOID *)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 ^ *((_QWORD *)ForkMapInfo + 6)) & 0xFFFFFFFFFFFFF000ui64) != 0 )
{
MiFillPteHierarchy(v12, v32);
v16 = *(_QWORD *)ForkMapInfo;
v17 = (_MMPTE **)&v33 + 1;
*((_QWORD *)ForkMapInfo + 6) = v9;
v18 = 4;
v30 = 3i64;
v19 = *(_QWORD *)(v16 + 40) >> 12;
v20 = v19;
v21 = 0i64;
do
{
v22 = (char *)MiMapSinglePage(*((VOID **)ForkMapInfo + 7), v19, 0x40000020ui64)
+ 8 * ((*(_DWORD *)v17 >> 3) & 0x1FF);
LODWORD(v23) = MI_READ_PTE_LOCK_FREE((INT64)v22);
v29 = v23;
v24 = v23;
if( v23 )
{
if( (v23 & 1) != 0 )
{
MiPteInShadowRange((UINT64)&v29);
}
else if( *(&stru_140C4DB30 + 42) )
{
if( (v23 & 0x10) != 0 )
v24 = v23 & 0xFFFFFFFFFFFFFFEFui64;
else
v24 = ~*(&stru_140C4DB30 + 42) & v23;
}
v19 = (v24 >> 12) & 0xFFFFFFFFFi64;
}
else
{
v25 = &ForkMapInfo[2 * (4 - v18)];
MiDoneWithThisPageGetAnother((UINT64 *)v25 + 1, CurrentProcess, *(_QWORD *)ForkMapInfo);
v19 = *((_QWORD *)v25 + 1);
MiBuildForkPageTable(*(_QWORD *)ForkMapInfo, (_MMPTE *)v19, *v17, (UINT64)v22, v20);
++*v35;
if( v21 )
MiIncreaseUsedPtesCount(v21, (VOID *)1);
}
v21 = &MmGetPfnDb()[v19];
--v18;
--v17;
v20 = v19;
--v30;
}
while( v30 );
v15 = (unsigned __int64)MiMapSinglePage(*((VOID **)ForkMapInfo + 7), v19, 0x40000020ui64);
v9 = (unsigned __int64)v31;
*((_QWORD *)ForkMapInfo + 4) = v15;
*((_QWORD *)ForkMapInfo + 8) = v21;
}
else
{
v15 = *((_QWORD *)ForkMapInfo + 4);
}
v26 = WsIrql;
LODWORD(MakeValida) = 1;
*((_QWORD *)ForkMapInfo + 5) = v15 | v9 & 0xFFF;
MiMakeSystemAddressValid((VOID *)v9, 0i64, 0i64, v26, MakeValida);
}
return(_MMPTE *)v9;
}Referenced by:
MiCloneVads