MiDecommitRegion
VOID __stdcall MiDecommitRegion(_MMVAD_SHORT *Vad, VOID *StartingAddress, VOID *EndingAddress){
_EPROCESS *Process;
VOID *v5;
_MMPTE *PteAddress;
_MMPTE *v7;
__int64 v8;
VOID *v9;
__int64 v10;
union {unsigned int LongFlags1;_MMVAD_FLAGS1 VadFlags1;} v11;
__int64 LongFlags1;
UINT64 v13;
unsigned __int64 v14;
_EPROCESS *v15;
_MI_PARTITION *ProcessPartition;
UINT64 v17;
UINT64 VadLockHeld;
__int128 CommitReturnInfo;
_MI_DELETE_VA_INFO DeleteInfo;
__int128 v21;
__int128 v22;
DeleteInfo = 0i64;
v21 = 0i64;
v22 = 0i64;
CommitReturnInfo = 0i64;
Process = KeGetCurrentThread()->ApcState.Process;
MiGetPteAddress(EndingAddress);
PteAddress = MiGetPteAddress(v5);
v8 = v7 - PteAddress + 1;
LODWORD(VadLockHeld) = 1;
MiDecommitPages(v9, v7, (ULONG_PTR)Process, Vad, VadLockHeld, &DeleteInfo);
if( *((_QWORD *)&v22 + 1) )
{
MiFreeLargePages(*((_MMPFN **)&v22 + 1));
*(_QWORD *)&DeleteInfo.ReducedCommitClonePages = v10;
}
v11.LongFlags1 = (unsigned int)Vad->u1;
LongFlags1 = v11.LongFlags1;
LODWORD(LongFlags1) = v11.LongFlags1 & 0x7FFFFFFF;
v13 = v8 - *((_QWORD *)&v21 + 1);
v14 = (LongFlags1 | ((unsigned __int64)Vad->CommitChargeHigh << 31)) - v13;
Vad->CommitChargeHigh = v14 >> 31;
Vad->u1.LongFlags1 = v11.LongFlags1 ^ (v14 ^ v11.LongFlags1) & 0x7FFFFFFF;
if( (Vad->u.LongFlags & 0x500000) == 5242880 )
_InterlockedExchangeAdd64((volatile signed __int64 *)&Process->VadPhysicalPages, -(__int64)v13);
if( !MiVadCommitCrossPartition((INT64)Vad) )
{
MiFillCommitReturnInfo(v13, &DeleteInfo, (_MI_COMMIT_RETURN_INFO *)&CommitReturnInfo);
v15 = (_EPROCESS *)CommitReturnInfo;
if( (_QWORD)CommitReturnInfo )
MiReturnFullProcessCharges((ULONG_PTR)Process, CommitReturnInfo);
if( *((_QWORD *)&CommitReturnInfo + 1) )
{
ProcessPartition = MiGetProcessPartition(Process, v15);
MiReturnCommit(ProcessPartition, v17);
}
}
}Referenced by:
MiFreeToSubAllocatedRegion
MiLoadDataIntoVsmEnclave
MiLoadSectionIntoVsmEnclave
MmFreeVirtualMemory