MiFreeVadRange
INT64 __fastcall MiFreeVadRange(
_MMVAD *Vad,
UINT8 *AddressSpaceHeldExclusve,
UINT64 StartingVpn,
UINT64 EndingVpn,
_EPROCESS *Process){
int v5;
unsigned __int64 v7;
unsigned __int64 v8;
INT64 result;
unsigned int v13;
__int64 v14;
_EPROCESS *v15;
int v16;
ULONG_PTR v17;
int v18;
INT64 ***LockedVadEvent;
INT64 v20;
int v21;
LODWORD(v20) = 0;
v5 = *((_DWORD *)Vad + 12);
v7 = (EndingVpn << 12) | 0xFFF;
v8 = StartingVpn << 12;
if( (v5 & 0x100000) == 0 || (v5 & 0x1000000) != 0 || (v5 & 0x2000000) == 0 )
goto LABEL_32;
if( StartingVpn != (*((unsigned int *)Vad + 6) | ((unsigned __int64)*((unsigned __int8 *)Vad + 32) << 32))
|| EndingVpn != (*((unsigned int *)Vad + 7) | ((unsigned __int64)*((unsigned __int8 *)Vad + 33) << 32)) )
{
return 3221225496i64;
}
LODWORD(result) = MiCanDeleteEnclave(Vad);
if( (int)result >= 0 )
{
LABEL_32:
result = MiPrepareVadDelete((INT64)Vad, (CHAR *)AddressSpaceHeldExclusve, StartingVpn, EndingVpn, &v20);
if( (int)result >= 0 )
{
v13 = v20;
v14 = 0i64;
v15 = Process;
if( !(_DWORD)v20 )
{
if( v21 )
{
LockedVadEvent = MiLocateLockedVadEvent((INT64)Vad, 128i64);
v14 = (__int64)LockedVadEvent[1];
LockedVadEvent[1] = 0i64;
MiLockNestedVad();
*(_DWORD *)(v14 + 24) = v8 >> 12;
*(_BYTE *)(v14 + 32) = v8 >> 44;
*(_DWORD *)(v14 + 28) = v7 >> 12;
*(_BYTE *)(v14 + 33) = v7 >> 44;
}
MiDeleteVad(Vad, v14);
return 0i64;
}
if( (*((_DWORD *)Process + 281) & 0x20) != 0 )
return 3221225738i64;
if( MiLocateLockedVadEvent((INT64)Vad, 2i64) )
return 3221225541i64;
v17 = (unsigned int)(v16 + 62);
if( v21 )
{
result = PsChargeProcessNonPagedPoolQuota((__int64)v15, (unsigned int)(v16 + 62));
if( (int)result < 0 )
return result;
v14 = MiAllocateVad(v8, v7, 2);
if( !v14 )
{
PsReturnProcessNonPagedPoolQuota((ULONG_PTR)v15, v17);
return 3221225626i64;
}
MiLockNestedVad();
}
v18 = MiDeletePartialVad((INT64 *)Vad, v8, v7, v13, v14);
if( v18 >= 0 )
return 0i64;
if( v14 )
{
MiUnlockNestedVad(v14);
ExFreePoolWithTag((PVOID)v14, 0);
PsReturnProcessNonPagedPoolQuota((ULONG_PTR)v15, v17);
}
return(unsigned int)v18;
}
}
return result;
}Referenced by:
MmFreeVirtualMemory
MmStoreAllocateVirtualMemory
MmStoreFreeVirtualMemory