MiReleaseLargePteMappings
INT64 __fastcall MiReleaseLargePteMappings(_MI_SYSTEM_PTE_TYPE *PteInfo, _MI_CACHED_PTE *CachedPte, UINT64 FlushTb){
int v3;
__int64 PteIndex;
INT64 v7;
unsigned __int64 v8;
_MMPTE *PteBase;
__int64 v10;
__int64 v11;
INT64 AnyMultiplexedVm;
unsigned __int64 v13;
unsigned __int64 v14;
unsigned __int64 v15;
unsigned __int64 v16;
__int64 v17;
char *v18;
unsigned int v19;
INT64 v20;
unsigned int v21;
int v23[8];
UINT8 v24;
INT64 v25;
INT64 v26;
__int64 v27;
__int64 v28;
_MI_CACHED_PTE *v29;
unsigned __int64 v30;
__int64 v31;
__int64 v32;
INT64 result;
int v34;
__int64 v35;
v3 = FlushTb;
v29 = CachedPte;
memset((INT64)&result, 0i64);
PteIndex = CachedPte->PteIndex;
v7 = 0i64;
v8 = ((unsigned __int64)PteInfo->BasePte >> 9) & 0x7FFFFFFFF8i64;
PteBase = MmGetPteBase();
v35 = 0i64;
v31 = (__int64)PteBase + v8;
v34 = 20;
v10 = (_QWORD)PteBase << 25;
v32 = (_QWORD)PteBase << 25;
AnyMultiplexedVm = (INT64)MiGetAnyMultiplexedVm(3i64);
v25 = AnyMultiplexedVm;
do
{
v13 = v11 + 8 * PteIndex;
v14 = MI_READ_PTE_LOCK_FREE(v13);
if( (v14 & 0xF000) == 4096 )
{
v15 = 1i64;
}
else
{
v16 = MI_READ_PTE_LOCK_FREE(v13 + 8);
if( qword_140C4DC80 )
{
if( (v16 & 0x10) != 0 )
v16 &= ~0x10ui64;
else
v16 &= ~qword_140C4DC80;
}
v15 = HIDWORD(v16);
}
if( qword_140C4DC80 )
{
if( (v14 & 0x10) != 0 )
v14 &= ~0x10ui64;
else
v14 &= ~qword_140C4DC80;
}
PteIndex = HIDWORD(v14);
v26 = v15 + v7;
v30 = v15 << 21;
v17 = (((__int64)((v13 << 25) - v10) >> 16 << 25) - v10) >> 16;
v28 = v17;
v27 = PteIndex;
v18 = (char *)MmGetPteBase() + ((v13 >> 9) & 0x7FFFFFFFF8i64);
v24 = MiLockWorkingSetShared(AnyMultiplexedVm);
MiLockPageTableInternal(AnyMultiplexedVm, (UINT64)v18, 0i64);
v19 = 0;
if( v15 )
{
v20 = v25;
do
{
*(_QWORD *)v13 = ZeroPte;
if( v3 == 1 )
MiInsertLargeTbFlushEntry((INT64)&result, 1ui64, v13);
v13 += 8i64;
if( (v13 & 0xFFF) == 0 && v19 + 1 < v15 )
{
MiUnlockPageTableInternal(v20, (UINT64)v18);
v18 += 8;
MiLockPageTableInternal(v20, (UINT64)v18, 0i64);
}
++v19;
}
while( v19 < v15 );
PteIndex = v27;
v17 = v28;
AnyMultiplexedVm = v25;
}
MiUnlockPageTableInternal(AnyMultiplexedVm, (UINT64)v18);
MiUnlockWorkingSetShared(AnyMultiplexedVm, v24);
if( v3 == 1 )
{
MiFlushTbList((__int64)&result);
if( PteIndex )
{
_InterlockedOr(v23, 0);
v21 = KiTbFlushTimeStamp - v29->GlobalTimeStamp;
v3 = v21 <= 2 && ((v29->GlobalTimeStamp & 1) != 0 || v21 < 2);
}
}
MiReturnSystemVa(v17, v17 + v30, 13i64);
v11 = v31;
v7 = v26;
v10 = v32;
}
while( PteIndex );
return v26;
}Referenced by:
MiEmptyPteBins
MiInsertCachedPte