MiFreeVadRange
NTSTATUS __stdcall MiFreeVadRange(
PVOID Vad,
UINT8 *AddressSpaceHeldExclusve,
UINT64 StartingVpn,
UINT64 EndingVpn,
_EPROCESS *Process){
int v5;
UINT64 v7;
UINT64 v8;
NTSTATUS result;
_MI_VAD_DELETE_INFO v13;
_MMVAD_SHORT *v14;
_EPROCESS *v15;
int v16;
UINT64 v17;
int v18;
__int64 ********LockedVadEvent;
_MMVAD_SHORT *v20;
_MI_VAD_DELETE_INFO VadSplitType;
int v22;
VadSplitType = VadDeleteEntire;
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 -1073741800;
}
result = MiCanDeleteEnclave(Vad);
if( result >= 0 )
{
LABEL_32:
result = MiPrepareVadDelete((_MMVAD *)Vad, AddressSpaceHeldExclusve, StartingVpn, EndingVpn, &VadSplitType);
if( result >= 0 )
{
v13 = VadSplitType;
v14 = 0i64;
v15 = Process;
if( VadSplitType == VadDeleteEntire )
{
if( v22 )
{
LockedVadEvent = MiLocateLockedVadEvent((__int64)Vad, 128);
v14 = (_MMVAD_SHORT *)LockedVadEvent[1];
LockedVadEvent[1] = 0i64;
MiLockNestedVad(v14);
v14->StartingVpn = v8 >> 12;
v14->StartingVpnHigh = v8 >> 44;
v14->EndingVpn = v7 >> 12;
v14->EndingVpnHigh = v7 >> 44;
}
MiDeleteVad((_MMVAD *)Vad, (UINT64)v14);
return 0;
}
if( (Process->Flags & 0x20) != 0 )
return -1073741558;
if( MiLocateLockedVadEvent((__int64)Vad, 2) )
return -1073741755;
v17 = (unsigned int)(v16 + 62);
if( v22 )
{
result = PsChargeProcessNonPagedPoolQuota(v15, (unsigned int)(v16 + 62));
if( result < 0 )
return result;
v20 = MiAllocateVad((VOID *)v8, (VOID *)v7);
v14 = v20;
if( !v20 )
{
PsReturnProcessNonPagedPoolQuota(v15, v17);
return -1073741670;
}
MiLockNestedVad(v20);
}
v18 = MiDeletePartialVad(Vad, (VOID *)v8, (VOID *)v7, v13);
if( v18 >= 0 )
return 0;
if( v14 )
{
MiUnlockNestedVad(v14);
ExFreePoolWithTag(v14, 0);
PsReturnProcessNonPagedPoolQuota(v15, v17);
}
return v18;
}
}
return result;
}Referenced by:
MmFreeVirtualMemory
MmStoreAllocateVirtualMemory
MmStoreFreeVirtualMemory