MiLockDriverPageRange

NTSTATUS __stdcall MiLockDriverPageRange(INT64 *a1, INT64 a2, UINT64 er8_0, UINT64 a4, CHAR a5, INT64 WsIrql){
  __int64 v7; 
  INT64 *v8; 
  INT64 v9; 
  NTSTATUS v10; 
  unsigned __int64 v11; 
  _MMPTE *PteBase; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  char *v15; 
  char v16; 
  unsigned __int64 v17; 
  INT64 v18; 
  UINT64 v19; 
  UINT64 v20; 
  unsigned __int64 v22; 
  _UNICODE_STRING *v23; 
  UINT8 v24; 
  wchar_t *v25; 
  __int64 v26; 
  _MMPFN *v27; 
  int v28; 
  NTSTATUS v29; 
  unsigned int v30; 
  UINT64 v31; 
  UINT64 v32; 
  _MMPTE v33; 
  _MI_PARTITION *v34; 
  PVOID VirtualAddress; 
  UINT64 SpinCount; 
  _MI_PARTITION *Partition; 
  INT64 v38; 
  INT64 v39; 
  _STRING FullName; 
  __int64 v41[18]; 
  unsigned int v43; 
  unsigned int v44; 
  char WsIrqla; 

  v44 = a4;
  v43 = er8_0;
  v7 = (unsigned int)er8_0;
  v8 = a1;
  memset(v41, 0i64, 0x60u);
  v9 = *v8;
  v10 = 0;
  *(_QWORD *)&FullName.Length = 0i64;
  Partition = 0i64;
  v11 = *(_QWORD *)(v9 + 48) + (v7 << 12);
  VirtualAddress = (PVOID)v11;
  PteBase = MmGetPteBase();
  v13 = (unsigned __int64)PteBase + ((v11 >> 9) & 0x7FFFFFFFF8i64);
  v14 = v13;
  if( (v8[7] & 2) != 0 )
    v14 = (unsigned __int64)PteBase + ((v13 >> 9) & 0x7FFFFFFFF8i64);
  FullName.Buffer = 0i64;
  v39 = (WsIrql + 48) & -(__int64)(WsIrql != 0);
LABEL_4:
  v15 = 0i64;
  MiLockWorkingSetShared();
  WsIrqla = v16;
LABEL_27:
  v17 = v43;
  while( (unsigned int)v17 <= v44 )
  {
    if( v15 )
    {
      if( (v13 & 0xFFF) != 0 )
        goto LABEL_11;
      MiUnlockPageTableInternal(a2, (UINT64)v15);
    }
    v15 = (char *)MmGetPteBase() + ((v14 >> 9) & 0x7FFFFFFFF8i64);
    MiLockPageTableInternal(a2, (UINT64)v15, 0i64);
    v17 = v43;
LABEL_11:
    if( v8[6] && v17 < v8[5] && _bittest64((const signed __int64 *)v8[6], v17) )
      goto LABEL_45;
    LODWORD(v18) = MI_READ_PTE_LOCK_FREE(v14);
    v38 = v18;
    if( (v18 & 1) != 0 )
    {
      LODWORD(v22) = MI_READ_PTE_LOCK_FREE((INT64)&v38);
      v26 = (v22 >> 12) & 0xFFFFFFFFFi64;
      if( (v8[7] & 2) != 0 )
        v26 += (v13 >> 3) & 0x1FF;
      v27 = &MmGetPfnDb()[v26];
      LOBYTE(v28) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v27, v23, v24, v25);
      if( !v28 )
      {
        if( _bittest64((const signed __int64 *)a1[4], v43) )
        {
          v8 = a1;
        }
        else
        {
          LODWORD(SpinCount) = 0;
          while( _interlockedbittestandset64((volatile signed __int32 *)&v27->u2, 0x3Fui64) )
          {
            do
              KeYieldProcessorEx(&SpinCount);
            while( v27->u2._bf_0 < 0 );
          }
          MiReferenceDriverPage((INT64)v27);
          if( (a5 & 1) != 0 && (((unsigned __int64)v27->u4._bf_0 >> 60) & 7) != 3 )
          {
            *(_QWORD *)&FullName.Length = VirtualAddress;
            KeSetPagePrivilege((_PREFIX_TABLE *)v26, &FullName, 256);
            *((_DWORD *)a1 + 14) |= 1u;
          }
          if( v39 )
            *(_QWORD *)(v39 + 8i64 * v43) = v26;
          MiCaptureDirtyBitToPfn();
          if( v33.u.Long )
          {
            v34 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v27->u4._bf_0 >> 39) & 0x3FF));
            Partition = v34;
          }
          else
          {
            v34 = Partition;
          }
          _InterlockedAnd64(&v27->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          if( v33.u.Long )
            MiReleasePageFileInfo(v34, v33, 1ui64);
          v8 = a1;
          _bittestandset64((signed __int64 *)a1[4], v43);
        }
        v11 = (unsigned __int64)VirtualAddress;
        goto LABEL_45;
      }
      if( (v27->u4._bf_0 & 0x1000000000i64) != 0 || (__int64)v27->ListEntry.Blink <= 0 )
      {
        MiUnlockPageTableInternal(a2, (UINT64)v15);
        LOBYTE(v32) = WsIrqla;
        MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)a2, v32);
        v8 = a1;
        MiMakeDriverPagesPrivate(
          (_KLDR_DATA_TABLE_ENTRY *)*a1,
          (_MMPTE *)v14,
          (_MMPTE *)(v14 + 8i64 * (v44 - v43)),
          8u,
          (UINT64)VirtualAddress);
        MiLockWorkingSetShared();
        MiLockPageTableInternal(a2, (UINT64)v15, 0i64);
        v11 = (unsigned __int64)VirtualAddress;
        goto LABEL_27;
      }
      v11 = (unsigned __int64)VirtualAddress;
      v29 = MiCopyOnWrite((UINT64)VirtualAddress, (INT64 *)v14, 0xFFFFFFFFFFFFFFFFui64, 0i64);
      v17 = v43;
      v30 = v29;
      if( v29 < 0 )
      {
        MiUnlockPageTableInternal(a2, (UINT64)v15);
        LOBYTE(v31) = WsIrqla;
        MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)a2, v31);
        MiCopyOnWriteCheckConditions(a2, v30);
        MiLockWorkingSetShared();
        MiLockPageTableInternal(a2, (UINT64)v15, 0i64);
        v8 = a1;
        goto LABEL_27;
      }
      v8 = a1;
    }
    else
    {
      MiUnlockPageTableInternal(a2, (UINT64)v15);
      LOBYTE(v19) = WsIrqla;
      MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)a2, v19);
      LOWORD(v41[0]) = 6;
      memset(&v41[1], 0, 32);
      if( MmAccessFault(0i64, (PVOID)v11, 0, (char *)v41 + 1) >= 0 )
        goto LABEL_4;
      MiLockWorkingSetShared();
      MiLockPageTableInternal(a2, (UINT64)v15, 0i64);
      if( (a5 & 2) == 0 )
      {
        v10 = -1073741701;
        break;
      }
LABEL_45:
      v11 += 4096i64;
      v17 = v43 + 1;
      v13 += 8i64;
      VirtualAddress = (PVOID)v11;
      ++v43;
      if( (v8[7] & 2) == 0 || (v13 & 0xFFF) == 0 )
        v14 += 8i64;
    }
  }
  MiUnlockPageTableInternal(a2, (UINT64)v15);
  LOBYTE(v20) = WsIrqla;
  MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)a2, v20);
  return v10;
}

Referenced by:

MiLockAndMapEntireDriver
MiLockHotPatchPages
MiLockHotPatchUndoPages
MmWriteSystemImageTracepoint