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