MiMakeVaRangeNoAccess

NTSTATUS __stdcall MiMakeVaRangeNoAccess(_MMVAD_SHORT *a1, UINT64 a2, UINT64 a3, INT64 a4, INT64 a5, INT64 a6){
  union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v10; 
  __int64 v11; 
  UINT64 v12; 
  bool v13; 
  unsigned __int64 v14; 
  _BOOL4 v15; 
  unsigned int v16; 
  INT64 v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  VOID *v21; 
  INT64 v22; 
  unsigned __int64 v23; 
  char v24; 
  int v25; 
  char v27; 
  _EPROCESS *Process; 
  _MMSUPPORT_INSTANCE *p_Instance; 
  __int64 v30; 
  _MMPFN *PfnDb; 
  INT64 v32; 
  unsigned __int64 v33; 
  _UNICODE_STRING *v34; 
  UINT8 v35; 
  PWCHAR v36; 
  int v37; 
  INT64 v38; 
  _BOOL4 v39; 
  INT64 v40; 
  _MMVAD_SHORT *Vad; 
  _MMPFN *Pfn1; 
  unsigned __int64 v43; 
  __int64 v44; 
  _BYTE TbFlushList[184]; 

  Vad = a1;
  Pfn1 = (_MMPFN *)a6;
  memset(TbFlushList, 0i64, sizeof(TbFlushList));
  v10.LongFlags = (unsigned int)a1->u;
  if( (v10.LongFlags & 0x500000) != 5242880 || (v11 = (v10.LongFlags >> 18) & 3, v12 = MiVadPageSizes[v11], v12 == 1) )
  {
    v27 = 0;
    Process = KeGetCurrentThread()->ApcState.Process;
    *(_QWORD *)&TbFlushList[16] = 0i64;
    p_Instance = &Process->Vm.Instance;
    *(_QWORD *)&TbFlushList[24] = 0i64;
    *(_DWORD *)TbFlushList = 1;
    *(_WORD *)&TbFlushList[4] = 4;
    *(_DWORD *)&TbFlushList[8] = 20;
    v30 = (__int64)((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
    if( (a2 & 0xFFFFFFFFFFFFF000ui64) != (a3 & 0xFFFFFFFFFFFFF000ui64) )
      a3 = (a2 & 0xFFFFFFFFFFFFF000ui64) + 4088;
    if( a2 > a3 )
      return 0;
    PfnDb = MmGetPfnDb();
    while( 1 )
    {
      LODWORD(v32) = MI_READ_PTE_LOCK_FREE(a2);
      v40 = v32;
      if( (v32 & 1) == 0
        || (Vad->u.LongFlags & 0x70) == 64 && MiRotatedToFrameBuffer((_MMPTE *)a2) == 1
        || (LODWORD(v33) = MI_READ_PTE_LOCK_FREE((INT64)&v40),
            LOBYTE(v37) = MI_PFN_IS_PROTO((_UNICODE_STRING *)&PfnDb[(v33 >> 12) & 0xFFFFFFFFFi64], v34, v35, v36),
            v37) )
      {
LABEL_34:
        if( *(_DWORD *)&TbFlushList[12] )
          MiFreeWsleList(p_Instance, (_MMWSLE_FLUSH_LIST *)TbFlushList, 0i64);
        return 0;
      }
      if( (MiGetWsleContents(v38, v30) & 0xF) == 8 )
        break;
      MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)TbFlushList, (VOID *)v30, 1ui64, 0i64);
      if( *(_DWORD *)&TbFlushList[12] == *(_DWORD *)&TbFlushList[8] )
        goto LABEL_29;
LABEL_33:
      v30 += 4096i64;
      a2 += 8i64;
      if( a2 > a3 )
        goto LABEL_34;
    }
    v27 = 1;
    LODWORD(Pfn1->ListEntry.Flink) = 1;
LABEL_29:
    if( *(_DWORD *)&TbFlushList[12] )
      MiFreeWsleList(p_Instance, (_MMWSLE_FLUSH_LIST *)TbFlushList, 0i64);
    if( v27 == 1 )
    {
      MiUnlockVa(p_Instance, (VOID *)v30);
      v27 = 0;
    }
    goto LABEL_33;
  }
  v13 = (v10.LongFlags & 0x300000) == 3145728;
  v14 = 16i64;
  v15 = v13;
  v39 = v13;
  if( v12 != 16 )
    v14 = 1i64;
  v43 = v14;
  v16 = MiVadPageIndices[v11];
  if( v16 > 1 )
    MiInsertTbFlushEntry(
      (_MI_TB_FLUSH_LIST *)a4,
      (VOID *)((__int64)((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
      v12,
      0i64);
  else
    MiInsertLargeTbFlushEntry((_MI_TB_FLUSH_LIST *)a4, 2 - v16, a2);
  LODWORD(v17) = MI_READ_PTE_LOCK_FREE(a2);
  v40 = v17;
  LODWORD(v18) = MI_READ_PTE_LOCK_FREE((INT64)&v40);
  v19 = (v18 >> 12) & 0xFFFFFFFFFi64;
  v44 = v19;
  Pfn1 = &MmGetPfnDb()[v19];
  v20 = 0i64;
  do
  {
    if( v15 && (MI_READ_PTE_LOCK_FREE(a2) & 0x42) != 0 )
    {
      LODWORD(v21) = MiGetLeafVa(a2);
      MiCaptureWriteWatchDirtyBit(KeGetCurrentThread()->ApcState.Process, v21, Vad);
      v39 = 0;
    }
    LODWORD(v22) = MiMakeTransitionPte(v19 + v20, 24);
    v40 = v22;
    v23 = v22;
    v24 = v22;
    LOBYTE(v25) = MiPteInShadowRange(a2);
    if( v25 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v24 & 1) != 0 )
      v23 = v40 | 0x8000000000000000ui64;
    *(_QWORD *)a2 = v23;
    v15 = v39;
    a2 += 8i64;
    v19 = v44;
    ++v20;
  }
  while( v20 < v43 );
  MiUpdatePfnProtection(Vad, Pfn1, 0x18ui64);
  return 1;
}

Referenced by:

MiProtectPrivateMemory