MiLockPageTableRange
NTSTATUS __stdcall MiLockPageTableRange(PVOID StartVirtualAddress, PVOID LastVirtualAddress){
_MMPTE *PteBase;
INT64 v4;
char *v5;
UINT64 v6;
char *v7;
UINT8 v8;
unsigned __int64 *v9;
unsigned __int64 v10;
PteBase = MmGetPteBase();
v4 = *((_QWORD *)KeGetCurrentThread() + 23) + 1664i64;
v5 = (char *)PteBase + (((unsigned __int64)StartVirtualAddress >> 9) & 0x7FFFFFFFF8i64);
v6 = (UINT64)v5;
v7 = (char *)PteBase + (((unsigned __int64)LastVirtualAddress >> 9) & 0x7FFFFFFFF8i64);
v8 = MiLockWorkingSetShared(v4);
if( v5 > v7 )
{
LABEL_4:
MiUnlockWorkingSetShared(v4, v8);
return 0;
}
else
{
while( 1 )
{
v9 = (unsigned __int64 *)((char *)PteBase + ((v6 >> 9) & 0x7FFFFFFFF8i64));
MiMakeSystemAddressValid(v6, 0i64, 0i64, v8, 0);
v10 = *v9;
MiPteInShadowRange((UINT64)v9);
LODWORD(v10) = MiLockPageTablePage((_MMPFN *)((char *)MmGetPfnDb() + 48 * ((v10 >> 12) & 0xFFFFFFFFFi64)), 2i64);
MiUnlockPageTableInternal(v4, (UINT64)v9);
if( !(_DWORD)v10 )
break;
PteBase = MmGetPteBase();
v6 = (v6 & 0xFFFFFFFFFFFFF000ui64) + 4096;
if( v6 > (unsigned __int64)v7 )
goto LABEL_4;
}
MiUnlockWorkingSetShared(v4, v8);
if( (char *)v6 != v5 )
MiUnlockPageTableRange(
(UINT64 *)StartVirtualAddress,
(UINT64 *)((__int64)(((v6 - 8) << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16));
return -1073741670;
}
}Referenced by:
MmStoreAllocateVirtualMemory