MiMakeHyperRangeAccessible

NTSTATUS __stdcall MiMakeHyperRangeAccessible(PVOID StartVa, PVOID EndVa, UINT64 *PagesCharged){
  UINT64 v3; 
  _EPROCESS *Process; 
  _MMSUPPORT_INSTANCE *p_Instance; 
  unsigned __int8 v8; 
  volatile __int32 *v9; 
  UINT8 v10; 
  int v11; 
  int v12; 
  _MMPTE *PteBase; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  _MMPTE *v21; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  _MMPTE *PteLimit; 
  _MMSUPPORT_FULL *AnyMultiplexedVm; 
  NTSTATUS v26; 
  INT64 v27; 
  _MMPTE *v28; 
  unsigned __int64 v29; 
  UINT64 v30; 
  unsigned __int64 v31; 
  UINT64 v32; 
  NTSTATUS result; 
  unsigned __int64 v34; 
  int v35; 
  UINT8 CurrentIrql; 
  INT64 v37; 
  __int64 v38; 
  unsigned __int64 v39; 
  _MMSUPPORT_INSTANCE *v40; 
  UINT64 *v41; 
  unsigned __int64 v42; 
  ULONG_PTR TargetProcess[2]; 
  __int128 v44; 
  __int64 v45; 
  unsigned __int64 v46; 
  _QWORD v47[22]; 

  v3 = 0i64;
  v41 = PagesCharged;
  HIDWORD(v37) = 0;
  v42 = 0i64;
  Process = KeGetCurrentThread()->ApcState.Process;
  *(_QWORD *)TargetProcess = Process;
  *PagesCharged = 0i64;
  LODWORD(v37) = 0;
  p_Instance = &Process->Vm.Instance;
  v8 = Process->Vm.Instance.Flags._bf_0 & 7;
  v40 = p_Instance;
  if( v8 >= 6u )
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
  }
  else
  {
    if( v8 == 2 )
      v9 = (volatile __int32 *)((char *)&stru_140C4DB30 + 6544);
    else
      v9 = (volatile __int32 *)&p_Instance[1];
    v10 = KeGetCurrentIrql();
    __writecr8(2ui64);
    _m_prefetchw((const void *)v9);
    v11 = *v9 & 0x7FFFFFFF;
    if( v11 != _InterlockedCompareExchange(v9, v11 + 1, v11) )
      ExpWaitForSpinLockSharedAndAcquire((INT64 *)v9, v10);
    if( *((_DWORD *)v9 + 1) )
      _InterlockedExchange(v9 + 1, 0);
    CurrentIrql = v10;
  }
  v12 = 0;
  v35 = 0;
  PteBase = MmGetPteBase();
  v14 = (unsigned __int64)PteBase + (((unsigned __int64)StartVa >> 9) & 0x7FFFFFFFF8i64);
  v46 = v14;
  v15 = (unsigned __int64)PteBase + (((unsigned __int64)EndVa >> 9) & 0x7FFFFFFFF8i64);
  while( 1 )
  {
    v38 = 0i64;
    v16 = 0i64;
    v39 = 0i64;
    v17 = 0i64;
    v18 = v14;
    if( v14 <= v15 )
    {
      v19 = (_QWORD)PteBase << 25;
      v45 = (_QWORD)PteBase << 25;
      v20 = (__int64)((v15 << 25) - ((_QWORD)PteBase << 25)) >> 16;
      while( 1 )
      {
        v44 = 0i64;
        memset((char *)v47 + 2, 0i64, 0xAEu);
        v21 = MmGetPteBase();
        LOWORD(v47[0]) = 2145;
        v22 = (__int64)((v18 << 25) - v19) >> 16;
        v23 = v22;
        if( v22 >= (unsigned __int64)v21 )
        {
          PteLimit = MmGetPteLimit();
          do
          {
            if( v23 > (unsigned __int64)PteLimit )
              break;
            v23 = (__int64)((v23 << 25) - v19) >> 16;
          }
          while( v23 >= (unsigned __int64)v21 );
          p_Instance = v40;
        }
        if( v23 >= 0xFFFF800000000000ui64 && (v23 < *(&stru_140C4DB30 + 937) || v23 > *(&stru_140C4DB30 + 175)) )
          AnyMultiplexedVm = (_MMSUPPORT_FULL *)MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemViews, v21);
        else
          AnyMultiplexedVm = &KeGetCurrentThread()->ApcState.Process->Vm;
        v26 = MiFastLockLeafPageTable((INT64)AnyMultiplexedVm, v22);
        if( v26 )
        {
          LODWORD(v44) = v26 - 1;
          v28 = MmGetPteBase();
          v29 = (unsigned __int64)v28 + ((v22 >> 9) & 0x7FFFFFFFF8i64);
          *((_QWORD *)&v44 + 1) = v29;
        }
        else
        {
          LOWORD(v47[0]) |= 4u;
          v47[21] = &v44;
          v47[2] = 0i64;
          v47[3] = AnyMultiplexedVm;
          BYTE2(v47[0]) = BYTE2(v47[0]) & 0xE3 | 4;
          v47[20] = MiGetNextPageTableTail;
          BYTE6(v47[0]) = CurrentIrql;
          v47[4] = v22;
          v47[5] = v20;
          MiWalkPageTables((INT64)v47);
          v29 = *((_QWORD *)&v44 + 1);
          v28 = MmGetPteBase();
        }
        if( v29 )
        {
          v30 = (UINT64)v28 + ((v29 >> 9) & 0x7FFFFFFFF8i64);
          if( v29 == v18 )
          {
            v31 = v15;
            if( (v18 & 0xFFFFFFFFFFFFF000ui64) + 4088 <= v15 )
              v31 = (v18 & 0xFFFFFFFFFFFFF000ui64) + 4088;
            if( v18 <= v31 )
            {
              do
              {
                if( !*(_QWORD *)v18 )
                  MiMakeHyperPteDemandZero((UINT64 *)v18, v27, (INT64)&v37);
                v18 += 8i64;
              }
              while( (v18 & 0xFFF) != 0 && v18 <= v31 );
              p_Instance = v40;
              v3 = 0i64;
            }
            MiUnlockPageTableInternal((INT64)p_Instance, v30);
            goto LABEL_33;
          }
          MiUnlockPageTableInternal((INT64)p_Instance, (UINT64)v28 + ((v29 >> 9) & 0x7FFFFFFFF8i64));
          v34 = v29 - 8;
        }
        else
        {
          v34 = v15;
        }
        MiFillHyperPtes(v18, v34, CurrentIrql, (INT64)&v37);
        v18 = v34 + 8;
LABEL_33:
        v19 = v45;
        if( v18 > v15 )
        {
          v16 = v39;
          v17 = v38;
          v12 = v35;
          break;
        }
      }
    }
    if( v12 || !v17 )
      break;
    MiUnlockWorkingSetShared(p_Instance, CurrentIrql);
    v42 = v16;
    result = MiChargeFullProcessCommitment(TargetProcess[0], v17 + v16);
    if( result < 0 )
      return result;
    LODWORD(v37) = 1;
    *v41 = v17;
    MiLockWorkingSetShared();
    v14 = v46;
    v12 = 1;
    v35 = 1;
    PteBase = MmGetPteBase();
  }
  if( v16 )
  {
    _InterlockedExchangeAdd64((volatile signed __int64 *)&MiGetSharedVm(p_Instance)->ChargedWslePages, v16);
    v16 = v39;
    v17 = v38;
  }
  MiUnlockWorkingSetShared(p_Instance, CurrentIrql);
  v32 = *v41;
  if( v17 != *v41 )
  {
    *v41 = v17;
    v3 = v32 - v17;
  }
  if( v16 != v42 )
    v3 += v42 - v16;
  if( v3 )
    MiReturnFullProcessCommitment(*(_EPROCESS **)TargetProcess, v3);
  return 0;
}

Referenced by:

MiCommitPageTablesForVad
MiExpandVadBitMap
MiExpandVadBitMapDown