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