MiPrepareVadDelete

NTSTATUS __stdcall MiPrepareVadDelete(
        _MMVAD *Vad,
        UINT8 *AddressSpaceHeld,
        UINT64 StartingVpn,
        UINT64 EndingVpn,
        _MI_VAD_DELETE_INFO *VadSplitType){
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  __int64 v9; 
  unsigned __int64 v10; 
  _MI_VAD_DELETE_INFO v11; 
  UINT8 v12; 
  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;} v14; 
  _ETHREAD *v15; 
  NTSTATUS v16; 
  NTSTATUS v17; 
  _ETHREAD *CurrentThread; 

  v7 = Vad->Core.StartingVpn | ((unsigned __int64)Vad->Core.StartingVpnHigh << 32);
  v8 = (unsigned __int64)Vad->Core.EndingVpnHigh << 32;
  v9 = Vad->Core.EndingVpn;
  *VadSplitType = VadDeleteEntire;
  v10 = v9 | v8;
  if( StartingVpn != v7 || (v11 = VadDeleteEntire, EndingVpn != v10) )
  {
    v14.LongFlags = (unsigned int)Vad->Core.u;
    if( (v14.LongFlags & 0x300000) != 3145728 )
    {
      if( (v14.LongFlags & 0x70) != 0 )
      {
        if( (v14.LongFlags & 0x70) == 64 )
          goto LABEL_12;
      }
      else if( (v14.LongFlags & 0x100000) == 0
             || (v14.LongFlags & 0x400000) == 0 && (v14.LongFlags & 0xC0000) < 0x80000 )
      {
LABEL_12:
        if( StartingVpn == v7 )
        {
          *VadSplitType = VadDeleteFront;
          v11 = VadDeleteFront;
        }
        else
        {
          v11 = VadDeleteBack;
          if( EndingVpn != v10 )
            v11 = VadDeleteMiddle;
          *VadSplitType = v11;
        }
        goto LABEL_3;
      }
    }
    return -1073741665;
  }
LABEL_3:
  v12 = *AddressSpaceHeld;
  if( v11 == VadDeleteEntire )
  {
    if( v12 == 1 )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      UNLOCK_ADDRESS_SPACE(CurrentThread, CurrentThread->Tcb.ApcState.Process);
      *AddressSpaceHeld = 0;
    }
    return 0;
  }
  if( v12 )
    return 0;
  v15 = (_ETHREAD *)KeGetCurrentThread();
  *VadSplitType = VadDeleteEntire;
  *AddressSpaceHeld = 1;
  MiLockAddressSpaceToo(v15->Tcb.ApcState.Process, &Vad->Core);
  v16 = MiVadDeleted(&Vad->Core);
  v17 = -1073741267;
  if( v16 == 1 )
    return -1073741664;
  return v17;
}

Referenced by:

MiFreeVadRange