MiMakeVaRangeNoAccess

__int64 __fastcall MiMakeVaRangeNoAccess(
        __int64 a1,
        unsigned __int64 a2,
        unsigned __int64 a3,
        __int64 a4,
        int a5,
        _DWORD *a6){
  unsigned int v10; 
  __int64 v11; 
  INT64 v12; 
  bool v13; 
  unsigned __int64 v14; 
  BOOL v15; 
  unsigned int v16; 
  unsigned __int64 v17; 
  UINT64 v18; 
  unsigned __int64 v19; 
  void *LeafVa; 
  char v22; 
  __int64 v23; 
  _MMSUPPORT_INSTANCE *v24; 
  __int64 v25; 
  _MMPFN *PfnDb; 
  unsigned __int64 v27; 
  UNICODE_STRING *v28; 
  UINT8 v29; 
  PWCHAR v30; 
  int v31; 
  INT64 v32; 
  BOOL v33; 
  INT64 TransitionPte; 
  _MMVAD_SHORT *Vad; 
  INT64 v36; 
  unsigned __int64 v37; 
  unsigned __int64 v38; 
  int result; 
  __int16 result_4; 
  int v41; 
  int v42; 
  __int64 v43; 
  __int64 v44; 
  Vad = (_MMVAD_SHORT *)a1;
  v36 = (INT64)a6;
  memset((INT64)&result, 0i64);
  v10 = *(_DWORD *)(a1 + 48);
  if( (v10 & 0x500000) != 5242880 || (v11 = (v10 >> 18) & 3, v12 = MiVadPageSizes[v11], v12 == 1) )
  {
    v22 = 0;
    v23 = *((_QWORD *)KeGetCurrentThread() + 23);
    v43 = 0i64;
    v24 = (_MMSUPPORT_INSTANCE *)(v23 + 1664);
    v44 = 0i64;
    result = 1;
    result_4 = 4;
    v41 = 20;
    v25 = (__int64)((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
    if( (a2 & 0xFFFFFFFFFFFFF000ui64) != (a3 & 0xFFFFFFFFFFFFF000ui64) )
      a3 = (a2 & 0xFFFFFFFFFFFFF000ui64) + 4088;
    if( a2 > a3 )
      return 0i64;
    PfnDb = MmGetPfnDb();
    while( 1 )
    {
      TransitionPte = MI_READ_PTE_LOCK_FREE(a2);
      if( (TransitionPte & 1) == 0
        || (*((_DWORD *)Vad + 12) & 0x70) == 64 && (unsigned int)MiRotatedToFrameBuffer((MMPTE *)a2) == 1
        || (v27 = MI_READ_PTE_LOCK_FREE((INT64)&TransitionPte),
            LOBYTE(v31) = MI_PFN_IS_PROTO((UNICODE_STRING *)PfnDb + 3 * ((v27 >> 12) & 0xFFFFFFFFFi64), v28, v29, v30),
            v31) )
      {
LABEL_30:
        if( v42 )
          MiFreeWsleList((INT64)v24, (INT64)&result, 0);
        return 0i64;
      }
      if( (MiGetWsleContents(v32, v25) & 0xF) == 8 )
        break;
      MiInsertTbFlushEntry((INT64)&result, v25, 1i64, 0i64);
      if( v42 == v41 )
        goto LABEL_25;
LABEL_29:
      v25 += 4096i64;
      a2 += 8i64;
      if( a2 > a3 )
        goto LABEL_30;
    }
    v22 = 1;
    *(_DWORD *)v36 = 1;
LABEL_25:
    if( v42 )
      MiFreeWsleList((INT64)v24, (INT64)&result, 0);
    if( v22 == 1 )
    {
      MiUnlockVa(v24, (PVOID)v25);
      v22 = 0;
    }
    goto LABEL_29;
  }
  v13 = (v10 & 0x300000) == 3145728;
  v14 = 16i64;
  v15 = v13;
  v33 = v13;
  if( v12 != 16 )
    v14 = 1i64;
  v37 = v14;
  v16 = MiVadPageIndices[v11];
  if( v16 > 1 )
    MiInsertTbFlushEntry(a4, (__int64)((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16, v12, 0i64);
  else
    MiInsertLargeTbFlushEntry(a4, 2 - v16, a2);
  TransitionPte = MI_READ_PTE_LOCK_FREE(a2);
  v17 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&TransitionPte) >> 12) & 0xFFFFFFFFFi64;
  v38 = v17;
  v36 = (INT64)MmGetPfnDb() + 48 * v17;
  v19 = 0i64;
  do
  {
    if( v15 )
    {
      if( (MI_READ_PTE_LOCK_FREE(a2) & 0x42) != 0 )
      {
        LeafVa = (void *)MiGetLeafVa(a2);
        MiCaptureWriteWatchDirtyBit(*((_EPROCESS **)KeGetCurrentThread() + 23), LeafVa, Vad);
        v33 = 0;
      }
    }
    TransitionPte = MiMakeTransitionPte(v17 + v19, 0x18ui64, v18);
    *(_QWORD *)a2 = TransitionPte;
    v15 = v33;
    a2 += 8i64;
    v17 = v38;
    ++v19;
  }
  while( v19 < v37 );
  MiUpdatePfnProtection((INT64)Vad, v36, 0x18ui64);
  return 1i64;
}

Referenced by:

MiProtectPrivateMemory