MiCommitPageTablesForVad

int __fastcall MiCommitPageTablesForVad(__int64 a1, unsigned __int64 a2, unsigned __int64 a3){
  ULONG_PTR v4; 
  unsigned int v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  int result; 
  __int64 v12; 
  BOOL v13; 
  int v14; 
  __int64 v15; 
  INT64 v16; 
  __int64 v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  INT64 v23; 
  __int64 v24; 
  __int64 v25; 
  unsigned __int64 v26; 
  int v27; 
  unsigned __int64 v28; 
  __int64 v29; 
  __int64 v30; 
  unsigned __int64 v31; 
  bool v32; 
  int v33; 
  BOOL v34; 
  __int64 v35; 
  __int64 v36; 
  ULONG_PTR v37; 
  unsigned __int64 v38; 
  unsigned __int64 v39; 
  __int64 v40; 
  INT64 v41; 
  UINT64 PagesCharged; 
  v4 = *((_QWORD *)KeGetCurrentThread() + 23);
  v37 = v4;
  if( *(_QWORD *)(a1 + 16) != -2i64 || !(unsigned int)MiVadPureReserve(a1) )
  {
    v5 = 0;
    v38 = (unsigned int)(a2 >> 21);
    v39 = (unsigned int)(a3 >> 21);
    PagesCharged = 0i64;
    v6 = v38;
    v7 = v39;
    v8 = *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1680i64);
    do
    {
      v9 = 2 - v5;
      v10 = *(_QWORD *)(v8 + 16 * (v9 + 31) + 48);
      result = MiMakeHyperRangeAccessible((PVOID)(v10 + (v6 >> 3)), (PVOID)(v10 + (v7 >> 3)), &PagesCharged);
      if( result < 0 )
        return result;
      ++v5;
      *(_QWORD *)(v8 + 8 * v9 + 584) += PagesCharged;
      v6 >>= 9;
      v7 >>= 9;
    }
    while( v5 < 2 );
    v12 = *(_QWORD *)(v4 + 1680);
    v40 = v12;
    MiVadPageTableChargeLevel(a1);
    v13 = MiVadLeafPagesPrecharged(a1);
    v14 = 0;
    v34 = v13;
    v36 = v15;
    v16 = v12 + 568;
    LODWORD(PagesCharged) = 0;
    v41 = v12 + 568;
    v17 = v15;
    while( 1 )
    {
      v33 = v14;
      v18 = v38;
      v19 = 0i64;
      v20 = v39;
      v21 = 0i64;
      v22 = 0i64;
      v23 = v16;
      do
      {
        v24 = 0i64;
        v25 = 0i64;
        v35 = 0i64;
        v26 = v18;
        if( v18 <= v20 )
        {
          while( 1 )
          {
            if( !_bittest64(*(const signed __int64 **)(v23 + 8), v26) )
            {
              ++v25;
              if( v14 != 1 )
              {
                LODWORD(PagesCharged) = 1;
                if( !(unsigned int)MiCreateSystemWsles() && (v26 == v18 || (v26 & 7) == 0) )
                {
                  v32 = RtlAreBitsClearEx(v23, v26 & 0xFFFFFFFFFFFFFFF8ui64, 8ui64);
                  v24 = v35;
                  v14 = v33;
                  v27 = PagesCharged;
                  if( v32 )
                    v24 = ++v35;
                }
                goto LABEL_10;
              }
              _bittestandset64(*(signed __int64 **)(v23 + 8), 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 -= 16i64;
      }
      while( v22 < 3 );
      if( v14 )
        return 0;
      v28 = v21 + v19;
      if( !v34 && !(unsigned int)MiVadPureReserve(a1) )
      {
        v30 = *(unsigned int *)(a1 + 52);
        LODWORD(v30) = v30 & 0x7FFFFFFF;
        v31 = v30 | ((unsigned __int64)*(unsigned __int8 *)(a1 + 34) << 31);
        if( v31 != 0x7FFFFFFFEi64 )
          v28 += v31;
      }
      if( v28 )
      {
        result = MiChargeFullProcessCommitment(v37, v28);
        if( result < 0 )
          return result;
        v17 = v36;
        v27 = PagesCharged;
      }
      if( v27 != 1 )
        return 0;
      *(_QWORD *)(v40 + 288) += v19;
      if( v21 )
        MiUpdateChargedWsles(v37 + 1664);
      v16 = v41;
      v14 = 1;
    }
  }
  v29 = *(unsigned int *)(a1 + 52);
  LODWORD(v29) = v29 & 0x7FFFFFFF;
  if( !(v29 | ((unsigned __int64)*(unsigned __int8 *)(a1 + 34) << 31)) )
    return 0;
  result = MiChargeFullProcessCommitment(v4, v29 | ((unsigned __int64)*(unsigned __int8 *)(a1 + 34) << 31));
  if( result >= 0 )
    return 0;
  return result;
}

Referenced by:

MiCommitExistingVad
MiCommitPageTableRangesForVad
MiInsertVadCharges
MiSetProtectionOnSection
MiSplitPrivatePage