MiComputePageCommitment

__int64 __fastcall MiComputePageCommitment(
        unsigned __int64 a1,
        unsigned __int64 a2,
        __int64 a3,
        char a4,
        char a5,
        _QWORD *a6){
  int v6; 
  unsigned __int64 v7; 
  __int64 v8; 
  _MMPTE *PteBase; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  _QWORD *v13; 
  char v14; 
  INT64 *v15; 
  __int64 v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  int IsPteDecommittedPage; 
  UINT64 v21; 
  int v22; 
  unsigned int v23; 
  __int64 v24; 
  unsigned __int64 v25; 
  _QWORD *CloneAddress; 
  unsigned __int64 v27; 
  UNICODE_STRING *v28; 
  UINT8 v29; 
  PWCHAR v30; 
  int v31; 
  __int64 v32; 
  unsigned __int64 v34; 
  UINT64 v35; 
  __int64 v36; 
  bool v37; 
  INT64 v38; 
  __int64 v39; 
  UINT64 v40; 
  INT64 v41; 
  unsigned int v42; 
  unsigned __int64 v43; 
  __int64 v44; 
  char v45; 
  v45 = a4;
  v42 = 0;
  v6 = 0;
  v7 = (a1 >> 9) & 0x7FFFFFFFF8i64;
  v39 = *((_QWORD *)KeGetCurrentThread() + 23);
  v8 = *(_QWORD *)(v39 + 1680);
  v41 = v39 + 1664;
  PteBase = MmGetPteBase();
  v44 = v8;
  v10 = (unsigned __int64)PteBase + v7;
  v11 = (unsigned __int64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
  v43 = v11;
  if( *(int *)(a3 + 52) >= 0 )
  {
    v12 = 0i64;
  }
  else
  {
    v6 = 2;
    v12 = ((__int64)(v11 - v10) >> 3) + 1;
  }
  v13 = a6;
  if( a6 )
    *a6 = 0i64;
  if( v10 <= v11 )
  {
    v14 = a5;
    do
    {
      MiGetNextPageTable(v10, v11, 0i64, a4, v14, &v42);
      v10 = (unsigned __int64)v15;
      if( !v15 )
        return v12;
      v17 = (unsigned __int64)v15;
      v18 = 1i64;
      if( v42 )
      {
        v19 = v42;
        v16 = (__int64)MmGetPteBase();
        do
        {
          v17 = v16 + ((v17 >> 9) & 0x7FFFFFFFF8i64);
          v18 <<= 9;
          --v19;
        }
        while( v19 );
      }
      v40 = (UINT64)MmGetPteBase() + ((v17 >> 9) & 0x7FFFFFFFF8i64);
      do
      {
        v38 = *(_QWORD *)v17;
        if( !v38 )
          goto LABEL_32;
        IsPteDecommittedPage = MiIsPteDecommittedPage((_MMPTE *)&v38, (_MMPFN_IDENTITY *)v16);
        v22 = v6;
        v6 |= 1u;
        v23 = v22 & 0xFFFFFFFE;
        if( !IsPteDecommittedPage )
          v6 = v23;
        if( (v6 & 2) != 0 )
        {
          v24 = v12 - v18;
          if( (v6 & 1) == 0 )
            v24 = v12;
          v12 = v24;
        }
        else if( (v6 & 1) == 0 )
        {
          v12 += v18;
        }
        if( !v13 )
          goto LABEL_31;
        v25 = *(_QWORD *)(v8 + 360);
        if( !v25 || (v6 & 1) != 0 )
          goto LABEL_30;
        CloneAddress = 0i64;
        if( (v21 & 1) != 0 )
        {
          v27 = MI_READ_PTE_LOCK_FREE((INT64)&v38);
          LOBYTE(v31) = MI_PFN_IS_PROTO(
                          (UNICODE_STRING *)MmGetPfnDb() + 3 * ((v27 >> 12) & 0xFFFFFFFFFi64),
                          v28,
                          v29,
                          v30);
          if( !v31 )
            goto LABEL_47;
          v16 = 0x1000000000i64;
          if( (*(_QWORD *)(v32 + 40) & 0x1000000000i64) == 0 && *(__int64 *)(v32 + 8) > 0 )
          {
            v13 = a6;
LABEL_30:
            v8 = v44;
LABEL_31:
            v11 = v43;
            goto LABEL_32;
          }
          v34 = *(_QWORD *)(v32 + 8) | 0x8000000000000000ui64;
          goto LABEL_46;
        }
        if( (v21 & 0x400) != 0 && !MiIsPrototypePteVadLookup(v21) && !MI_PROTO_FORMAT_COMBINED(v35) )
        {
          if( qword_140C4DC80 && (v36 & 0x10) == 0 )
            v36 &= ~qword_140C4DC80;
          v34 = v36 >> 16;
LABEL_46:
          CloneAddress = MiLocateCloneAddress(v39, v34);
        }
LABEL_47:
        v11 = v43;
        if( CloneAddress )
        {
          v37 = v25 <= CloneAddress[12];
          v13 = a6;
          v8 = v44;
          if( !v37 )
            ++*a6;
        }
        else
        {
          v13 = a6;
          v8 = v44;
        }
LABEL_32:
        v17 += 8i64;
        v10 += 8 * v18;
      }
      while( (v17 & 0xFFF) != 0 && v10 <= v11 );
      v14 = a5;
      if( (a5 & 4) == 0 )
      {
        MiUnlockPageTableInternal(v41, v40);
        v14 = a5;
      }
      a4 = v45;
    }
    while( v10 <= v11 );
  }
  return v12;
}

Referenced by:

MiCommitExistingVad
MiCountCommittedPages
MiDeletePartialVad
MiProtectPrivateMemory
MiSetProtectionOnSection