MxMovePageTables
VOID __stdcall MxMovePageTables(
_MMPTE *PointerPxe,
_MMPTE *EndPxe,
UINT64 PagingLevel,
_LOADER_PARAMETER_BLOCK *LoaderBlock,
_MI_COLOR_BASE *ColorBase){
unsigned __int64 v5;
int v6;
__int64 v8;
unsigned __int64 v9;
__int64 v10;
_MI_COLOR_BASE *v11;
UINT64 v12;
UINT64 v13;
__int64 v14;
_MMPFN *v15;
int v16;
UINT64 v17;
UINT64 v18;
union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4;
unsigned __int64 v20;
_MMPTE *v21;
UINT64 v22;
__int64 v23[2];
UINT64 v24;
_LOADER_PARAMETER_BLOCK *LoaderBlocka;
LoaderBlocka = LoaderBlock;
v5 = (unsigned __int64)PointerPxe;
v6 = PagingLevel;
LODWORD(v8) = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + (((unsigned __int64)PointerPxe >> 9) & 0x7FFFFFFFF8i64));
v23[0] = v8;
v9 = v8;
MiPteInShadowRange((UINT64)v23);
v10 = (v9 >> 12) & 0xFFFFFFFFFi64;
if( v5 <= (unsigned __int64)EndPxe )
{
v11 = ColorBase;
while( 1 )
{
if( (v5 & 0xFFF) == 0 )
{
LODWORD(v20) = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((v5 >> 9) & 0x7FFFFFFFF8i64));
v23[0] = v20;
v10 = (v20 >> 12) & 0xFFFFFFFFFi64;
}
LODWORD(v12) = MI_READ_PTE_LOCK_FREE(v5);
v24 = v12;
v13 = v12;
if( (v12 & 1) == 0 || (_MMPTE *)v5 == MmGetPxeSelfRef() )
goto LABEL_11;
if( v6 && (v12 & 0x80u) != 0i64 )
{
v16 = 512;
LODWORD(v17) = MI_READ_PTE_LOCK_FREE(v5);
v24 = v17;
v18 = v17;
MiPteInShadowRange((UINT64)&v24);
p_u4 = &MmGetPfnDb()[(v18 >> 12) & 0xFFFFFFFFFi64].u4;
do
{
p_u4->_bf_0 = v10 & 0xFFFFFFFFFi64 | p_u4->_bf_0 & 0xFFFFFFF000000000ui64;
p_u4 += 6;
--v16;
}
while( v16 );
goto LABEL_11;
}
MiPteInShadowRange((UINT64)&v24);
v14 = (v13 >> 12) & 0xFFFFFFFFFi64;
if( v6 )
break;
if( MiIsRegularMemory(LoaderBlocka, v14) )
goto LABEL_10;
LABEL_11:
v5 += 8i64;
if( v5 > (unsigned __int64)EndPxe )
return;
}
MxSwapPages(v11, (_MMPTE *)v5);
v21 = (_MMPTE *)((__int64)((v5 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16);
MxMovePageTables(v21, v21 + 511, (unsigned int)(v6 - 1), LoaderBlocka, v11);
LODWORD(v22) = MI_READ_PTE_LOCK_FREE(v5);
v24 = v22;
v14 = (v22 >> 12) & 0xFFFFFFFFFi64;
LABEL_10:
v15 = &MmGetPfnDb()[v14];
v15->u4._bf_0 ^= (v15->u4._bf_0 ^ v10) & 0xFFFFFFFFFi64;
goto LABEL_11;
}
}Referenced by:
MxMovePageTables
MxRelocatePageTables