MiCommitPageTablesForVad

NTSTATUS __stdcall MiCommitPageTablesForVad(_MMVAD_SHORT *Vad, VOID *StartingVa, VOID *EndingVa){
  _EPROCESS *Process; 
  unsigned int v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  _MMWSL_INSTANCE *VmWorkingSetList; 
  __int64 v9; 
  _MMPTE *v10; 
  NTSTATUS result; 
  _MMWSL_INSTANCE *v12; 
  int v13; 
  int v14; 
  __int64 v15; 
  _RTL_BITMAP_EX *p_NextPteToAge; 
  __int64 v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  _RTL_BITMAP_EX *v23; 
  __int64 v24; 
  __int64 v25; 
  unsigned __int64 v26; 
  int v27; 
  UINT64 v28; 
  __int64 v29; 
  __int64 LongFlags1; 
  unsigned __int64 v31; 
  char v32; 
  int v33; 
  int v34; 
  __int64 v35; 
  __int64 v36; 
  _EPROCESS *TargetProcess; 
  unsigned __int64 v38; 
  unsigned __int64 v39; 
  _MMWSL_INSTANCE *v40; 
  _RTL_BITMAP_EX *v41; 
  UINT64 PagesCharged; 

  Process = KeGetCurrentThread()->ApcState.Process;
  TargetProcess = Process;
  if( Vad->VadNode.ParentValue != -2i64 || !MiVadPureReserve(Vad) )
  {
    v5 = 0;
    v38 = (unsigned int)((unsigned __int64)StartingVa >> 21);
    v39 = (unsigned int)((unsigned __int64)EndingVa >> 21);
    PagesCharged = 0i64;
    v6 = v38;
    v7 = v39;
    VmWorkingSetList = KeGetCurrentThread()->ApcState.Process->Vm.Instance.VmWorkingSetList;
    do
    {
      v9 = 2 - v5;
      v10 = (&VmWorkingSetList[12].NextPteToAccessClear)[2 * v9 + 6];
      result = MiMakeHyperRangeAccessible((char *)v10 + (v6 >> 3), (char *)v10 + (v7 >> 3), &PagesCharged);
      if( result < 0 )
        return result;
      ++v5;
      *((_QWORD *)&VmWorkingSetList[14].LastAccessClearingRemainder + v9) += PagesCharged;
      v6 >>= 9;
      v7 >>= 9;
    }
    while( v5 < 2 );
    v12 = Process->Vm.Instance.VmWorkingSetList;
    v40 = v12;
    MiVadPageTableChargeLevel((INT64)Vad);
    LOBYTE(v13) = MiVadLeafPagesPrecharged((INT64)Vad);
    v14 = 0;
    v34 = v13;
    v36 = v15;
    p_NextPteToAge = (_RTL_BITMAP_EX *)&v12[14].NextPteToAge;
    LODWORD(PagesCharged) = 0;
    v41 = (_RTL_BITMAP_EX *)&v12[14].NextPteToAge;
    v17 = v15;
    while( 1 )
    {
      v33 = v14;
      v18 = v38;
      v19 = 0i64;
      v20 = v39;
      v21 = 0i64;
      v22 = 0i64;
      v23 = p_NextPteToAge;
      do
      {
        v24 = 0i64;
        v25 = 0i64;
        v35 = 0i64;
        v26 = v18;
        if( v18 <= v20 )
        {
          while( 1 )
          {
            if( !_bittest64((const signed __int64 *)v23->Buffer, v26) )
            {
              ++v25;
              if( v14 != 1 )
              {
                LODWORD(PagesCharged) = 1;
                if( !MiCreateSystemWsles() && (v26 == v18 || (v26 & 7) == 0) )
                {
                  RtlAreBitsClearEx(v23, v26 & 0xFFFFFFFFFFFFFFF8ui64, 8ui64);
                  v24 = v35;
                  v14 = v33;
                  v27 = PagesCharged;
                  if( v32 == 1 )
                    v24 = ++v35;
                }
                goto LABEL_10;
              }
              _bittestandset64((signed __int64 *)v23->Buffer, v26);
            }
            v27 = PagesCharged;
LABEL_10:
            if( ++v26 > v20 )
            {
              v17 = v36;
              goto LABEL_12;
            }
          }
        }
        v27 = PagesCharged;
LABEL_12:
        if( v22 >= v17 )
          v19 += v25;
        v21 += v24;
        v18 >>= 9;
        v20 >>= 9;
        ++v22;
        --v23;
      }
      while( v22 < 3 );
      if( v14 )
        return 0;
      v28 = v21 + v19;
      if( !v34 && !MiVadPureReserve(Vad) )
      {
        LongFlags1 = Vad->u1.LongFlags1;
        LODWORD(LongFlags1) = LongFlags1 & 0x7FFFFFFF;
        v31 = LongFlags1 | ((unsigned __int64)Vad->CommitChargeHigh << 31);
        if( v31 != 0x7FFFFFFFEi64 )
          v28 += v31;
      }
      if( v28 )
      {
        result = MiChargeFullProcessCommitment((ULONG_PTR)TargetProcess, v28);
        if( result < 0 )
          return result;
        v17 = v36;
        v27 = PagesCharged;
      }
      if( v27 != 1 )
        return 0;
      v40[7].NextPteToAge = (_MMPTE *)((char *)v40[7].NextPteToAge + v19);
      if( v21 )
        MiUpdateChargedWsles((INT64)&TargetProcess->Vm);
      p_NextPteToAge = v41;
      v14 = 1;
    }
  }
  v29 = Vad->u1.LongFlags1;
  LODWORD(v29) = v29 & 0x7FFFFFFF;
  if( !(v29 | ((unsigned __int64)Vad->CommitChargeHigh << 31)) )
    return 0;
  result = MiChargeFullProcessCommitment((ULONG_PTR)Process, v29 | ((unsigned __int64)Vad->CommitChargeHigh << 31));
  if( result >= 0 )
    return 0;
  return result;
}

Referenced by:

MiCommitExistingVad
MiCommitPageTableRangesForVad
MiInsertVadCharges
MiSetProtectionOnSection
MiSplitPrivatePage