MxRelocatePageTables
VOID __stdcall MxRelocatePageTables(_LOADER_PARAMETER_BLOCK *LoaderBlock){
_MMPTE *PteBase;
_MMPTE *v3;
unsigned __int64 v4;
__int64 v5;
_MMPTE *v6;
_MMPTE *v7;
__int64 v8;
UINT64 v9;
UINT64 v10;
_MI_COLOR_BASE ColorBase[6];
UINT64 v12;
*(_OWORD *)ColorBase = 0i64;
MiInitializePageColorBase(0i64, 0i64, ColorBase);
PteBase = MmGetPteBase();
v3 = PteBase + 0x800000000i64;
v4 = (unsigned __int64)PteBase + (((unsigned __int64)MmPfnDatabase >> 9) & 0x7FFFFFFFF8i64);
v5 = 3i64;
do
{
v3 = (_MMPTE *)((char *)PteBase + (((unsigned __int64)v3 >> 9) & 0x7FFFFFFFF8i64));
v4 = (unsigned __int64)PteBase + ((v4 >> 9) & 0x7FFFFFFFF8i64);
--v5;
}
while( v5 );
if( (unsigned __int64)v3 < v4 )
MxMovePageTables(v3, (_MMPTE *)(v4 - 8), 3ui64, LoaderBlock, ColorBase);
v6 = (_MMPTE *)((char *)PteBase + ((((unsigned __int64)MmPfnDatabase + 4096 * MxPfnAllocation) >> 9) & 0x7FFFFFFFF8i64));
v7 = PteBase + 0xFFFFFFFFFi64;
v8 = 3i64;
do
{
v6 = (_MMPTE *)((char *)PteBase + (((unsigned __int64)v6 >> 9) & 0x7FFFFFFFF8i64));
v7 = (_MMPTE *)((char *)PteBase + (((unsigned __int64)v7 >> 9) & 0x7FFFFFFFF8i64));
--v8;
}
while( v8 );
if( v6 < v7 )
MxMovePageTables(v6 + 1, v7, 3ui64, LoaderBlock, ColorBase);
MxSwapPages(ColorBase, PteBase + 0xF78000000i64);
LODWORD(v9) = MI_READ_PTE_LOCK_FREE((INT64)&PteBase[0xF78000000i64]);
v12 = v9;
v10 = v9;
MiPteInShadowRange((UINT64)&v12);
MiIncrementPfn(&MmGetPfnDb()[(v10 >> 12) & 0xFFFFFFFFFi64]);
}Referenced by:
MiInitNucleus