MiReturnPageTablePageCommitment

INT64 __fastcall MiReturnPageTablePageCommitment(
        UINT64 a1,
        UINT64 a2,
        UINT64 r8_0,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        UINT8 *a7){
  __int64 *v7; 
  __int64 v12; 
  unsigned __int64 v13; 
  INT64 result; 
  __int64 v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  int v18; 
  __int64 v19; 
  __int64 v20; 
  unsigned __int64 v21; 
  __int64 v22; 
  UINT64 v23; 
  __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  __int64 v27; 
  __int64 v28; 
  __int64 v29; 
  char v30; 
  __int64 v31; 
  unsigned __int64 v32; 
  __int64 v33; 
  __int64 v34; 
  __int64 i; 
  __int64 v36; 
  __int64 v37; 
  __int64 v38; 
  char v39; 
  __int64 v40; 
  unsigned __int64 v41; 
  __int64 v42; 
  INT64 *v43; 
  INT64 **v44; 
  INT64 *v45; 
  __int64 v46; 
  int v47; 
  __int64 v48; 
  __int64 v49; 
  __int64 v50; 
  INT64 v51; 
  int v52; 
  int v53; 
  unsigned __int64 v54; 
  __int64 v55; 
  __int64 v56; 
  __int64 v57; 
  __int64 v58; 
  int v59; 
  int v60; 
  __int64 j; 
  __int64 v62; 
  __int64 v63; 
  __int64 v64; 
  __int64 v65; 
  __int64 a3; 
  __int64 v67; 
  __int64 v68; 
  INT64 v69; 
  unsigned __int64 v70; 
  unsigned __int64 v71; 
  __int64 v72; 
  __int64 v73; 
  v7 = (__int64 *)a6;
  v12 = *(unsigned int *)(a6 + 52);
  LODWORD(v12) = v12 & 0x7FFFFFFF;
  v13 = v12 | ((unsigned __int64)*(unsigned __int8 *)(a6 + 34) << 31);
  result = 0x7FFFFFFFEi64;
  if( v13 >= 0x7FFFFFFFDi64 && v13 != 0x7FFFFFFFEi64 )
    return result;
  v15 = 0i64;
  v16 = a4 & 0xFFFFFFFFFFFFFFFEui64;
  if( (a4 & 1) == 0 )
    v16 = 0i64;
  v70 = v16;
  v17 = a5 & 0xFFFFFFFFFFFFFFFEui64;
  if( (a5 & 1) == 0 )
    v17 = 0i64;
  v71 = v17;
  MiVadPageTableChargeLevel(a6);
  v18 = MiVadPureReserve(a6);
  v21 = -1i64;
  v24 = (unsigned int)(a2 >> 21);
  v60 = v18;
  v22 = a4 & 0xFFFFFFFFFFFFFFFEui64;
  v23 = a1 >> 21;
  v58 = v24;
  LOBYTE(v24) = 0;
  v69 = *(_QWORD *)(r8_0 + 1680) + 48i64;
  if( !v25 )
    v22 = a4;
  v26 = (unsigned int)v23;
  v67 = v19;
  v27 = v58;
  v28 = a5 & 0xFFFFFFFFFFFFFFFEui64;
  LOBYTE(result) = *a7;
  v65 = 0i64;
  if( !v20 )
    v28 = a5;
  v64 = 0i64;
  v29 = 0i64;
  v68 = 1023i64;
  v63 = 0i64;
  v59 = 0;
  j = v22;
  v62 = v28;
  do
  {
    v72 = v26;
    v73 = v27;
    if( !(_BYTE)result )
    {
      ++v26;
LABEL_40:
      result = (INT64)a7;
      goto LABEL_41;
    }
    if( !v22 )
      goto LABEL_40;
    v30 = 9 * v24;
    while( 1 )
    {
      if( (__int64)(((unsigned __int64)*(unsigned int *)(v22 + 28) >> 9) | ((unsigned __int64)*(unsigned __int8 *)(v22 + 33) << 23)) >> v30 != v26 )
      {
LABEL_39:
        LOBYTE(v24) = v59;
        goto LABEL_40;
      }
      v31 = *(unsigned int *)(v22 + 52);
      LODWORD(v31) = v31 & 0x7FFFFFFF;
      v32 = v31 | ((unsigned __int64)*(unsigned __int8 *)(v22 + 34) << 31);
      if( (v32 < 0x7FFFFFFFDi64 || v32 == 0x7FFFFFFFEi64)
        && ((unsigned int)MiVadDeleted(v22) == 1 || !(unsigned int)MiVadPureReserve(v33)) )
      {
        break;
      }
      if( v22 == v70 )
      {
        v22 = *v7;
        v34 = (__int64)v7;
        j = *v7;
        if( *v7 )
        {
          for( i = *(_QWORD *)(v22 + 8); i; i = *(_QWORD *)(i + 8) )
          {
            v22 = i;
            j = i;
          }
          goto LABEL_38;
        }
        v22 = v7[2] & 0xFFFFFFFFFFFFFFFCui64;
        j = v22;
        if( v22 )
        {
          do
          {
            if( *(_QWORD *)(v22 + 8) == v34 )
              break;
            v34 = v22;
            v22 = *(_QWORD *)(v22 + 16) & 0xFFFFFFFFFFFFFFFCui64;
          }
          while( v22 );
LABEL_37:
          j = v22;
        }
      }
      else
      {
        v36 = *(_QWORD *)v22;
        v37 = v22;
        if( *(_QWORD *)v22 )
        {
          v38 = *(_QWORD *)(v36 + 8);
          v22 = *(_QWORD *)v22;
          for( j = v36; v38; v38 = *(_QWORD *)(v38 + 8) )
          {
            v22 = v38;
            j = v38;
          }
          goto LABEL_38;
        }
        v22 = *(_QWORD *)(v22 + 16) & 0xFFFFFFFFFFFFFFFCui64;
        j = v22;
        if( v22 )
        {
          do
          {
            if( *(_QWORD *)(v22 + 8) == v37 )
              break;
            v37 = v22;
            v22 = *(_QWORD *)(v22 + 16) & 0xFFFFFFFFFFFFFFFCui64;
          }
          while( v22 );
          goto LABEL_37;
        }
      }
LABEL_38:
      if( !v22 )
        goto LABEL_39;
    }
    result = (INT64)a7;
    ++v26;
    LOBYTE(v24) = v59;
    *a7 = 0;
LABEL_41:
    if( *(_BYTE *)(result + 1) )
    {
      if( v28 )
      {
        v39 = 9 * v24;
        do
        {
          result = (unsigned __int64)*(unsigned int *)(v28 + 24) >> 9;
          if( (__int64)(result | ((unsigned __int64)*(unsigned __int8 *)(v28 + 32) << 23)) >> v39 != v27 )
            break;
          v40 = *(unsigned int *)(v28 + 52);
          LODWORD(v40) = v40 & 0x7FFFFFFF;
          v41 = v40 | ((unsigned __int64)*(unsigned __int8 *)(v28 + 34) << 31);
          if( (v41 < 0x7FFFFFFFDi64 || v41 == 0x7FFFFFFFEi64)
            && ((unsigned int)MiVadDeleted(v28) == 1 || !(unsigned int)MiVadPureReserve(v42)) )
          {
            result = (INT64)a7;
            a7[1] = 0;
            goto LABEL_70;
          }
          if( v28 == v71 )
          {
            v28 = v7[1];
            result = (INT64)v7;
            v62 = v28;
            if( v28 )
            {
              v43 = *(INT64 **)v28;
              if( *(_QWORD *)v28 )
              {
                do
                {
                  result = *v43;
                  v28 = (__int64)v43;
                  v62 = (__int64)v43;
                  v43 = (INT64 *)result;
                }
                while( result );
              }
              continue;
            }
            v28 = v7[2] & 0xFFFFFFFFFFFFFFFCui64;
            v62 = v28;
            if( v28 )
            {
              do
              {
                if( *(_QWORD *)v28 == result )
                  break;
                result = v28;
                v28 = *(_QWORD *)(v28 + 16) & 0xFFFFFFFFFFFFFFFCui64;
              }
              while( v28 );
LABEL_66:
              v62 = v28;
            }
          }
          else
          {
            v44 = *(INT64 ***)(v28 + 8);
            result = v28;
            if( v44 )
            {
              v28 = *(_QWORD *)(v28 + 8);
              v62 = (__int64)v44;
              v45 = *v44;
              if( v45 )
              {
                do
                {
                  result = *v45;
                  v28 = (__int64)v45;
                  v62 = (__int64)v45;
                  v45 = (INT64 *)result;
                }
                while( result );
              }
              continue;
            }
            v28 = *(_QWORD *)(v28 + 16) & 0xFFFFFFFFFFFFFFFCui64;
            v62 = v28;
            if( v28 )
            {
              do
              {
                if( *(_QWORD *)v28 == result )
                  break;
                result = v28;
                v28 = *(_QWORD *)(v28 + 16) & 0xFFFFFFFFFFFFFFFCui64;
              }
              while( v28 );
              goto LABEL_66;
            }
          }
        }
        while( v28 );
      }
    }
    else
    {
LABEL_70:
      v58 = --v27;
    }
    if( v26 > v27 )
      break;
    v46 = v67;
    v47 = v60;
    if( v29 >= v67 && !v60 )
      v65 += v27 - v26 + 1;
    v48 = v64;
    v49 = v26;
    v50 = v65;
    v51 = v69 - 16 * v29;
    a3 = v26;
    do
    {
      if( v47 )
      {
        if( v49 == v26 )
        {
          v52 = MiBitmapRangeZeroEx(v51 + 520, v49, &a3);
          v26 = a3;
          v27 = v58;
          if( v52 == 1 )
          {
            v49 = a3 - 1;
            goto LABEL_100;
          }
          v46 = v67;
        }
        if( !_bittest64(*(const signed __int64 **)(v51 + 528), v49) )
          goto LABEL_100;
        if( v29 >= v46 )
          ++v50;
      }
      _bittestandreset64(*(signed __int64 **)(v51 + 528), v49);
      if( !(unsigned int)MiCreateSystemWsles() && (v49 == v27 || (v49 & 7) == 7 || v53) )
      {
        v54 = v49 & 0xFFFFFFFFFFFFFFF8ui64;
        if( !RtlAreBitsClearEx(v51 + 520, v49 & 0xFFFFFFFFFFFFFFF8ui64, 8ui64)
          || (*(_DWORD *)(r8_0 + 2172) & 1) == 0 && v54 == (v68 & 0xFFFFFFFFFFFFFFF8ui64) )
        {
          goto LABEL_93;
        }
        if( v63 )
        {
          ++v48;
LABEL_93:
          v27 = v58;
          v29 = v63;
          goto LABEL_100;
        }
        if( v21 == -1i64 )
        {
          v27 = v58;
          v21 = v49 & 0xFFFFFFFFFFFFFFF8ui64;
          v29 = 0i64;
          v15 = 1i64;
        }
        else
        {
          if( v21 + 8 * v15 == v54 )
          {
            v27 = v58;
            ++v15;
          }
          else
          {
            HalSystemVectorDispatchEntry();
            v27 = v58;
            v48 += v15;
            v21 = v49 & 0xFFFFFFFFFFFFFFF8ui64;
            v15 = 1i64;
          }
          v29 = 0i64;
        }
      }
LABEL_100:
      v47 = v60;
      ++v49;
      v46 = v67;
    }
    while( v49 <= v27 );
    v65 = v50;
    v28 = v62;
    v64 = v48;
    v22 = j;
    if( v15 )
    {
      HalSystemVectorDispatchEntry();
      v64 += v15;
      v21 = -1i64;
      v15 = 0i64;
    }
    ++v29;
    v55 = v72;
    LODWORD(v24) = v59 + 1;
    v56 = v73;
    *a7 >>= 1;
    a7[1] >>= 1;
    v68 >>= 9;
    result = *a7;
    v7 = (__int64 *)a6;
    v27 = v56 >> 9;
    v26 = v55 >> 9;
    v58 = v27;
    v59 = v24;
    v63 = v29;
  }
  while( (int)v24 < 3 );
  v57 = v64;
  if( v64 )
    result = (INT64)MiUpdateChargedWsles(r8_0 + 1664);
  if( v65 )
  {
    result = v69;
    *(_QWORD *)(v69 + 240) -= v65;
  }
  if( v57 + v65 )
    return MiReturnFullProcessCommitment(r8_0, v57 + v65);
  return result;
}

Referenced by:

MiDeleteEmptyPageTableCommit
MiDeletePartialVad
MiDeleteVad