MiMakeHyperRangeAccessible
NTSTATUS __stdcall MiMakeHyperRangeAccessible(PVOID StartVa, PVOID EndVa, UINT64 *PagesCharged){
unsigned __int64 v3;
ULONG_PTR v6;
INT64 v7;
unsigned __int8 v8;
LONG *v9;
UINT8 v10;
int v11;
int v12;
_MMPTE *PteBase;
unsigned __int64 v14;
unsigned __int64 v15;
unsigned __int64 v16;
__int64 v17;
UINT64 v18;
__int64 v19;
__int64 v20;
_MMPTE *v21;
unsigned __int64 v22;
unsigned __int64 v23;
_MMPTE *PteLimit;
CHAR *AnyMultiplexedVm;
int v26;
INT64 v27;
_MMPTE *v28;
unsigned __int64 v29;
UINT64 v30;
unsigned __int64 v31;
UINT64 v32;
NTSTATUS result;
UINT64 v34;
int v35;
UINT8 CurrentIrql;
INT64 a4;
__int64 v38;
unsigned __int64 v39;
INT64 v40;
UINT64 *v41;
unsigned __int64 v42;
ULONG_PTR v43;
__int128 v44;
__int64 v45;
unsigned __int64 v46;
__int16 v47;
_BYTE v48[14];
__int64 v49;
CHAR *v50;
unsigned __int64 v51;
__int64 v52;
INT64(__fastcall *v53)(INT64);
__int128 *v54;
v3 = 0i64;
v41 = PagesCharged;
HIDWORD(a4) = 0;
v42 = 0i64;
v6 = *((_QWORD *)KeGetCurrentThread() + 23);
v43 = v6;
*PagesCharged = 0i64;
LODWORD(a4) = 0;
v7 = v6 + 1664;
v8 = *(_BYTE *)(v6 + 1848) & 7;
v40 = v7;
if( v8 >= 6u )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
}
else
{
if( v8 == 2 )
v9 = &dword_140C4F4C0;
else
v9 = (LONG *)(v7 + 192);
v10 = KeGetCurrentIrql();
__writecr8(2ui64);
_m_prefetchw(v9);
v11 = *v9 & 0x7FFFFFFF;
if( v11 != _InterlockedCompareExchange(v9, v11 + 1, v11) )
ExpWaitForSpinLockSharedAndAcquire((INT64 *)v9, v10);
if( v9[1] )
_InterlockedExchange(v9 + 1, 0);
CurrentIrql = v10;
}
v12 = 0;
v35 = 0;
PteBase = MmGetPteBase();
v14 = (unsigned __int64)PteBase + (((unsigned __int64)StartVa >> 9) & 0x7FFFFFFFF8i64);
v46 = v14;
v15 = (unsigned __int64)PteBase + (((unsigned __int64)EndVa >> 9) & 0x7FFFFFFFF8i64);
while( 1 )
{
v38 = 0i64;
v16 = 0i64;
v39 = 0i64;
v17 = 0i64;
v18 = v14;
if( v14 <= v15 )
{
v19 = (_QWORD)PteBase << 25;
v45 = (_QWORD)PteBase << 25;
v20 = (__int64)((v15 << 25) - ((_QWORD)PteBase << 25)) >> 16;
while( 1 )
{
v44 = 0i64;
memset((INT64)v48, 0i64);
v21 = MmGetPteBase();
v47 = 2145;
v22 = (__int64)((v18 << 25) - v19) >> 16;
v23 = v22;
if( v22 >= (unsigned __int64)v21 )
{
PteLimit = MmGetPteLimit();
do
{
if( v23 > (unsigned __int64)PteLimit )
break;
v23 = (__int64)((v23 << 25) - v19) >> 16;
}
while( v23 >= (unsigned __int64)v21 );
v7 = v40;
}
if( v23 >= 0xFFFF800000000000ui64 && (v23 < qword_140C4F878 || v23 > qword_140C4E0A8) )
AnyMultiplexedVm = MiGetAnyMultiplexedVm(1i64);
else
AnyMultiplexedVm = (CHAR *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1664i64);
v26 = MiFastLockLeafPageTable((INT64)AnyMultiplexedVm, v22);
if( v26 )
{
LODWORD(v44) = v26 - 1;
v28 = MmGetPteBase();
v29 = (unsigned __int64)v28 + ((v22 >> 9) & 0x7FFFFFFFF8i64);
*((_QWORD *)&v44 + 1) = v29;
}
else
{
v47 |= 4u;
v54 = &v44;
v49 = 0i64;
v50 = AnyMultiplexedVm;
v48[0] = v48[0] & 0xE3 | 4;
v53 = MiGetNextPageTableTail;
v48[4] = CurrentIrql;
v51 = v22;
v52 = v20;
MiWalkPageTables((INT64)&v47);
v29 = *((_QWORD *)&v44 + 1);
v28 = MmGetPteBase();
}
if( v29 )
{
v30 = (UINT64)v28 + ((v29 >> 9) & 0x7FFFFFFFF8i64);
if( v29 == v18 )
{
v31 = v15;
if( (v18 & 0xFFFFFFFFFFFFF000ui64) + 4088 <= v15 )
v31 = (v18 & 0xFFFFFFFFFFFFF000ui64) + 4088;
if( v18 <= v31 )
{
do
{
if( !*(_QWORD *)v18 )
MiMakeHyperPteDemandZero((UINT64 *)v18, v27, (INT64)&a4);
v18 += 8i64;
}
while( (v18 & 0xFFF) != 0 && v18 <= v31 );
v7 = v40;
v3 = 0i64;
}
MiUnlockPageTableInternal(v7, v30);
goto LABEL_33;
}
MiUnlockPageTableInternal(v7, (UINT64)v28 + ((v29 >> 9) & 0x7FFFFFFFF8i64));
v34 = v29 - 8;
}
else
{
v34 = v15;
}
MiFillHyperPtes(v18, v34, CurrentIrql, (INT64)&a4);
v18 = v34 + 8;
LABEL_33:
v19 = v45;
if( v18 > v15 )
{
v16 = v39;
v17 = v38;
v12 = v35;
break;
}
}
}
if( v12 || !v17 )
break;
MiUnlockWorkingSetShared(v7, CurrentIrql);
v42 = v16;
result = MiChargeFullProcessCommitment(v43, v17 + v16);
if( result < 0 )
return result;
LODWORD(a4) = 1;
*v41 = v17;
MiLockWorkingSetShared(v7);
v14 = v46;
v12 = 1;
v35 = 1;
PteBase = MmGetPteBase();
}
if( v16 )
{
_InterlockedExchangeAdd64(MiGetSharedVm(v7) + 6, v16);
v16 = v39;
v17 = v38;
}
MiUnlockWorkingSetShared(v7, CurrentIrql);
v32 = *v41;
if( v17 != *v41 )
{
*v41 = v17;
v3 = v32 - v17;
}
if( v16 != v42 )
v3 += v42 - v16;
if( v3 )
MiReturnFullProcessCommitment(v43, v3);
return 0;
}Referenced by:
MiCommitPageTablesForVad
MiExpandVadBitMap
MiExpandVadBitMapDown