MiInsertLargeUserMapping
CHAR __fastcall MiInsertLargeUserMapping(INT64 a1, UINT64 a2, INT64 a3, INT64 a4, INT64 a5){
_MMPTE *PteBase;
int v6;
unsigned __int64 v8;
__int64 v9;
unsigned __int64 v10;
INT64 v11;
UINT64 ValidPte;
unsigned int v13;
_MMPFN *UsedPtesHandle;
_ETHREAD *CurrentThread;
int v16;
PteBase = MmGetPteBase();
v6 = a4;
v8 = a2;
if( (_DWORD)a4 != 2 )
{
v9 = (unsigned int)(2 - a4);
do
{
v8 = (unsigned __int64)PteBase + ((v8 >> 9) & 0x7FFFFFFFF8i64);
--v9;
}
while( v9 );
}
v10 = 16i64;
v11 = (unsigned int)a5;
LODWORD(v11) = a5 | 0x80000000;
if( (*(_DWORD *)(a1 + 48) & 0x300000) == 3145728 )
v11 = (unsigned int)a5;
if( v6 != 2 )
v10 = 1i64;
if( v6 != 2 )
v11 = (unsigned int)v11 | 0x4000000;
ValidPte = MiMakeValidPte(a2, a3, v11);
v13 = 0;
if( (v8 < (unsigned __int64)MmGetPml4eBase() || v8 > (unsigned __int64)MmGetPml4eLimit())
&& !MI_READ_PTE_LOCK_FREE(v8) )
{
UsedPtesHandle = MiGetUsedPtesHandle((__int64)((v8 << 25) - ((_QWORD)PteBase << 25)) >> 16);
MiIncreaseUsedPtesCount(UsedPtesHandle, (unsigned int)v10);
}
if( v6 == 2 )
{
do
{
*(_QWORD *)v8 = ValidPte;
v8 += 8i64;
++v13;
ValidPte ^= (ValidPte ^ (ValidPte + 4096)) & 0xFFFFFFFFF000i64;
LOBYTE(CurrentThread) = v13;
}
while( v13 < v10 );
return(char)CurrentThread;
}
v16 = 0;
LODWORD(CurrentThread) = MiPteInShadowRange(v8);
if( (_DWORD)CurrentThread )
{
LODWORD(CurrentThread) = MiPteHasShadow();
if( (_DWORD)CurrentThread )
{
v16 = 1;
if( !HIBYTE(word_140C4DD48) )
{
LABEL_22:
if( (ValidPte & 1) != 0 )
{
LOBYTE(CurrentThread) = 0;
ValidPte |= 0x8000000000000000ui64;
}
}
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( (*(_DWORD *)(*((_QWORD *)CurrentThread + 23) + 2172i64) & 0x1000) != 0 )
goto LABEL_22;
}
}
*(_QWORD *)v8 = ValidPte;
if( v16 )
LOBYTE(CurrentThread) = MiWritePteShadow();
return(char)CurrentThread;
}Referenced by:
MiCommitExistingVad
MiMapUserLargePages