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