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