MiInsertCachedPte
INT64 __fastcall MiInsertCachedPte(INT64 a1, UINT64 a2, UINT64 a3){
__int64 v3;
__int64 v6;
unsigned __int64 v8;
int v9;
unsigned __int64 PteBase;
unsigned __int64 v11;
_MMPTE *Pml4eBase;
_MMPTE *PxeUserLimit;
__int64 v14;
_MMPTE *v15;
__int64 v16;
__int64 v17;
__int64 v18;
unsigned int v19;
volatile signed __int64 *v20;
unsigned __int64 v21;
__int64 v22;
unsigned __int64 v23;
signed __int64 v24;
int v25;
unsigned __int8 CurrentIrql;
int v27;
unsigned __int64 v28;
unsigned __int64 v29;
unsigned __int64 v30;
signed __int32 v31[8];
_MI_CACHED_PTE v32;
__int64 v33;
_MI_CACHED_PTE CachedPte;
__int64 v35;
__int64 v36;
unsigned __int64 v37;
unsigned int v38;
int v39;
v38 = a3;
v3 = (unsigned int)a3;
v32 = 0i64;
if( (unsigned int)MiIsPteCachingOptimizationEnabled() )
{
if( (unsigned int)v3 >= 0x200 )
return 0i64;
}
else if( (unsigned int)v3 > 0x40 )
{
return 0i64;
}
v8 = *(_QWORD *)(a1 + 16);
v37 = v8;
v9 = 0;
v39 = 0;
PteBase = (unsigned __int64)MmGetPteBase();
v11 = (__int64)((a2 << 25) - (PteBase << 25)) >> 16;
if( v11 >= PteBase && v11 <= (unsigned __int64)MmGetPteLimit() )
{
v9 = 1;
v39 = 1;
v8 = PteBase + ((v8 >> 9) & 0x7FFFFFFFF8i64);
v37 = v8;
if( (unsigned int)v3 > (4096 - (a2 & 0xFFF)) >> 3 )
return 0i64;
}
if( a2 == v8 )
return 0i64;
Pml4eBase = MmGetPml4eBase();
PxeUserLimit = MmGetPxeUserLimit();
if( (_DWORD)v3 == 1 )
{
v14 = 4096i64;
}
else
{
v15 = (_MMPTE *)(a2 + 8);
v16 = v3 << 32;
if( qword_140C4DC80 )
{
if( (v16 & qword_140C4DC80) != 0 )
v16 |= 0x10ui64;
else
v16 |= qword_140C4DC80;
}
if( v15 >= Pml4eBase
&& v15 <= PxeUserLimit
&& (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
&& (v16 & 1) != 0 )
{
v16 |= v6;
}
*(_QWORD *)v15 = v16;
v14 = 0i64;
}
v17 = *(_QWORD *)(a1 + 80);
v35 = v14;
if( v9 )
v17 += 72i64 * (unsigned __int16)KeNumberNodes;
v18 = v17 + 72i64 * *(unsigned __int16 *)(*((_QWORD *)KeGetCurrentPrcb() + 24) + 146i64);
v36 = v18;
_InterlockedOr(v31, 0);
v19 = KiTbFlushTimeStamp;
if( !(_DWORD)KiTbFlushTimeStamp )
{
do
{
KeFlushTb(0i64, 1u);
_InterlockedOr(v31, 0);
v19 = KiTbFlushTimeStamp;
}
while( !(_DWORD)KiTbFlushTimeStamp );
v18 = v36;
v9 = v39;
}
v20 = (volatile signed __int64 *)(v18 + 8i64 * (v19 & 7));
if( v9 )
{
v21 = v3 + *(int *)(v18 + 64);
if( v21 >= 0x80 )
{
MiEmptyPteBins((_MI_SYSTEM_PTE_TYPE *)a1, 1ui64);
return 0i64;
}
if( v21 >= 0x40 )
{
MiEmptyPteBins((_MI_SYSTEM_PTE_TYPE *)a1, 0i64);
v9 = v39;
}
}
v22 = 0i64;
if( qword_140C4DC80 )
v22 = qword_140C4DC80;
v23 = v14 | v22 & 0xFFFFFFFFFFFF0FFFui64;
LABEL_34:
v24 = *v20;
v33 = *v20;
while( 1 )
{
while( 1 )
{
CachedPte = (_MI_CACHED_PTE)v24;
if( (_DWORD)v24 != v19 )
{
if( HIDWORD(v24) )
break;
}
if( v23 )
{
if( qword_140C4DC80 )
{
if( (v23 & 0x10) != 0 )
LODWORD(v23) = v23 & 0xFFFFFFEF;
else
LODWORD(v23) = ~(_DWORD)qword_140C4DC80 & v23;
}
}
else
{
LODWORD(v23) = 0;
}
v23 = ((unsigned __int64)HIDWORD(v33) << 32) | (unsigned int)v23;
if( qword_140C4DC80 )
{
if( (qword_140C4DC80 & v23) != 0 )
v23 |= 0x10ui64;
else
v23 |= qword_140C4DC80;
}
v29 = v23;
if( a2 >= (unsigned __int64)MmGetPml4eBase()
&& a2 <= (unsigned __int64)MmGetPxeUserLimit()
&& (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
&& (v23 & 1) != 0 )
{
v29 = v23 | 0x8000000000000000ui64;
}
*(_QWORD *)a2 = v29;
v32.GlobalTimeStamp = v19;
v32.PteIndex = (__int64)(a2 - v8) >> 3;
v24 = _InterlockedCompareExchange64(v20, v32.Long, v24);
v33 = v24;
if( v24 == CachedPte )
{
_InterlockedExchangeAdd((volatile signed __int32 *)(v36 + 64), v38);
return 1i64;
}
}
if( !(_DWORD)v24 )
goto LABEL_34;
_InterlockedOr(v31, 0);
if( (unsigned int)(KiTbFlushTimeStamp - v24) <= 2 )
{
if( (v24 & 1) != 0 || (v25 = 0, (unsigned int)(KiTbFlushTimeStamp - v24) < 2) )
v25 = 1;
}
else
{
v25 = 0;
}
if( v25 )
break;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v24 = _InterlockedCompareExchange64(v20, 0i64, v24);
v33 = v24;
if( v24 == CachedPte )
{
if( v9 )
{
v27 = MiReleaseLargePteMappings((_MI_SYSTEM_PTE_TYPE *)a1, &CachedPte, 0i64);
}
else
{
v28 = MiReplenishBitMap(a1, CachedPte.PteIndex, 0i64);
v27 = v28;
_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 88), v28);
}
_InterlockedExchangeAdd((volatile signed __int32 *)(v36 + 64), -v27);
v24 = 0i64;
v33 = 0i64;
}
__writecr8(CurrentIrql);
v8 = v37;
v9 = v39;
}
v32.PteIndex = (__int64)(a2 - v8) >> 3;
*(_QWORD *)a2 = v35 | MiSwizzleInvalidPte(0i64) & 0xFFFFFFFFFFFF0FFFui64;
if( v39 )
{
LODWORD(v30) = MiReleaseLargePteMappings((_MI_SYSTEM_PTE_TYPE *)a1, &v32, 0i64);
}
else
{
v30 = MiReplenishBitMap(a1, v32.PteIndex, 0i64);
_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 88), v30);
}
_InterlockedExchangeAdd((volatile signed __int32 *)(v36 + 64), -(int)v30);
return 1i64;
}Referenced by:
MiReleasePtes
MmUnmapIoSpace