MmQueryCommitReleaseState

VOID __stdcall MmQueryCommitReleaseState(
        _EPROCESS *Process,
        UINT64 *EligibleOut,
        UINT64 *CommitDebtOut,
        UINT64 *MemResetCommittedPagesOut,
        UINT64 *RepurposedMemResetPagesOut){
  _MMSUPPORT_FULL *p_Vm; 
  _MMSUPPORT_SHARED *SharedVm; 
  UINT64 *v8; 
  UINT64 *v9; 
  UINT64 *v10; 
  UINT64 *v11; 
  _MMSUPPORT_FLAGS Flags; 
  int v13; 
  _MMSUPPORT_SHARED *v14; 
  UINT64 v15; 
  unsigned __int64 ReleasedCommitDebt; 
  UINT64 ResetPagesRepurposedCount; 
  __int8 bf_0; 
  char v19; 
  UINT64 CommitReleaseContext; 
  _MMSUPPORT_FLAGS v21; 
  NTSTATUS v22; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  _KAPC_STATE ApcState; 

  p_Vm = &Process->Vm;
  memset(&ApcState, 0, sizeof(ApcState));
  memset(&LockHandle, 0, sizeof(LockHandle));
  SharedVm = MiGetSharedVm(&Process->Vm.Instance);
  Flags = p_Vm->Instance.Flags;
  v13 = 0;
  v14 = SharedVm;
  v21.$2436257948A9E417F8C1432C685A007E::$56A022E0416FA8F0D143F219D5D8FA21::_bf_0 = Flags.$2436257948A9E417F8C1432C685A007E::$56A022E0416FA8F0D143F219D5D8FA21::_bf_0;
  v15 = 0i64;
  ReleasedCommitDebt = SharedVm->ReleasedCommitDebt;
  ResetPagesRepurposedCount = 0i64;
  if( dword_140CFA1D0 == 1 )
  {
    bf_0 = Flags.$2436257948A9E417F8C1432C685A007E::$56A022E0416FA8F0D143F219D5D8FA21::_bf_0;
    ReleasedCommitDebt = 0i64;
  }
  else
  {
    if( (Flags.$2436257948A9E417F8C1432C685A007E::$56A022E0416FA8F0D143F219D5D8FA21::_bf_0 & 0x60) == 64 )
    {
      KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 522, &LockHandle);
      v22 = MiPrepareAttachThread(Process, &p_Vm->Instance);
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
      if( v22 )
      {
        KeForceAttachProcess(Process);
        MiLockWorkingSetShared();
        v21 = p_Vm->Instance.Flags;
        CommitReleaseContext = HIBYTE(*(unsigned int *)&v21);
        if( (v21.$2436257948A9E417F8C1432C685A007E::$56A022E0416FA8F0D143F219D5D8FA21::_bf_0 & 0x60) == 64 )
        {
          CommitReleaseContext = (UINT64)v14->CommitReleaseContext;
          ResetPagesRepurposedCount = v14->ResetPagesRepurposedCount;
          v15 = *(_QWORD *)(CommitReleaseContext + 32);
        }
        LOBYTE(CommitReleaseContext) = v19;
        MiUnlockWorkingSetShared(&p_Vm->Instance, CommitReleaseContext);
        KeForceDetachProcess(&ApcState, 0);
        MiAttachThreadDone(&p_Vm->Instance);
      }
      v11 = RepurposedMemResetPagesOut;
      v10 = MemResetCommittedPagesOut;
      v9 = CommitDebtOut;
      v8 = EligibleOut;
    }
    bf_0 = v21.$2436257948A9E417F8C1432C685A007E::$56A022E0416FA8F0D143F219D5D8FA21::_bf_0;
    if( (v21.$2436257948A9E417F8C1432C685A007E::$56A022E0416FA8F0D143F219D5D8FA21::_bf_0 & 0x60u) < 0x40 )
      ReleasedCommitDebt = 0i64;
  }
  LOBYTE(v13) = (bf_0 & 0x60u) >= 0x20;
  *(_DWORD *)v8 = v13;
  *v9 = ReleasedCommitDebt;
  *v10 = v15;
  *v11 = ResetPagesRepurposedCount;
}

Referenced by:

NtQueryInformationProcess