MiLockPagedAddress

NTSTATUS __stdcall MiLockPagedAddress(VOID *VirtualAddress){
  _MMPTE *PteBase; 
  signed __int64 v3; 
  _MMPTE v4; 
  UINT64 v5; 
  _MMSUPPORT_INSTANCE *AnyMultiplexedVm; 
  UINT8 v7; 
  UINT8 v8; 
  UINT64 v9; 
  UINT64 v10; 
  _MMPFN *v11; 
  NTSTATUS v12; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v13; 
  char v14; 
  UINT64 v15; 
  UINT64 v17; 
  NTSTATUS v18; 
  void *v19; 
  NTSTATUS v20; 
  UINT64 v21; 
  UINT64 Flags; 
  UINT64 SpinCount; 
  UINT64 v24; 

  PteBase = MmGetPteBase();
  v3 = (signed __int64)PteBase + (((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64);
  v4.u.Long = 0i64;
  v5 = (UINT64)PteBase + (((unsigned __int64)v3 >> 9) & 0x7FFFFFFFF8i64);
  AnyMultiplexedVm = MiGetAnyMultiplexedVm(MiWorkingSetTypePagedPool, PteBase);
  MiLockWorkingSetShared();
  v8 = v7;
  while( 1 )
  {
    while( 1 )
    {
      LODWORD(Flags) = 4;
      MiMakeSystemAddressValid((VOID *)v3, 0i64, 0i64, v8, Flags);
      LODWORD(v9) = MI_READ_PTE_LOCK_FREE(v3);
      v24 = v9;
      v10 = v9;
      if( (v9 & 1) != 0 )
        break;
      MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v5);
      LOBYTE(v17) = v8;
      MiUnlockWorkingSetShared(AnyMultiplexedVm, v17);
      v18 = MmAccessFault(0i64, VirtualAddress, 0, 0i64);
      v19 = (void *)v18;
      if( v18 < 0 )
      {
        MiFlushAllFilesystemPages();
        KeBugCheckEx(0x7Au, (PVOID)2, v19, 0i64, VirtualAddress);
      }
LABEL_18:
      MiLockWorkingSetShared();
    }
    if( (v9 & 0x200) == 0 )
      break;
    v20 = MiCopyOnWrite(((v3 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16, (INT64 *)v3, 0xFFFFFFFFFFFFFFFFui64, 0i64);
    MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v5);
    if( v20 < 0 )
    {
      LOBYTE(v21) = v8;
      MiUnlockWorkingSetShared(AnyMultiplexedVm, v21);
      MiCopyOnWriteCheckConditions((INT64)AnyMultiplexedVm, (unsigned int)v20);
      goto LABEL_18;
    }
  }
  MiPteInShadowRange((UINT64)&v24);
  v11 = &MmGetPfnDb()[(v10 >> 12) & 0xFFFFFFFFFi64];
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&v11->u2, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( v11->u2._bf_0 < 0 );
  }
  if( MiAddLockedPageCharge(v11, 0i64) )
  {
    v12 = 1;
    MiCaptureDirtyBitToPfn();
    v4.u.Long = v13.Long;
  }
  else
  {
    v12 = 0;
  }
  _InterlockedAnd64(&v11->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  if( v12 )
  {
    if( v4.u.Long )
      MiReleasePageFileInfo(
        *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v11->u4._bf_0 >> 39) & 0x3FF)),
        v4,
        1ui64);
    v14 = MI_READ_PTE_LOCK_FREE(v3);
    if( (v14 & 0x20) == 0 || (v14 & 0x42) == 0 )
      MiWriteValidPteVolatile((_MMPTE *)v3, 3ui64);
    if( (MiFlags & 0x100) == 0 )
      KeFlushSingleTb((UINT64)VirtualAddress, FlushKernel, 1i64);
  }
  MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v5);
  LOBYTE(v15) = v8;
  MiUnlockWorkingSetShared(AnyMultiplexedVm, v15);
  return v12;
}

Referenced by:

MiLockPagedRange