MiReturnPageTablePageCommitment
VOID __stdcall MiReturnPageTablePageCommitment(
VOID *StartingAddress,
VOID *EndingAddress,
ULONG_PTR CurrentProcess,
_MMVAD *PreviousVad,
_MMVAD *NextVad,
_MMVAD *Vad,
_MI_DELETED_PAGE_TABLE_LEVEL_BITS *DeletedHierarchyBits){
_MMVAD *v7;
__int64 v10;
__int64 LongFlags1;
unsigned __int64 v13;
__int64 v14;
unsigned __int64 v15;
unsigned __int64 v16;
NTSTATUS v17;
__int64 v18;
__int64 v19;
unsigned __int64 v20;
_MMVAD_SHORT *p_Core;
unsigned __int64 v22;
__int64 v23;
__int64 v24;
__int64 v25;
__int64 v26;
_MMVAD_SHORT *v27;
unsigned __int8 v28;
__int64 v29;
char v30;
__int64 v31;
unsigned __int64 v32;
_MMVAD_SHORT *v33;
_MMVAD *v34;
_MMVAD_SHORT *i;
_MMVAD_SHORT *v36;
_MMVAD_SHORT *v37;
_MMVAD_SHORT *ExtraCreateInfo;
_MI_DELETED_PAGE_TABLE_LEVEL_BITS *v39;
char v40;
__int64 v41;
unsigned __int64 v42;
_MMVAD_SHORT *v43;
_MMVAD *v44;
_MMVAD_SHORT *k;
_MMVAD_SHORT **v46;
_MMVAD_SHORT *v47;
_MMVAD_SHORT *m;
__int64 v49;
NTSTATUS v50;
__int64 v51;
signed __int64 v52;
__int64 v53;
__int64 v54;
int v55;
int v56;
unsigned __int64 v57;
int v58;
char v59;
__int64 v60;
__int64 v61;
__int64 v62;
__int64 v63;
int v64;
NTSTATUS v65;
_MMVAD_SHORT *j;
_MMVAD_SHORT *v67;
__int64 v68;
__int64 v69;
__int64 v70;
__int64 v71;
__int64 v72;
__int64 v73;
__int64 v74;
_MMVAD_SHORT *v75;
_MMVAD_SHORT *v76;
__int64 v77;
__int64 v78;
_EPROCESS *TargetProcess;
TargetProcess = *(_EPROCESS **)&CurrentProcess;
v7 = Vad;
v10 = *(_QWORD *)&CurrentProcess;
LongFlags1 = Vad->Core.u1.LongFlags1;
LODWORD(LongFlags1) = LongFlags1 & 0x7FFFFFFF;
v13 = LongFlags1 | ((unsigned __int64)Vad->Core.CommitChargeHigh << 31);
if( v13 >= 0x7FFFFFFFDi64 && v13 != 0x7FFFFFFFEi64 )
return;
v14 = 0i64;
v15 = (unsigned __int64)PreviousVad & 0xFFFFFFFFFFFFFFFEui64;
if( ((unsigned __int8)PreviousVad & 1) == 0 )
v15 = 0i64;
v75 = (_MMVAD_SHORT *)v15;
v16 = (unsigned __int64)NextVad & 0xFFFFFFFFFFFFFFFEui64;
if( ((unsigned __int8)NextVad & 1) == 0 )
v16 = 0i64;
v76 = (_MMVAD_SHORT *)v16;
MiVadPageTableChargeLevel((INT64)Vad);
v17 = MiVadPureReserve(&Vad->Core);
v20 = -1i64;
v23 = (unsigned int)((unsigned __int64)EndingAddress >> 21);
v65 = v17;
p_Core = (_MMVAD_SHORT *)((unsigned __int64)PreviousVad & 0xFFFFFFFFFFFFFFFEui64);
v22 = (unsigned __int64)StartingAddress >> 21;
v63 = v23;
LOBYTE(v23) = 0;
v74 = *(_QWORD *)(v10 + 1680) + 48i64;
if( !v24 )
p_Core = &PreviousVad->Core;
v25 = (unsigned int)v22;
v72 = v18;
v26 = v63;
v27 = (_MMVAD_SHORT *)((unsigned __int64)NextVad & 0xFFFFFFFFFFFFFFFEui64);
v28 = DeletedHierarchyBits->AddressLevels[0];
v70 = 0i64;
if( !v19 )
v27 = &NextVad->Core;
v69 = 0i64;
v29 = 0i64;
v73 = 1023i64;
v68 = 0i64;
v64 = 0;
j = p_Core;
v67 = v27;
do
{
v77 = v25;
v78 = v26;
if( !v28 )
{
++v25;
LABEL_40:
v39 = DeletedHierarchyBits;
goto LABEL_41;
}
if( !p_Core )
goto LABEL_40;
v30 = 9 * v23;
while( 1 )
{
if( (__int64)(((unsigned __int64)p_Core->EndingVpn >> 9) | ((unsigned __int64)p_Core->EndingVpnHigh << 23)) >> v30 != v25 )
{
LABEL_39:
LOBYTE(v23) = v64;
goto LABEL_40;
}
v31 = p_Core->u1.LongFlags1;
LODWORD(v31) = v31 & 0x7FFFFFFF;
v32 = v31 | ((unsigned __int64)p_Core->CommitChargeHigh << 31);
if( (v32 < 0x7FFFFFFFDi64 || v32 == 0x7FFFFFFFEi64) && (MiVadDeleted(p_Core) == 1 || !MiVadPureReserve(v33)) )
break;
if( p_Core == v75 )
{
p_Core = v7->Core.NextVad;
v34 = v7;
j = v7->Core.NextVad;
if( v7->Core.NextVad )
{
for( i = (_MMVAD_SHORT *)p_Core->ExtraCreateInfo; i; i = (_MMVAD_SHORT *)i->ExtraCreateInfo )
{
p_Core = i;
j = i;
}
goto LABEL_38;
}
p_Core = (_MMVAD_SHORT *)(v7->Core.VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
j = p_Core;
if( p_Core )
{
do
{
if( p_Core->ExtraCreateInfo == v34 )
break;
v34 = (_MMVAD *)p_Core;
p_Core = (_MMVAD_SHORT *)(p_Core->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
}
while( p_Core );
LABEL_37:
j = p_Core;
}
}
else
{
v36 = p_Core->NextVad;
v37 = p_Core;
if( p_Core->NextVad )
{
ExtraCreateInfo = (_MMVAD_SHORT *)v36->ExtraCreateInfo;
p_Core = p_Core->NextVad;
for( j = v36; ExtraCreateInfo; ExtraCreateInfo = (_MMVAD_SHORT *)ExtraCreateInfo->ExtraCreateInfo )
{
p_Core = ExtraCreateInfo;
j = ExtraCreateInfo;
}
goto LABEL_38;
}
p_Core = (_MMVAD_SHORT *)(p_Core->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
j = p_Core;
if( p_Core )
{
do
{
if( p_Core->ExtraCreateInfo == v37 )
break;
v37 = p_Core;
p_Core = (_MMVAD_SHORT *)(p_Core->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
}
while( p_Core );
goto LABEL_37;
}
}
LABEL_38:
if( !p_Core )
goto LABEL_39;
}
v39 = DeletedHierarchyBits;
++v25;
LOBYTE(v23) = v64;
DeletedHierarchyBits->AddressLevels[0] = 0;
LABEL_41:
if( v39->AddressLevels[1] )
{
if( v27 )
{
v40 = 9 * v23;
do
{
if( (__int64)(((unsigned __int64)v27->StartingVpn >> 9) | ((unsigned __int64)v27->StartingVpnHigh << 23)) >> v40 != v26 )
break;
v41 = v27->u1.LongFlags1;
LODWORD(v41) = v41 & 0x7FFFFFFF;
v42 = v41 | ((unsigned __int64)v27->CommitChargeHigh << 31);
if( (v42 < 0x7FFFFFFFDi64 || v42 == 0x7FFFFFFFEi64) && (MiVadDeleted(v27) == 1 || !MiVadPureReserve(v43)) )
{
DeletedHierarchyBits->AddressLevels[1] = 0;
goto LABEL_70;
}
if( v27 == v76 )
{
v27 = (_MMVAD_SHORT *)v7->Core.ExtraCreateInfo;
v44 = v7;
v67 = v27;
if( v27 )
{
for( k = v27->NextVad; k; k = k->NextVad )
{
v27 = k;
v67 = k;
}
continue;
}
v27 = (_MMVAD_SHORT *)(v7->Core.VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
v67 = v27;
if( v27 )
{
do
{
if( (_MMVAD *)v27->NextVad == v44 )
break;
v44 = (_MMVAD *)v27;
v27 = (_MMVAD_SHORT *)(v27->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
}
while( v27 );
LABEL_66:
v67 = v27;
}
}
else
{
v46 = (_MMVAD_SHORT **)v27->ExtraCreateInfo;
v47 = v27;
if( v46 )
{
v27 = (_MMVAD_SHORT *)v27->ExtraCreateInfo;
v67 = (_MMVAD_SHORT *)v46;
for( m = *v46; m; m = m->NextVad )
{
v27 = m;
v67 = m;
}
continue;
}
v27 = (_MMVAD_SHORT *)(v27->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
v67 = v27;
if( v27 )
{
do
{
if( v27->NextVad == v47 )
break;
v47 = v27;
v27 = (_MMVAD_SHORT *)(v27->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
}
while( v27 );
goto LABEL_66;
}
}
}
while( v27 );
}
}
else
{
LABEL_70:
v63 = --v26;
}
if( v25 > v26 )
break;
v49 = v72;
v50 = v65;
if( v29 >= v72 && !v65 )
v70 += v26 - v25 + 1;
v51 = v69;
v52 = v25;
v53 = v70;
v54 = v74 - 16 * v29;
v71 = v25;
do
{
if( v50 )
{
if( v52 == v25 )
{
v55 = MiBitmapRangeZeroEx(v54 + 520, v52, &v71);
v25 = v71;
v26 = v63;
if( v55 == 1 )
{
v52 = v71 - 1;
goto LABEL_99;
}
v49 = v72;
}
if( !_bittest64(*(const signed __int64 **)(v54 + 528), v52) )
goto LABEL_99;
if( v29 >= v49 )
++v53;
}
_bittestandreset64(*(signed __int64 **)(v54 + 528), v52);
if( !MiCreateSystemWsles() && (v52 == v26 || (v52 & 7) == 7 || v56) )
{
v57 = v52 & 0xFFFFFFFFFFFFFFF8ui64;
RtlAreBitsClearEx((_RTL_BITMAP_EX *)(v54 + 520), v52 & 0xFFFFFFFFFFFFFFF8ui64, 8ui64);
v58 = (int)TargetProcess;
if( v59 != 1 || (TargetProcess->Flags3 & 1) == 0 && v57 == (v73 & 0xFFFFFFFFFFFFFFF8ui64) )
goto LABEL_93;
if( v68 )
{
++v51;
LABEL_93:
v26 = v63;
v29 = v68;
goto LABEL_100;
}
if( v20 == -1i64 )
{
v26 = v63;
v20 = v52 & 0xFFFFFFFFFFFFFFF8ui64;
v29 = 0i64;
v14 = 1i64;
goto LABEL_100;
}
if( v20 + 8 * v14 == v57 )
{
v26 = v63;
++v14;
v29 = 0i64;
goto LABEL_100;
}
HalSystemVectorDispatchEntry(
(_DWORD)TargetProcess + 1664,
(PKINTERRUPT_ROUTINE **)(v20 << 21),
(PKINTERRUPT_ROUTINE *)v14);
v26 = v63;
v51 += v14;
v20 = v52 & 0xFFFFFFFFFFFFFFF8ui64;
v14 = 1i64;
v29 = 0i64;
}
LABEL_99:
v58 = (int)TargetProcess;
LABEL_100:
v50 = v65;
++v52;
v49 = v72;
}
while( v52 <= v26 );
v70 = v53;
v27 = v67;
v69 = v51;
p_Core = j;
if( v14 )
{
HalSystemVectorDispatchEntry(v58 + 1664, (PKINTERRUPT_ROUTINE **)(v20 << 21), (PKINTERRUPT_ROUTINE *)v14);
v69 += v14;
v20 = -1i64;
v14 = 0i64;
}
++v29;
v60 = v77;
LODWORD(v23) = v64 + 1;
v61 = v78;
DeletedHierarchyBits->AddressLevels[0] >>= 1;
DeletedHierarchyBits->AddressLevels[1] >>= 1;
v73 >>= 9;
v28 = DeletedHierarchyBits->AddressLevels[0];
v7 = Vad;
v26 = v61 >> 9;
v25 = v60 >> 9;
v63 = v26;
v64 = v23;
v68 = v29;
}
while( (int)v23 < 3 );
v62 = v69;
if( v69 )
MiUpdateChargedWsles((INT64)&TargetProcess->Vm);
if( v70 )
*(_QWORD *)(v74 + 240) -= v70;
if( v62 + v70 )
MiReturnFullProcessCommitment(TargetProcess, v62 + v70);
}Referenced by:
MiDeleteEmptyPageTableCommit
MiDeletePartialVad
MiDeleteVad