MiInsertCachedPte
NTSTATUS __stdcall MiInsertCachedPte(_MI_SYSTEM_PTE_TYPE *PteInfo, _MMPTE *PointerPte, UINT64 NumberOfPtes){
__int64 v3;
__int64 v6;
unsigned __int64 BasePte;
int v9;
unsigned __int64 PteBase;
unsigned __int64 v11;
_MMPTE *Pml4eBase;
_MMPTE *PxeUserLimit;
__int64 v14;
_MMPTE *v15;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v16;
volatile _MI_CACHED_PTES *CachedPtes;
__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;
NTSTATUS v27;
unsigned __int64 v28;
unsigned __int64 v29;
unsigned __int64 v30;
int v31;
unsigned __int64 v32;
signed __int32 v33[8];
_MI_CACHED_PTE v34;
__int64 v35;
_MI_CACHED_PTE CachedPte;
__int64 v37;
__int64 v38;
_MMPTE *v39;
unsigned int v40;
int v41;
v40 = NumberOfPtes;
v3 = (unsigned int)NumberOfPtes;
v34 = 0i64;
if( MiIsPteCachingOptimizationEnabled() )
{
if( (unsigned int)v3 >= 0x200 )
return 0;
}
else if( (unsigned int)v3 > 0x40 )
{
return 0;
}
BasePte = (unsigned __int64)PteInfo->BasePte;
v39 = (_MMPTE *)BasePte;
v9 = 0;
v41 = 0;
PteBase = (unsigned __int64)MmGetPteBase();
v11 = (__int64)(((_QWORD)PointerPte << 25) - (PteBase << 25)) >> 16;
if( v11 >= PteBase && v11 <= (unsigned __int64)MmGetPteLimit() )
{
v9 = 1;
v41 = 1;
BasePte = PteBase + ((BasePte >> 9) & 0x7FFFFFFFF8i64);
v39 = (_MMPTE *)BasePte;
if( (unsigned int)v3 > (4096 - ((unsigned __int16)PointerPte & 0xFFFu)) >> 3 )
return 0;
}
if( PointerPte == (_MMPTE *)BasePte )
return 0;
Pml4eBase = MmGetPml4eBase();
PxeUserLimit = MmGetPxeUserLimit();
if( (_DWORD)v3 == 1 )
{
v14 = 4096i64;
}
else
{
v15 = PointerPte + 1;
v16.Long = v3 << 32;
if( *(&stru_140C4DB30 + 42) )
{
if( (v16.Long & *(&stru_140C4DB30 + 42)) != 0 )
v16.Long |= 0x10ui64;
else
v16.Long |= *(&stru_140C4DB30 + 42);
}
if( v15 >= Pml4eBase
&& v15 <= PxeUserLimit
&& (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0
&& (v16.Long & 1) != 0 )
{
v16.Long |= v6;
}
v15->u.Long = v16.Long;
v14 = 0i64;
}
CachedPtes = PteInfo->CachedPtes;
v37 = v14;
if( v9 )
CachedPtes += (unsigned __int16)KeNumberNodes;
v18 = (__int64)&CachedPtes[KeGetCurrentPrcb()->ParentNode->Affinity.Reserved[0]];
v38 = v18;
_InterlockedOr(v33, 0);
v19 = KiTbFlushTimeStamp;
if( !(_DWORD)KiTbFlushTimeStamp )
{
do
{
KeFlushTb(FlushKernel, FlushAllAwakeProcessors);
_InterlockedOr(v33, 0);
v19 = KiTbFlushTimeStamp;
}
while( !(_DWORD)KiTbFlushTimeStamp );
v18 = v38;
v9 = v41;
}
v20 = (volatile signed __int64 *)(v18 + 8i64 * (v19 & 7));
if( v9 )
{
v21 = v3 + *(int *)(v18 + 64);
if( v21 >= 0x80 )
{
MiEmptyPteBins(PteInfo, (CHAR *)1);
return 0;
}
if( v21 >= 0x40 )
{
MiEmptyPteBins(PteInfo, 0i64);
v9 = v41;
}
}
v22 = 0i64;
if( *(&stru_140C4DB30 + 42) )
v22 = *(&stru_140C4DB30 + 42);
v23 = v14 | v22 & 0xFFFFFFFFFFFF0FFFui64;
LABEL_34:
v24 = *v20;
v35 = *v20;
while( 1 )
{
while( 1 )
{
CachedPte = (_MI_CACHED_PTE)v24;
if( (_DWORD)v24 != v19 )
{
if( HIDWORD(v24) )
break;
}
if( v23 )
{
if( *(&stru_140C4DB30 + 42) )
{
if( (v23 & 0x10) != 0 )
LODWORD(v23) = v23 & 0xFFFFFFEF;
else
LODWORD(v23) = ~*(&stru_140C4DB30 + 84) & v23;
}
}
else
{
LODWORD(v23) = 0;
}
v23 = ((unsigned __int64)HIDWORD(v35) << 32) | (unsigned int)v23;
if( *(&stru_140C4DB30 + 42) )
{
if( (*(&stru_140C4DB30 + 42) & v23) != 0 )
v23 |= 0x10ui64;
else
v23 |= *(&stru_140C4DB30 + 42);
}
v29 = v23;
if( PointerPte >= MmGetPml4eBase()
&& PointerPte <= MmGetPxeUserLimit()
&& (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0
&& (v23 & 1) != 0 )
{
v29 = v23 | 0x8000000000000000ui64;
}
PointerPte->u.Long = v29;
v34.GlobalTimeStamp = v19;
v34.PteIndex = (__int64)((__int64)PointerPte - BasePte) >> 3;
v24 = _InterlockedCompareExchange64(v20, v34.Long, v24);
v35 = v24;
if( v24 == CachedPte )
{
_InterlockedExchangeAdd((volatile signed __int32 *)(v38 + 64), v40);
return 1;
}
}
if( !(_DWORD)v24 )
goto LABEL_34;
_InterlockedOr(v33, 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);
v35 = v24;
if( v24 == CachedPte )
{
if( v9 )
{
v27 = MiReleaseLargePteMappings(PteInfo, &CachedPte, 0i64);
}
else
{
LODWORD(v28) = MiReplenishBitMap(PteInfo, CachedPte.PteIndex, 0i64);
v27 = v28;
_InterlockedExchangeAdd64((volatile signed __int64 *)&PteInfo->TotalFreeSystemPtes, v28);
}
_InterlockedExchangeAdd((volatile signed __int32 *)(v38 + 64), -v27);
v24 = 0i64;
v35 = 0i64;
}
__writecr8(CurrentIrql);
BasePte = (unsigned __int64)v39;
v9 = v41;
}
v34.PteIndex = (__int64)((__int64)PointerPte - BasePte) >> 3;
v30 = v37 | MiSwizzleInvalidPte(0i64) & 0xFFFFFFFFFFFF0FFFui64;
LOBYTE(v31) = MiPteInShadowRange((UINT64)PointerPte);
if( v31 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v30 & 1) != 0 )
v30 |= 0x8000000000000000ui64;
PointerPte->u.Long = v30;
if( v41 )
{
LODWORD(v32) = MiReleaseLargePteMappings(PteInfo, &v34, 0i64);
}
else
{
LODWORD(v32) = MiReplenishBitMap(PteInfo, v34.PteIndex, 0i64);
_InterlockedExchangeAdd64((volatile signed __int64 *)&PteInfo->TotalFreeSystemPtes, v32);
}
_InterlockedExchangeAdd((volatile signed __int32 *)(v38 + 64), -(int)v32);
return 1;
}Referenced by:
MiReleasePtes
MmUnmapIoSpace