MxMovePageTables
int __fastcall MxMovePageTables(unsigned __int64 a1, unsigned __int64 a2, int a3, __int64 a4, __int64 a5){
unsigned __int64 v5;
UINT64 v8;
UINT64 PxeSelfRef;
UINT64 v10;
__int64 v11;
UINT64 v12;
UINT64 v13;
char *v14;
int v15;
UINT64 v16;
UINT64 *v17;
__int64 v18;
UINT64 v20[2];
UINT64 v21;
_LOADER_PARAMETER_BLOCK *LoaderBlock;
LoaderBlock = (_LOADER_PARAMETER_BLOCK *)a4;
v5 = a1;
v20[0] = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((a1 >> 9) & 0x7FFFFFFFF8i64));
v8 = v20[0];
LODWORD(PxeSelfRef) = MiPteInShadowRange((UINT64)v20);
v10 = (v8 >> 12) & 0xFFFFFFFFFi64;
if( v5 <= a2 )
{
v11 = a5;
while( 1 )
{
if( (v5 & 0xFFF) == 0 )
{
v20[0] = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((v5 >> 9) & 0x7FFFFFFFF8i64));
v10 = (v20[0] >> 12) & 0xFFFFFFFFFi64;
}
PxeSelfRef = MI_READ_PTE_LOCK_FREE(v5);
v21 = PxeSelfRef;
v12 = PxeSelfRef;
if( (PxeSelfRef & 1) == 0 )
goto LABEL_11;
PxeSelfRef = (UINT64)MmGetPxeSelfRef();
if( v5 == PxeSelfRef )
goto LABEL_11;
if( a3 && (v12 & 0x80u) != 0i64 )
{
v15 = 512;
v21 = MI_READ_PTE_LOCK_FREE(v5);
v16 = v21;
MiPteInShadowRange((UINT64)&v21);
v17 = (UINT64 *)((char *)MmGetPfnDb() + 48 * ((v16 >> 12) & 0xFFFFFFFFFi64) + 40);
do
{
PxeSelfRef = v10 & 0xFFFFFFFFFi64 | *v17 & 0xFFFFFFF000000000ui64;
*v17 = PxeSelfRef;
v17 += 6;
--v15;
}
while( v15 );
goto LABEL_11;
}
MiPteInShadowRange((UINT64)&v21);
v13 = (v12 >> 12) & 0xFFFFFFFFFi64;
if( a3 )
break;
LODWORD(PxeSelfRef) = MiIsRegularMemory(LoaderBlock, v13);
if( (_DWORD)PxeSelfRef )
goto LABEL_10;
LABEL_11:
v5 += 8i64;
if( v5 > a2 )
return PxeSelfRef;
}
MxSwapPages(v11, v5);
v18 = (__int64)((v5 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
MxMovePageTables(v18, v18 + 4088, a3 - 1, (__int64)LoaderBlock, v11);
v21 = MI_READ_PTE_LOCK_FREE(v5);
v13 = (v21 >> 12) & 0xFFFFFFFFFi64;
LABEL_10:
v14 = (char *)MmGetPfnDb() + 48 * v13;
PxeSelfRef = (*((_QWORD *)v14 + 5) ^ v10) & 0xFFFFFFFFFi64;
*((_QWORD *)v14 + 5) ^= PxeSelfRef;
goto LABEL_11;
}
return PxeSelfRef;
}Referenced by:
MxMovePageTables
MxRelocatePageTables