MiReleaseOutSwappedProcessCommit
VOID __stdcall MiReleaseOutSwappedProcessCommit(_EPROCESS *Process){
_MMSUPPORT_SHARED *SharedVm;
__int64 PartitionId;
__int64 v4;
_ETHREAD *CurrentThread;
UINT64 *Pool;
_MMSUPPORT_SHARED *v7;
UINT8 v8;
UINT64 v9;
UINT64 v10;
_MI_PARTITION *v11;
int v12;
UINT64 v13;
_RTL_BALANCED_NODE *Root;
_MMVAD_SHORT *i;
int v16;
__int64 v17;
__int64 v18;
_MMVAD_SHORT **ExtraCreateInfo;
_MMVAD_SHORT *v20;
_MMVAD_SHORT *NextVad;
UINT64 v22;
_MMSUPPORT_SHARED *v23;
UINT8 v24;
_MMSUPPORT_FLAGS Flags;
__int8 v26;
UINT64 AcceptStorePages;
_MI_PARTITION *Partition;
UINT64 CommitSizeUsed;
_MMSUPPORT_SHARED *v30;
CommitSizeUsed = 0i64;
KeForceAttachProcess(Process);
SharedVm = MiGetSharedVm(&Process->Vm.Instance);
PartitionId = Process->Vm.Instance.PartitionId;
v4 = (__int64)SharedVm;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v30 = SharedVm;
Partition = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * PartitionId);
Pool = (UINT64 *)MiAllocatePool(64i64, 0x38ui64, 0x7243694Dui64);
if( Pool )
{
v7 = MiGetSharedVm(&Process->Vm.Instance);
v8 = ExAcquireSpinLockExclusive((INT64 *)&v7->WorkingSetLock);
v7->GoodCitizenWaiting = 0;
Process->Vm.Instance.Flags._bf_0 |= 0x60u;
MiUnlockWorkingSetExclusive(&Process->Vm.Instance, v8);
v9 = 1i64;
if( dword_140CFA1D0 == 1 )
{
v10 = 0i64;
}
else
{
v11 = Partition;
v12 = 0;
v13 = 0i64;
if( Partition->Store.Registered && (unsigned int)SmStoreExistsForProcess(Process) )
v12 = 1;
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(&Process->AddressCreationLock, 0i64);
CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 |= 1u;
Root = Process->VadRoot.Root;
i = 0i64;
while( Root )
{
i = (_MMVAD_SHORT *)Root;
Root = Root->Children[0];
}
while( i )
{
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(&i->PushLock, 0i64);
CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 |= 0x80u;
MiIsVadEligibleForCommitRelease(i);
if( v16 )
{
LODWORD(AcceptStorePages) = v12;
LODWORD(v17) = MiCheckCommitReleaseFromVad(v11, Process, &Process->Vm.Instance, i, AcceptStorePages, Pool + 4);
v18 = v17;
MiUnlockVad(CurrentThread, i);
v13 += v18;
v11 = Partition;
}
else
{
MiUnlockVad(CurrentThread, i);
}
ExtraCreateInfo = (_MMVAD_SHORT **)i->ExtraCreateInfo;
v20 = i;
if( ExtraCreateInfo )
{
NextVad = *ExtraCreateInfo;
for( i = (_MMVAD_SHORT *)i->ExtraCreateInfo; NextVad; NextVad = NextVad->NextVad )
i = NextVad;
}
else
{
while( 1 )
{
i = (_MMVAD_SHORT *)(i->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
if( !i || i->NextVad == v20 )
break;
v20 = i;
}
}
}
UNLOCK_ADDRESS_SPACE(CurrentThread, Process);
v9 = v13;
_InterlockedExchange64((volatile __int64 *)&Process->Vm.Shared.ResetPagesRepurposedCount, 0i64);
v10 = Pool[4];
if( v12 )
{
SmQueryStoreCommitUsage(Process, &CommitSizeUsed);
v22 = ((CommitSizeUsed & 0xFFF) != 0) + (CommitSizeUsed >> 12);
CommitSizeUsed = v22;
if( v13 <= v22 )
v9 = 0i64;
else
v9 = v13 - v22;
}
if( v9 )
MiReturnCommit(v11, v9);
v4 = (__int64)v30;
}
v23 = MiGetSharedVm(&Process->Vm.Instance);
v24 = ExAcquireSpinLockExclusive((INT64 *)&v23->WorkingSetLock);
v23->GoodCitizenWaiting = 0;
Flags = Process->Vm.Instance.Flags;
if( v9 )
{
*(_QWORD *)(v4 + 32) = Pool;
v26 = Flags.$2436257948A9E417F8C1432C685A007E::$56A022E0416FA8F0D143F219D5D8FA21::_bf_0 & 0x9F | 0x40;
*(_QWORD *)(v4 + 8) = v9;
Pool = 0i64;
}
else
{
v26 = Flags.$2436257948A9E417F8C1432C685A007E::$56A022E0416FA8F0D143F219D5D8FA21::_bf_0 & 0x9F;
}
Process->Vm.Instance.Flags._bf_0 = v26;
MiUnlockWorkingSetExclusive(&Process->Vm.Instance, v24);
MiLogOutswappedProcessCommitRelease(Process, v9, v10);
}
KeForceDetachProcess(0i64, 0);
if( Pool )
ExFreePoolWithTag(Pool, 0);
}Referenced by:
MmOutSwapProcess