MiReAcquireOutSwappedProcessCommit
NTSTATUS __stdcall MiReAcquireOutSwappedProcessCommit(_EPROCESS *Process){
_MMSUPPORT_SHARED *SharedVm;
_ETHREAD *CurrentThread;
NTSTATUS v4;
_MMSUPPORT_SHARED *v5;
NTSTATUS v6;
unsigned int v7;
_MMSUPPORT_SHARED *v8;
UINT8 v9;
_QWORD *CommitReleaseContext;
_MMSUPPORT_SHARED *v11;
UINT8 v12;
_WORK_QUEUE_ITEM *v13;
_KEVENT *Blink;
KeForceAttachProcess(Process);
SharedVm = MiGetSharedVm(&Process->Vm.Instance);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = 0;
v5 = SharedVm;
if( dword_140CFA1D0 != 1 )
{
if( (Process->Flags & 8) != 0 )
{
v7 = 1;
v6 = 0;
}
else
{
v7 = 0;
v6 = MiChargeCommit(
*(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * Process->Vm.Instance.PartitionId),
SharedVm->ReleasedCommitDebt,
1ui64);
if( v6 )
goto LABEL_15;
}
MiLogOutswappedProcessCommitReacquire(Process, v5->ReleasedCommitDebt, 1ui64, v7);
_InterlockedOr((volatile signed __int32 *)&Process->2172, 0x100u);
v8 = MiGetSharedVm(&Process->Vm.Instance);
v9 = ExAcquireSpinLockExclusive((INT64 *)&v8->WorkingSetLock);
v8->GoodCitizenWaiting = 0;
Process->Vm.Instance.Flags._bf_0 |= 0x60u;
MiUnlockWorkingSetExclusive(&Process->Vm.Instance, v9);
MiBeginProcessClean(CurrentThread, Process);
KeFreezeProcess(&Process->Pcb, 0);
ObfReferenceObjectWithTag(Process, 0x746C6644ui64);
CommitReleaseContext = v5->CommitReleaseContext;
CommitReleaseContext[2] = MiReAcquireCommitFailWorker;
CommitReleaseContext[3] = Process;
*CommitReleaseContext = 0i64;
goto LABEL_6;
}
v6 = 1;
LABEL_15:
MiLogOutswappedProcessCommitReacquire(Process, v5->ReleasedCommitDebt, 0i64, 0i64);
LABEL_6:
v11 = MiGetSharedVm(&Process->Vm.Instance);
v12 = ExAcquireSpinLockExclusive((INT64 *)&v11->WorkingSetLock);
v11->GoodCitizenWaiting = 0;
if( (Process->Vm.Instance.Flags._bf_0 & 0x60) == 64 )
Process->Vm.Instance.Flags._bf_0 = Process->Vm.Instance.Flags._bf_0 & 0x9F | 0x20;
v13 = (_WORK_QUEUE_ITEM *)v5->CommitReleaseContext;
if( v6 )
{
v5->ReleasedCommitDebt = 0i64;
v5->CommitReleaseContext = 0i64;
}
MiUnlockWorkingSetExclusive(&Process->Vm.Instance, v12);
KeForceDetachProcess(0i64, 0);
Blink = (_KEVENT *)v13[1].List.Blink;
if( Blink )
KeSetEvent(Blink, 0, 0);
if( v6 )
{
ExFreePoolWithTag(v13, 0);
}
else
{
ExQueueWorkItem(v13, CriticalWorkQueue);
return -1073741523;
}
return v4;
}Referenced by:
KiInSwapProcesses