MiReleaseLargePteMappings
NTSTATUS __stdcall 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;
_MMSUPPORT_INSTANCE *AnyMultiplexedVm;
UINT64 v13;
unsigned __int64 v14;
unsigned __int64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
unsigned __int64 v18;
__int64 v19;
char *v20;
char v21;
unsigned int v22;
INT64 v23;
unsigned __int64 Long;
int v25;
UINT64 v26;
unsigned int v27;
int v29[8];
UINT64 WsIrql;
INT64 v31;
unsigned __int64 v32;
__int64 v33;
__int64 v34;
_MI_CACHED_PTE *v35;
unsigned __int64 v36;
__int64 v37;
__int64 v38;
_MI_TB_FLUSH_LIST TbFlushList[48];
v3 = FlushTb;
v35 = CachedPte;
memset(TbFlushList, 0i64, 0xB8u);
PteIndex = CachedPte->PteIndex;
v7 = 0i64;
v8 = ((unsigned __int64)PteInfo->BasePte >> 9) & 0x7FFFFFFFF8i64;
PteBase = MmGetPteBase();
*(_QWORD *)&TbFlushList[6] = 0i64;
v37 = (__int64)PteBase + v8;
TbFlushList[2] = 20;
v10 = (_QWORD)PteBase << 25;
v38 = (_QWORD)PteBase << 25;
AnyMultiplexedVm = MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemPtes, (char *)PteBase + v8);
v31 = (INT64)AnyMultiplexedVm;
do
{
v13 = v11 + 8 * PteIndex;
LODWORD(v14) = MI_READ_PTE_LOCK_FREE(v13);
v15 = v14;
if( (v14 & 0xF000) == 4096 )
{
v16 = 1i64;
}
else
{
LODWORD(v17) = MI_READ_PTE_LOCK_FREE(v13 + 8);
v18 = v17;
if( *(&stru_140C4DB30 + 42) )
{
if( (v17 & 0x10) != 0 )
v18 = v17 & 0xFFFFFFFFFFFFFFEFui64;
else
v18 = ~*(&stru_140C4DB30 + 42) & v17;
}
v16 = HIDWORD(v18);
}
if( *(&stru_140C4DB30 + 42) )
{
if( (v15 & 0x10) != 0 )
v15 &= ~0x10ui64;
else
v15 &= ~*(&stru_140C4DB30 + 42);
}
PteIndex = HIDWORD(v15);
v32 = v16 + v7;
v36 = v16 << 21;
v19 = (((__int64)((v13 << 25) - v10) >> 16 << 25) - v10) >> 16;
v34 = v19;
v33 = PteIndex;
v20 = (char *)MmGetPteBase() + ((v13 >> 9) & 0x7FFFFFFFF8i64);
MiLockWorkingSetShared();
LOBYTE(WsIrql) = v21;
MiLockPageTableInternal((INT64)AnyMultiplexedVm, (UINT64)v20, 0i64);
v22 = 0;
if( v16 )
{
v23 = v31;
do
{
Long = ZeroPte.u.Long;
LOBYTE(v25) = MiPteInShadowRange(v13);
if( v25 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
*(_QWORD *)v13 = Long;
if( v3 == 1 )
MiInsertLargeTbFlushEntry(TbFlushList, 1ui64, v13);
v13 += 8i64;
if( (v13 & 0xFFF) == 0 && v22 + 1 < v16 )
{
MiUnlockPageTableInternal(v23, (UINT64)v20);
v20 += 8;
MiLockPageTableInternal(v23, (UINT64)v20, 0i64);
}
++v22;
}
while( v22 < v16 );
PteIndex = v33;
v19 = v34;
AnyMultiplexedVm = (_MMSUPPORT_INSTANCE *)v31;
}
MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, (UINT64)v20);
LOBYTE(v26) = WsIrql;
MiUnlockWorkingSetShared(AnyMultiplexedVm, v26);
if( v3 == 1 )
{
MiFlushTbList(TbFlushList);
if( PteIndex )
{
_InterlockedOr(v29, 0);
v27 = KiTbFlushTimeStamp - v35->GlobalTimeStamp;
v3 = v27 <= 2 && ((v35->GlobalTimeStamp & 1) != 0 || v27 < 2);
}
}
MiReturnSystemVa((VOID *)v19, (VOID *)(v19 + v36), MiVaSystemPtesLarge, 0i64);
v11 = v37;
v7 = v32;
v10 = v38;
}
while( PteIndex );
return v32;
}Referenced by:
MiEmptyPteBins
MiInsertCachedPte