MiLockPageTableRange
NTSTATUS __stdcall MiLockPageTableRange(PVOID StartVirtualAddress, PVOID LastVirtualAddress){
_MMPTE *PteBase;
_MMSUPPORT_FULL *p_Vm;
char *v5;
unsigned __int64 v6;
char *v7;
UINT64 v8;
UINT8 v9;
UINT8 v10;
unsigned __int64 *v11;
unsigned __int64 v12;
UINT64 v14;
PteBase = MmGetPteBase();
p_Vm = &KeGetCurrentThread()->ApcState.Process->Vm;
v5 = (char *)PteBase + (((unsigned __int64)StartVirtualAddress >> 9) & 0x7FFFFFFFF8i64);
v6 = (unsigned __int64)v5;
v7 = (char *)PteBase + (((unsigned __int64)LastVirtualAddress >> 9) & 0x7FFFFFFFF8i64);
MiLockWorkingSetShared();
v10 = v9;
if( v5 > v7 )
{
LABEL_4:
LOBYTE(v8) = v10;
MiUnlockWorkingSetShared(&p_Vm->Instance, v8);
return 0;
}
else
{
while( 1 )
{
LODWORD(v14) = 0;
v11 = (unsigned __int64 *)((char *)&PteBase->u.Long + ((v6 >> 9) & 0x7FFFFFFFF8i64));
MiMakeSystemAddressValid((VOID *)v6, 0i64, 0i64, v10, v14);
v12 = *v11;
MiPteInShadowRange((UINT64)v11);
LODWORD(v12) = MiLockPageTablePage(&MmGetPfnDb()[(v12 >> 12) & 0xFFFFFFFFFi64], PageTableLockPrivateFork);
MiUnlockPageTableInternal((INT64)p_Vm, (UINT64)v11);
if( !(_DWORD)v12 )
break;
PteBase = MmGetPteBase();
v6 = (v6 & 0xFFFFFFFFFFFFF000ui64) + 4096;
if( v6 > (unsigned __int64)v7 )
goto LABEL_4;
}
LOBYTE(v8) = v10;
MiUnlockWorkingSetShared(&p_Vm->Instance, v8);
if( (char *)v6 != v5 )
MiUnlockPageTableRange(
StartVirtualAddress,
(VOID *)((__int64)(((v6 - 8) << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16));
return -1073741670;
}
}Referenced by:
MmStoreAllocateVirtualMemory