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