MiMapWithLargePages
VOID __fastcall MiMapWithLargePages(INT64 a1, UINT64 a2, UINT64 a3, UINT64 a4, INT64 a5, CHAR a6, INT64 a7){
_MMPTE *PteBase;
unsigned __int64 v9;
unsigned __int64 v10;
INT64 v11;
int v12;
UINT64 v13;
UINT64 v14;
UINT64 v15;
int v16;
unsigned int v17;
unsigned __int64 v18;
UINT64 v19;
char *v20;
char *v21;
UINT64 v22;
char v23;
UINT8 v24;
UINT64 *v25;
unsigned __int64 v26;
UINT64 ValidPte;
__int64 v28;
INT64 *SharedVm;
UINT64 v32;
CHAR v33;
PteBase = MmGetPteBase();
v9 = MiLargePageSizes[(unsigned int)a5];
v10 = a3;
v11 = a1;
v12 = a6 & 7;
v32 = a4 / v9;
v13 = a4 / v9;
v14 = v9 * (a4 / v9);
v15 = (UINT64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
if( v10 <= 0xFFFFFFFFFi64 && ((*((_QWORD *)MmGetPfnDb() + 6 * v10 + 5) >> 50) & 1) != 0 )
v16 = *((unsigned __int8 *)MmGetPfnDb() + 48 * v10 + 34) >> 6;
else
v16 = a7;
if( v16 )
{
if( v16 == 2 )
v12 |= 0x18u;
}
else
{
v12 |= 8u;
}
v17 = v12 | 0xA0000000;
if( a4 % v9 )
{
v25 = (UINT64 *)(v15 + 8 * v14);
v26 = v15 + 8 * a4;
ValidPte = MiMakeValidPte(0i64, v14 + v10, v17);
if( (unsigned __int64)v25 < v26 )
{
do
{
*v25++ = ValidPte;
ValidPte ^= (ValidPte ^ (ValidPte + 4096)) & 0xFFFFFFFFF000i64;
}
while( (unsigned __int64)v25 < v26 );
v11 = a1;
PteBase = MmGetPteBase();
}
v13 = v32;
v10 = a3;
}
v18 = (unsigned __int64)PteBase + ((v15 >> 9) & 0x7FFFFFFFF8i64);
if( !(_DWORD)a5 )
{
v28 = 1i64;
do
{
v18 = (unsigned __int64)PteBase + ((v18 >> 9) & 0x7FFFFFFFF8i64);
--v28;
}
while( v28 );
}
v19 = MiMakeValidPte(0i64, v10, v17 | 0x4000000);
v20 = 0i64;
v21 = (char *)(v18 + 8 * v13);
v22 = v19;
if( (_DWORD)a5 )
{
v23 = MiLockWorkingSetShared(v11);
}
else
{
SharedVm = MiGetSharedVm(v11);
v23 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
*((_DWORD *)SharedVm + 1) = 0;
}
v33 = v23;
v24 = v23;
if( v18 < (unsigned __int64)v21 )
{
while( 1 )
{
if( (_DWORD)a5 )
{
if( !v20 )
goto LABEL_20;
if( (v18 & 0xFFF) == 0 )
break;
}
LABEL_14:
*(_QWORD *)v18 = v22;
v18 += 8i64;
v22 ^= (v22 ^ ((v9 << 12) + v22)) & 0xFFFFFFFFF000i64;
if( v18 >= (unsigned __int64)v21 )
{
v24 = v33;
goto LABEL_16;
}
}
MiUnlockPageTableInternal(v11, (UINT64)v20);
LABEL_20:
v20 = (char *)MmGetPteBase() + ((v18 >> 9) & 0x7FFFFFFFF8i64);
MiLockPageTableInternal(v11, (UINT64)v20, 0i64);
goto LABEL_14;
}
LABEL_16:
if( (_DWORD)a5 )
{
if( v20 )
MiUnlockPageTableInternal(v11, (UINT64)v20);
MiUnlockWorkingSetShared(v11, v24);
}
else
{
MiUnlockWorkingSetExclusive(v11, v24);
}
}Referenced by:
MiInsertInSystemSpace
MiMapContiguousMemoryLarge
MiMapSystemImageWithLargePage