MiMapLockedPagesInUserSpaceHelper
VOID __fastcall MiMapLockedPagesInUserSpaceHelper(
VOID *Va,
UINT64 *Page,
UINT64 *OldPage,
_MEMORY_CACHING_TYPE CacheType,
UINT64 NumberOfPages,
_MMVAD *Vad,
UINT64 Priority){
INT64 v9;
UINT64 v10;
unsigned int v11;
unsigned int v12;
INT64 v13;
char *v14;
UINT8 v15;
unsigned int v16;
_MMPFN *PfnDb;
char v18;
INT64 v19;
INT64 v20;
int v21;
INT64 v22;
INT64 v23;
CHAR v24;
signed __int64 v26;
v9 = *((_QWORD *)KeGetCurrentThread() + 23);
v10 = (UINT64)MmGetPteBase() + (((unsigned __int64)Va >> 9) & 0x7FFFFFFFF8i64);
v11 = (((int)Priority >> 31) & 0xFFFFFFFD) + 4;
if( CacheType )
{
if( CacheType == MmWriteCombined )
v11 |= 0x18u;
}
else
{
v11 |= 8u;
}
v12 = (unsigned int)Vad;
v13 = v9 + 1664;
if( Vad )
{
MiInsertVad((INT64)Vad, v9, 1);
v12 = (*((_DWORD *)Vad + 12) >> 12) & 0x3F;
}
v14 = 0i64;
v15 = MiLockWorkingSetShared(v13);
v26 = (char *)Page - (((unsigned __int64)Va >> 9) & 0x7FFFFFFFF8i64) - (char *)MmGetPteBase();
do
{
v16 = v11;
if( OldPage )
{
PfnDb = MmGetPfnDb();
v16 = (unsigned __int8)*((_DWORD *)PfnDb + 12 * *OldPage + 4) >> 5;
v18 = *((_BYTE *)PfnDb + 48 * *OldPage + 34) >> 6;
if( v18 == 2 )
{
v16 |= 0x18u;
}
else if( !v18 )
{
v16 |= 8u;
}
++OldPage;
}
if( !v14 )
goto LABEL_23;
if( (v10 & 0xFFF) == 0 )
{
MiUnlockPageTableInternal(v13, (UINT64)v14);
LABEL_23:
v14 = (char *)MmGetPteBase() + ((v10 >> 9) & 0x7FFFFFFFF8i64);
MiMakeSystemAddressValid(v10, 0i64, v12, v15, 0);
}
MiInsertPhysicalPteMapping(v10, *(_QWORD *)(v26 + v10), v16);
v10 += 8i64;
if( (v10 & 0x78) == 0 )
{
if( MiWorkingSetIsContended(v13)
|| (MiPageTableLockIsContended(v13, (UINT64)v14, v19, v20, v22, v23, v24), v21)
|| KeShouldYieldProcessor() )
{
MiUnlockPageTableInternal(v13, (UINT64)v14);
MiUnlockWorkingSetShared(v13, v15);
v14 = 0i64;
MiLockWorkingSetShared(v13);
}
}
--NumberOfPages;
}
while( NumberOfPages );
if( v14 )
MiUnlockPageTableInternal(v13, (UINT64)v14);
MiUnlockWorkingSetShared(v13, v15);
}Referenced by:
MiMapLockedPagesInUserSpace
MmRotatePhysicalView