MiFlushTbAsNeeded
VOID __fastcall MiFlushTbAsNeeded(_MMPTE *PointerPte, UINT64 SizeInPages, _KTBFLUSH_TYPE FlushType){
int v3;
int v7;
int v8;
int v9;
UINT64 v10;
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;} v11;
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;} v12;
unsigned __int64 Long_high;
int v14;
INT64 v15;
INT64 v16;
PVOID BugCheckParameter4;
_MI_TB_FLUSH_LIST TbFlushList;
__int16 v19;
__int16 v20;
__int64 v21;
__int64 v22;
__int64 i;
char v24[152];
v20 = 0;
v7 = v3;
memset(v24, 0i64, sizeof(v24));
v21 = 20i64;
TbFlushList = FlushType;
v8 = 0;
v19 = 0;
v9 = 0;
v22 = 0i64;
v10 = 0i64;
for( i = 0i64; v10 < SizeInPages; ++PointerPte )
{
v11.Long = (unsigned __int64)PointerPte->u;
if( (PointerPte->u.Long & 0xC01) == 0 && (PointerPte->u.Long & 0x3E0) == 0 )
{
if( *(&stru_140C4DB30 + 42) && (v11.Long & 0x10) == 0 )
v11.Long &= ~*(&stru_140C4DB30 + 42);
v12.Long = ZeroPte.u.Long;
Long_high = HIDWORD(v11.Long);
LOBYTE(v14) = MiPteInShadowRange((UINT64)PointerPte);
if( v14 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
v12.Long = ZeroPte.u.Long | 0x8000000000000000ui64;
PointerPte->u.Long = v12.Long;
if( (_DWORD)Long_high )
{
if( (_DWORD)Long_high == v8 )
{
if( v9 == 1 )
MiInsertTbFlushEntry(
&TbFlushList,
(VOID *)((__int64)(((_QWORD)PointerPte << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
1ui64,
0i64);
}
else
{
if( MiCompareTbFlushTimeStamp((unsigned int)Long_high, 0xFFFFFFFFui64, v15, v16, (UINT64)BugCheckParameter4) )
{
MiInsertTbFlushEntry(
&TbFlushList,
(VOID *)((__int64)(((_QWORD)PointerPte << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
1ui64,
0i64);
v9 = 1;
}
else
{
v9 = 0;
}
v8 = Long_high;
}
}
else
{
v9 = 0;
v8 = 0;
}
}
else if( !v7 )
{
KeBugCheckEx(0x1Au, (PVOID)0x5100, PointerPte, (PVOID)(SizeInPages - v10), (PVOID)v11.Long);
}
++v10;
}
MiFlushTbList(&TbFlushList);
}Referenced by:
MiLinkPoolCommitChain
MiReservePtes