MiCheckCommitReleaseFromVad

INT64 __fastcall MiCheckCommitReleaseFromVad(
        _MI_PARTITION *Partition,
        _EPROCESS *Process,
        _MMSUPPORT_INSTANCE *Vm,
        _MMVAD_SHORT *Vad,
        UINT64 AcceptStorePages,
        UINT64 *ResetPagesNotReleasedCount){
  unsigned __int64 v6; 
  _MMSUPPORT_INSTANCE *v7; 
  _MMPTE *PteBase; 
  INT64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  char v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  UINT64 v17; 
  char *v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  UINT64 v21; 
  char *v22; 
  UINT64 v23; 
  INT64 v24; 
  __int64 v25; 
  _MMPFN *v26; 
  bool v27; 
  UINT64 v28; 
  int a6; 
  INT64 v31; 
  UINT64 PagesProcessedOut; 
  UINT64 v33; 
  unsigned __int64 v34; 
  char i; 
  v6 = (unsigned __int64)*((unsigned __int8 *)Vad + 32) << 32;
  v7 = Vm;
  a6 = 0;
  PagesProcessedOut = 0i64;
  PteBase = MmGetPteBase();
  v11 = 0i64;
  v12 = (unsigned __int64)PteBase + 8 * ((*((unsigned int *)Vad + 6) | v6) & 0xFFFFFFFFFi64);
  v13 = (unsigned __int64)PteBase
      + 8 * ((*((unsigned int *)Vad + 7) | ((unsigned __int64)*((unsigned __int8 *)Vad + 33) << 32)) & 0xFFFFFFFFFi64);
  v34 = v13;
  v14 = MiLockWorkingSetShared((INT64)Vm);
  for( i = v14; v12 <= v13; v14 = i )
  {
    MiGetNextPageTable(v12, v13, 0i64, v14, 0, &a6);
    v16 = v15;
    if( v15 != v12 )
    {
      v17 = v15 ? (__int64)(v15 - v12) >> 3 : ((__int64)(v13 - v12) >> 3) + 1;
      v11 += MiComputeCommitChargeForZeroPteRange(Vad, (_MMPTE *)v12, v17);
      if( !v16 )
        break;
    }
    v12 = v16;
    v18 = (char *)MmGetPteBase() + ((v16 >> 9) & 0x7FFFFFFFF8i64);
    v19 = v13;
    v33 = (UINT64)v18;
    if( (v16 & 0xFFFFFFFFFFFFF000ui64) + 4088 <= v13 )
      v19 = (v16 & 0xFFFFFFFFFFFFF000ui64) + 4088;
    if( v16 <= v19 )
    {
      while( 1 )
      {
        v20 = MI_READ_PTE_LOCK_FREE(v12);
        v31 = v20;
        if( !v20 )
          break;
        if( (v20 & 1) != 0 )
        {
          if( (v20 & 0x200) == 0
            || (*((_DWORD *)Vad + 12) & 0x70) == 64 && (unsigned int)MiRotatedToFrameBuffer((MMPTE *)v12) )
          {
            goto LABEL_48;
          }
          v22 = (char *)MmGetPfnDb()
              + 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v31) >> 12) & 0xFFFFFFFFFi64);
          if( (*((_QWORD *)v22 + 5) & 0x1000000000i64) == 0 && *((__int64 *)v22 + 1) > 0 )
            goto LABEL_48;
          if( *((_QWORD *)Process + 158)
            && MiLocateCloneAddress((__int64)Process, *((_QWORD *)v22 + 1) | 0x8000000000000000ui64) )
          {
            goto LABEL_48;
          }
LABEL_47:
          ++v11;
          goto LABEL_48;
        }
        if( (v20 & 0x400) != 0 )
        {
          if( MiIsPrototypePteVadLookup(v20) )
          {
            v24 = v11 + 1;
            if( ((v23 >> 5) & 5) != 5 )
              v24 = v11;
            v11 = v24;
            goto LABEL_48;
          }
          if( MI_PROTO_FORMAT_COMBINED(v23) )
            goto LABEL_48;
          if( *((_QWORD *)Process + 158) )
          {
            if( qword_140C4DC80 && (v25 & 0x10) == 0 )
              v25 &= ~qword_140C4DC80;
            if( MiLocateCloneAddress((__int64)Process, v25 >> 16) )
              goto LABEL_48;
          }
          MiComputeImageVadCommitCharge(
            (_MMVAD *)Vad,
            (unsigned __int64)((__int64)((v12 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16) >> 12,
            1ui64,
            &PagesProcessedOut);
          goto LABEL_33;
        }
        if( (v20 & 0x800) != 0 )
        {
          v26 = MiLockTransitionLeafPage((_MMPTE *)v12, 0i64);
          if( v26 )
          {
            if( (*((_BYTE *)v26 + 34) & 0x10) == 0 && (*((_DWORD *)v26 + 4) & 4) == 0 && !*((_WORD *)v26 + 16) )
              ++*ResetPagesNotReleasedCount;
            _InterlockedAnd64((volatile signed __int64 *)v26 + 3, 0x7FFFFFFFFFFFFFFFui64);
          }
          else
          {
            v12 -= 8i64;
          }
          goto LABEL_48;
        }
        if( (v20 & 4) != 0 )
        {
          if( !(_DWORD)AcceptStorePages )
            goto LABEL_48;
          v27 = (unsigned int)MiIsPteInStore((__int64)Partition, v20) == 0;
        }
        else
        {
          v27 = ((v20 >> 5) & 0x1F) == 16;
        }
        if( !v27 )
          goto LABEL_47;
LABEL_48:
        v12 += 8i64;
        if( v12 > v19 )
        {
          v18 = (char *)v33;
          v13 = v34;
          goto LABEL_50;
        }
      }
      v21 = MiComputeCommitChargeForZeroPteRange(Vad, (_MMPTE *)v12, 1ui64);
LABEL_33:
      v11 += v21;
      goto LABEL_48;
    }
LABEL_50:
    v28 = (UINT64)v18;
    v7 = Vm;
    MiUnlockPageTableInternal((INT64)Vm, v28);
  }
  MiUnlockWorkingSetShared((INT64)v7, v14);
  return v11;
}

Referenced by:

MiReleaseOutSwappedProcessCommit