MiLockPagedAddress
UINT64 __stdcall MiLockPagedAddress(PVOID VirtualAddress){
_MMPTE *PteBase;
UINT64 v3;
UINT64 v4;
UINT64 v5;
CHAR *AnyMultiplexedVm;
UINT8 v7;
INT64 v8;
unsigned __int64 v9;
char *v10;
unsigned int v11;
char v12;
NTSTATUS v14;
ULONG_PTR v15;
int v16;
ULONG_PTR BugCheckParameter4;
INT64 v18;
INT64 v19;
INT64 v20;
INT64 v21;
INT64 v22;
INT64 v23;
INT64 v24;
UINT64 SpinCount;
UINT64 v26;
PteBase = MmGetPteBase();
v3 = (UINT64)PteBase + (((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64);
v4 = 0i64;
v5 = (UINT64)PteBase + ((v3 >> 9) & 0x7FFFFFFFF8i64);
AnyMultiplexedVm = MiGetAnyMultiplexedVm(2i64);
v7 = MiLockWorkingSetShared((INT64)AnyMultiplexedVm);
while( 1 )
{
while( 1 )
{
MiMakeSystemAddressValid(v3, 0i64, 0i64, v7, 4);
v8 = MI_READ_PTE_LOCK_FREE(v3);
v26 = v8;
v9 = v8;
if( (v8 & 1) != 0 )
break;
MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v5);
MiUnlockWorkingSetShared((INT64)AnyMultiplexedVm, v7);
v14 = MmAccessFault(0i64, VirtualAddress, 0, 0i64);
v15 = v14;
if( v14 < 0 )
{
MiFlushAllFilesystemPages();
KeBugCheckEx(0x7Au, 2ui64, v15, 0i64, (ULONG_PTR)VirtualAddress);
}
LABEL_18:
MiLockWorkingSetShared((INT64)AnyMultiplexedVm);
}
if( (v8 & 0x200) == 0 )
break;
v16 = MiCopyOnWrite((__int64)((v3 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16, (UINT64 *)v3, -1i64, 0i64);
MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v5);
if( v16 < 0 )
{
MiUnlockWorkingSetShared((INT64)AnyMultiplexedVm, v7);
MiCopyOnWriteCheckConditions((INT64)AnyMultiplexedVm, (unsigned int)v16);
goto LABEL_18;
}
}
MiPteInShadowRange((UINT64)&v26);
v10 = (char *)MmGetPfnDb() + 48 * ((v9 >> 12) & 0xFFFFFFFFFi64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v10 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v10 + 3) < 0 );
}
if( (unsigned int)MiAddLockedPageCharge((INT64)v10, 0) )
{
v11 = 1;
v4 = MiCaptureDirtyBitToPfn((INT64)v10);
}
else
{
v11 = 0;
}
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( v11 )
{
if( v4 )
MiReleasePageFileInfo(
*(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v10 + 5) >> 39) & 0x3FFi64)),
v4,
1,
(*((_QWORD *)v10 + 5) >> 39) & 0x3FFi64,
BugCheckParameter4,
v18,
v19,
v20,
v21,
v22,
v23,
v24);
v12 = MI_READ_PTE_LOCK_FREE(v3);
if( (v12 & 0x20) == 0 || (v12 & 0x42) == 0 )
MiWriteValidPteVolatile((MMPTE *)v3, 3ui64);
if( (MiFlags & 0x100) == 0 )
KeFlushSingleTb(VirtualAddress, 0i64, 1i64);
}
MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v5);
MiUnlockWorkingSetShared((INT64)AnyMultiplexedVm, v7);
return v11;
}Referenced by:
MiLockPagedRange