MiMakeHyperRangeAccessible

NTSTATUS __stdcall MiMakeHyperRangeAccessible(PVOID StartVa, PVOID EndVa, UINT64 *PagesCharged){
  unsigned __int64 v3; 
  ULONG_PTR v6; 
  INT64 v7; 
  unsigned __int8 v8; 
  LONG *v9; 
  UINT8 v10; 
  int v11; 
  int v12; 
  _MMPTE *PteBase; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  UINT64 v18; 
  __int64 v19; 
  __int64 v20; 
  _MMPTE *v21; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  _MMPTE *PteLimit; 
  CHAR *AnyMultiplexedVm; 
  int v26; 
  INT64 v27; 
  _MMPTE *v28; 
  unsigned __int64 v29; 
  UINT64 v30; 
  unsigned __int64 v31; 
  UINT64 v32; 
  NTSTATUS result; 
  UINT64 v34; 
  int v35; 
  UINT8 CurrentIrql; 
  INT64 a4; 
  __int64 v38; 
  unsigned __int64 v39; 
  INT64 v40; 
  UINT64 *v41; 
  unsigned __int64 v42; 
  ULONG_PTR v43; 
  __int128 v44; 
  __int64 v45; 
  unsigned __int64 v46; 
  __int16 v47; 
  _BYTE v48[14]; 
  __int64 v49; 
  CHAR *v50; 
  unsigned __int64 v51; 
  __int64 v52; 
  INT64(__fastcall *v53)(INT64); 
  __int128 *v54; 
  v3 = 0i64;
  v41 = PagesCharged;
  HIDWORD(a4) = 0;
  v42 = 0i64;
  v6 = *((_QWORD *)KeGetCurrentThread() + 23);
  v43 = v6;
  *PagesCharged = 0i64;
  LODWORD(a4) = 0;
  v7 = v6 + 1664;
  v8 = *(_BYTE *)(v6 + 1848) & 7;
  v40 = v7;
  if( v8 >= 6u )
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
  }
  else
  {
    if( v8 == 2 )
      v9 = &dword_140C4F4C0;
    else
      v9 = (LONG *)(v7 + 192);
    v10 = KeGetCurrentIrql();
    __writecr8(2ui64);
    _m_prefetchw(v9);
    v11 = *v9 & 0x7FFFFFFF;
    if( v11 != _InterlockedCompareExchange(v9, v11 + 1, v11) )
      ExpWaitForSpinLockSharedAndAcquire((INT64 *)v9, v10);
    if( 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((INT64)v48, 0i64);
        v21 = MmGetPteBase();
        v47 = 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 );
          v7 = v40;
        }
        if( v23 >= 0xFFFF800000000000ui64 && (v23 < qword_140C4F878 || v23 > qword_140C4E0A8) )
          AnyMultiplexedVm = MiGetAnyMultiplexedVm(1i64);
        else
          AnyMultiplexedVm = (CHAR *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1664i64);
        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
        {
          v47 |= 4u;
          v54 = &v44;
          v49 = 0i64;
          v50 = AnyMultiplexedVm;
          v48[0] = v48[0] & 0xE3 | 4;
          v53 = MiGetNextPageTableTail;
          v48[4] = CurrentIrql;
          v51 = v22;
          v52 = 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)&a4);
                v18 += 8i64;
              }
              while( (v18 & 0xFFF) != 0 && v18 <= v31 );
              v7 = v40;
              v3 = 0i64;
            }
            MiUnlockPageTableInternal(v7, v30);
            goto LABEL_33;
          }
          MiUnlockPageTableInternal(v7, (UINT64)v28 + ((v29 >> 9) & 0x7FFFFFFFF8i64));
          v34 = v29 - 8;
        }
        else
        {
          v34 = v15;
        }
        MiFillHyperPtes(v18, v34, CurrentIrql, (INT64)&a4);
        v18 = v34 + 8;
LABEL_33:
        v19 = v45;
        if( v18 > v15 )
        {
          v16 = v39;
          v17 = v38;
          v12 = v35;
          break;
        }
      }
    }
    if( v12 || !v17 )
      break;
    MiUnlockWorkingSetShared(v7, CurrentIrql);
    v42 = v16;
    result = MiChargeFullProcessCommitment(v43, v17 + v16);
    if( result < 0 )
      return result;
    LODWORD(a4) = 1;
    *v41 = v17;
    MiLockWorkingSetShared(v7);
    v14 = v46;
    v12 = 1;
    v35 = 1;
    PteBase = MmGetPteBase();
  }
  if( v16 )
  {
    _InterlockedExchangeAdd64(MiGetSharedVm(v7) + 6, v16);
    v16 = v39;
    v17 = v38;
  }
  MiUnlockWorkingSetShared(v7, CurrentIrql);
  v32 = *v41;
  if( v17 != *v41 )
  {
    *v41 = v17;
    v3 = v32 - v17;
  }
  if( v16 != v42 )
    v3 += v42 - v16;
  if( v3 )
    MiReturnFullProcessCommitment(v43, v3);
  return 0;
}

Referenced by:

MiCommitPageTablesForVad
MiExpandVadBitMap
MiExpandVadBitMapDown