MiZeroAndFlushPtes
VOID __stdcall MiZeroAndFlushPtes(VOID *BaseVa, UINT64 NumberOfPages){
_MMPTE *PteBase;
unsigned __int64 v4;
UINT64 v5;
unsigned __int64 v6;
NTSTATUS v7;
int v8;
UINT64 v9;
unsigned int v10;
__int64 v11;
UINT64 v12;
__int64 v13;
UINT64 v14;
UINT64 v15;
__int64 v16;
int v17;
UINT64 v18;
int v19;
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;} v20;
__int64 v21;
__int64 v22;
__int64 *v23;
__int64 v24;
__int64 v25;
unsigned __int64 Long;
int v27;
bool v29;
__int64 *v30;
__int64 v31;
unsigned __int64 v32;
__int64 v33;
__int64 v34;
_MMPTE *v35;
int v36;
UINT64 v37;
VOID *Va;
UINT64 v39;
UINT64 v40;
UINT64 v41;
UINT64 v42;
unsigned __int64 v43;
_KLOCK_QUEUE_HANDLE LockHandle;
__int64 v45;
_MI_TB_FLUSH_LIST TbFlushList[48];
__int64 v47[32];
v39 = NumberOfPages;
memset(TbFlushList, 0i64, 0xB8u);
PteBase = MmGetPteBase();
v4 = (unsigned __int64)BaseVa & 0xFFFFFFFFFFFFF000ui64;
Va = (VOID *)((unsigned __int64)BaseVa & 0xFFFFFFFFFFFFF000ui64);
v45 = 0i64;
*(_OWORD *)&LockHandle.LockQueue.Lock = 0i64;
v5 = (UINT64)PteBase + (((unsigned __int64)BaseVa >> 9) & 0x7FFFFFFFF8i64);
v6 = 1i64;
v7 = MI_IS_PHYSICAL_ADDRESS(BaseVa);
v8 = v7;
v36 = v7;
if( v7 > 0 )
{
v25 = (unsigned int)v7;
do
{
v6 <<= 9;
v5 = (UINT64)PteBase + ((v5 >> 9) & 0x7FFFFFFFF8i64);
--v25;
}
while( v25 );
}
v9 = 0i64;
TbFlushList[2] = 20;
v40 = 0i64;
v10 = 0;
*(_QWORD *)&TbFlushList[6] = 0i64;
v11 = MiSwizzleInvalidPte(768i64);
v12 = v39;
v13 = v11;
while( 2 )
{
v14 = v12;
v12 %= v6;
v39 = v12;
LockHandle.LockQueue.Next = (_KSPIN_LOCK_QUEUE *volatile)(v5 + 8 * (v14 / v6));
if( (_KSPIN_LOCK_QUEUE *volatile)v5 >= LockHandle.LockQueue.Next )
goto LABEL_18;
MiPteInShadowRange((UINT64)&v37);
v43 = v6 << 12;
do
{
v42 = v9;
v41 = v9;
LODWORD(v15) = MI_READ_PTE_LOCK_FREE(v5);
v37 = v15;
v16 = (v15 >> 12) & 0xFFFFFFFFFi64;
if( v8 == 3 )
{
KeAcquireInStackQueuedSpinLock(
(PKSPIN_LOCK)&stru_140C4DB30 + 522,
(PKLOCK_QUEUE_HANDLE)&LockHandle.LockQueue.Lock);
Long = ZeroPte.u.Long;
LOBYTE(v27) = MiPteInShadowRange(v5);
if( v27 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
*(_QWORD *)v5 = Long;
KeReleaseInStackQueuedSpinLockFromDpcLevel((PKLOCK_QUEUE_HANDLE)&LockHandle.LockQueue.Lock);
__writecr8((unsigned __int8)v45);
v9 = v5;
v8 = v36;
if( v41 )
v9 = v42;
v40 = v5;
goto LABEL_32;
}
LOBYTE(v17) = MiPteInShadowRange(v5);
v18 = 1i64;
v19 = 0;
if( v8 >= 1 )
{
v20.Long = v13;
if( !v17 )
goto LABEL_8;
if( MiPteHasShadow() )
{
v19 = v18;
if( *(&stru_140C4DB30 + 537) )
goto LABEL_8;
}
else if( (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) == 0 )
{
goto LABEL_8;
}
v29 = ((unsigned __int8)v13 & (unsigned __int8)v18) == 0;
}
else
{
v20.Long = ZeroPte.u.Long;
if( !v17 || (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) == 0 )
goto LABEL_8;
v29 = (ZeroPte.u.Long & 1) == 0;
}
if( !v29 )
v20.Long |= 0x8000000000000000ui64;
LABEL_8:
*(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;} *)v5 = (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;})v20.Long;
if( v19 )
MiWritePteShadow();
if( v8 < (int)v18 )
{
MiInsertTbFlushEntry(TbFlushList, Va, v18, (unsigned int)v8);
goto LABEL_12;
}
LABEL_32:
MiInsertLargeTbFlushEntry(TbFlushList, (unsigned int)v8, v5);
LABEL_12:
if( (MmGetPfnDb()[v16].u4._bf_0 & 0x4000000000000i64) == 0 )
{
if( v10 && (v21 = v47[2 * v10 - 1], v21 == v16) )
{
v47[2 * v10 - 1] = v6 + v21;
}
else
{
v24 = 2i64 * v10++;
v47[v24] = v16;
v47[v24 + 1] = v16 + v6;
if( v10 == 16 )
{
MiFlushTbList(TbFlushList);
v30 = v47;
v31 = 16i64;
do
{
MiDereferenceIoPages(1i64, *v30, v30[1] - *v30);
v30 += 2;
--v31;
}
while( v31 );
v8 = v36;
v10 = 0;
}
}
}
v5 += 8i64;
v4 = (unsigned __int64)Va + v43;
Va = (char *)Va + v43;
}
while( (_KSPIN_LOCK_QUEUE *volatile)v5 < LockHandle.LockQueue.Next );
v12 = v39;
LABEL_18:
if( v12 )
{
v8 = 0;
v36 = 0;
v6 = 1i64;
v5 = (UINT64)MmGetPteBase() + ((v4 >> 9) & 0x7FFFFFFFF8i64);
continue;
}
break;
}
if( v9 )
{
MiGetLeafVa(v40);
LODWORD(v32) = MiGetLeafVa(v9);
MiReplicatePteChange((_MMPTE *)(v34 + (v33 & (v32 >> 9))), v35);
}
MiFlushTbList(TbFlushList);
v22 = v10;
if( v10 )
{
v23 = v47;
do
{
MiDereferenceIoPages(1i64, *v23, v23[1] - *v23);
v23 += 2;
--v22;
}
while( v22 );
}
}Referenced by:
MiFillSystemPtes
MmMapMdl
MmUnlockPages
MmUnmapIoSpace
MmUnmapLockedPages