MiZeroWithSystemPtes
UINT64 __fastcall MiZeroWithSystemPtes(_XSTATE_CONFIGURATION *a1, UINT64 NumberOfEntries, _MMPFN *a3){
__int64 v5;
UINT64 v6;
INT64 v7;
struct {unsigned __int16 ReferenceCount;} *v8;
UINT64 v10;
_XSTATE_CONFIGURATION *v11;
__int64 v12;
int v13;
unsigned __int64 v14;
__int64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
int v18;
UINT64 j;
UINT64 i;
UINT64 v21;
_MI_TB_FLUSH_LIST TbFlushList[48];
if( (a3->u4._bf_0 & 0x1000000000i64) == 0 )
goto LABEL_6;
LODWORD(v5) = MiGetPfnPageSizeIndex((INT64)a3);
if( (_DWORD)v5 == -1 )
v5 = 3i64;
if( (unsigned int)v5 < 3 )
v6 = MiLargePageSizes[v5];
else
LABEL_6:
v6 = 1i64;
v7 = a3 - MmGetPfnDb();
if( a1 )
{
v10 = NumberOfEntries;
v11 = a1;
if( NumberOfEntries >= v6 )
v10 = v6;
v21 = v10;
v12 = (__int64)(((_QWORD)a1 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
MiMakeProtectionPfnCompatible((_BYTE *)4, a3);
LODWORD(v14) = MiMakeValidPte(a1, v7, v13 | 0xA0000000);
v15 = 0i64;
v16 = v14;
for( i = 0i64; i < v6; ++i )
{
v17 = v16;
LOBYTE(v18) = MiPteInShadowRange((UINT64)v11);
if( v18 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v16 & 1) != 0 )
v17 = v16 | 0x8000000000000000ui64;
v11->EnabledFeatures = v17;
v11 = (_XSTATE_CONFIGURATION *)((char *)v11 + 8);
++v15;
v16 ^= (v16 ^ (v16 + 4096)) & 0xFFFFFFFFF000i64;
if( v15 == NumberOfEntries )
{
memset(TbFlushList, 0i64, 0xB8u);
MiZeroMemory((VOID *)v12, ((char *)v11 - (char *)a1) >> 3 << 12);
if( i + 1 == v6 )
{
v12 = 0i64;
break;
}
for( j = 0i64; j < NumberOfEntries; ++j )
*((_MMPTE *)&a1->EnabledFeatures + j) = ZeroPte;
memset(&TbFlushList[3], 0, 20);
TbFlushList[0] = 0;
LOWORD(TbFlushList[1]) = 0;
TbFlushList[2] = 20;
MiInsertTbFlushEntry(TbFlushList, (VOID *)v12, NumberOfEntries, 0i64);
MiFlushTbList(TbFlushList);
v15 = 0i64;
v11 = a1;
}
}
if( v12 )
MiZeroMemory((VOID *)v12, ((char *)v11 - (char *)a1) >> 3 << 12);
return v21;
}
else
{
if( v6 )
{
v8 = &a3->u3 + 1;
do
{
MiZeroPhysicalPage(v7++, 1ui64, (_MI_PFN_CACHE_ATTRIBUTE)(LOBYTE(v8->ReferenceCount) >> 6));
v8 += 24;
--v6;
}
while( v6 );
}
return 0i64;
}
}Referenced by:
MiZeroInParallelWorker