MiMapLockedPagesInUserSpaceHelper
VOID __stdcall MiMapLockedPagesInUserSpaceHelper(
VOID *Va,
UINT64 *Page,
UINT64 *OldPage,
_MEMORY_CACHING_TYPE CacheType,
UINT64 NumberOfPages,
_MMVAD *Vad,
UINT64 Priority){
_EPROCESS *Process;
UINT64 v10;
unsigned int v11;
unsigned int v12;
_MMSUPPORT_INSTANCE *p_Instance;
char *v14;
UINT8 v15;
UINT8 v16;
unsigned int v17;
_MMPFN *PfnDb;
char v19;
UINT64 v20;
int v21;
UINT64 v22;
UINT64 v23;
signed __int64 v25;
Process = KeGetCurrentThread()->ApcState.Process;
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;
p_Instance = &Process->Vm.Instance;
if( Vad )
{
MiInsertVad(Vad, Process);
v12 = (Vad->Core.u.LongFlags >> 12) & 0x3F;
}
v14 = 0i64;
MiLockWorkingSetShared();
v16 = v15;
v25 = (char *)Page - (((unsigned __int64)Va >> 9) & 0x7FFFFFFFF8i64) - (char *)MmGetPteBase();
do
{
v17 = v11;
if( OldPage )
{
PfnDb = MmGetPfnDb();
v17 = (unsigned __int8)*((_DWORD *)&PfnDb[*OldPage].3 + 4) >> 5;
v19 = *((_BYTE *)&PfnDb[*OldPage].u3 + 2) >> 6;
if( v19 == 2 )
{
v17 |= 0x18u;
}
else if( !v19 )
{
v17 |= 8u;
}
++OldPage;
}
if( !v14 )
goto LABEL_23;
if( (v10 & 0xFFF) == 0 )
{
MiUnlockPageTableInternal((INT64)p_Instance, (UINT64)v14);
LABEL_23:
LODWORD(v23) = 0;
v14 = (char *)MmGetPteBase() + ((v10 >> 9) & 0x7FFFFFFFF8i64);
MiMakeSystemAddressValid((VOID *)v10, 0i64, v12, v16, v23);
}
MiInsertPhysicalPteMapping(v10, *(_QWORD *)(v25 + v10), v17);
v10 += 8i64;
if( (v10 & 0x78) == 0 )
{
LOBYTE(v21) = MiWorkingSetIsContended((INT64)p_Instance);
if( v21
|| (unsigned int)MiPageTableLockIsContended((__int64)p_Instance, (UINT64)v14)
|| (unsigned int)KeShouldYieldProcessor() )
{
MiUnlockPageTableInternal((INT64)p_Instance, (UINT64)v14);
LOBYTE(v22) = v16;
MiUnlockWorkingSetShared(p_Instance, v22);
v14 = 0i64;
MiLockWorkingSetShared();
}
}
--NumberOfPages;
}
while( NumberOfPages );
if( v14 )
MiUnlockPageTableInternal((INT64)p_Instance, (UINT64)v14);
LOBYTE(v20) = v16;
MiUnlockWorkingSetShared(p_Instance, v20);
}Referenced by:
MiMapLockedPagesInUserSpace
MmRotatePhysicalView