MiZeroLargePage
VOID __fastcall MiZeroLargePage(INT64 a1, UINT64 a2, INT64 a3){
_MI_PFN_CACHE_ATTRIBUTE v3;
unsigned int v4;
__int64 v5;
unsigned __int64 v6;
__int64 *v7;
unsigned __int64 v8;
int ProtectionPfnCompatible;
unsigned __int64 v10;
INT64 v11;
INT64 v12;
UINT64 v13;
_QWORD *v14;
unsigned __int64 v15;
unsigned __int64 v16;
unsigned __int64 UltraMapping;
UINT64 v18;
_MMPTE *PteBase;
__int64 v20;
UINT64 ValidPte;
BOOL v22;
unsigned __int64 v23;
INT64 v24;
unsigned __int64 result[16];
v3 = (int)a3;
v4 = a2;
v5 = (unsigned int)a2;
v6 = (a1 - (__int64)MmGetPfnDb()) / 48;
v7 = &MiLargePageSizes[(unsigned int)a2];
v8 = *v7;
if( v6 <= 0xFFFFFFFFFi64 && ((*((_QWORD *)MmGetPfnDb() + 6 * v6 + 5) >> 50) & 1) != 0 )
ProtectionPfnCompatible = MiMakeProtectionPfnCompatible(4ui64, (_MMPFN *)a1);
else
ProtectionPfnCompatible = 4;
v10 = 0i64;
if( v4 <= 1
&& (memset((INT64)result, 0i64),
(unsigned int)MiCreateUltraThreadContext((INT64)result, 0i64, 2 - (unsigned int)(v4 == 0))) )
{
UltraMapping = MiGetUltraMapping(&result[4 * v5], v4, *v7, 0);
v18 = (UINT64)MmGetPdeBase() + ((UltraMapping >> 18) & 0x3FFFFFF8);
if( !v4 )
{
PteBase = MmGetPteBase();
v20 = 1i64;
do
{
v18 = (UINT64)PteBase + ((v18 >> 9) & 0x7FFFFFFFF8i64);
--v20;
}
while( v20 );
}
ValidPte = MiMakeValidPte(v18, v6, ProtectionPfnCompatible | 0xA4000000);
v22 = MiPteInShadowRange(v18);
if( v22 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 && (ValidPte & 1) != 0 )
ValidPte |= 0x8000000000000000ui64;
*(_QWORD *)v18 = ValidPte;
KeZeroPages((PVOID)UltraMapping, v8 << 12);
v23 = ZeroPte;
if( v22 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 && (ZeroPte & 1) != 0 )
v23 = ZeroPte | 0x8000000000000000ui64;
*(_QWORD *)v18 = v23;
MiDeleteUltraThreadContext((INT64)result);
}
else
{
v11 = MiReservePtes((INT64)&qword_140C4EC80, (unsigned int)v8);
v24 = v11;
v12 = v11;
if( v11 )
{
v13 = MiMakeValidPte(v11, v6, ProtectionPfnCompatible | 0xA0000000);
if( v8 )
{
v14 = (_QWORD *)v12;
v15 = v6 << 12;
v16 = v8;
do
{
v13 ^= (v13 ^ v15) & 0xFFFFFFFFF000i64;
*v14 = v13;
v15 += 4096i64;
++v14;
--v16;
}
while( v16 );
v12 = v24;
}
KeZeroPages((PVOID)(((v12 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16), v8 << 12);
MiReleasePtes((INT64)&qword_140C4EC80, v12, (unsigned int)v8);
}
else if( v8 )
{
do
MiZeroPhysicalPage(v6 + v10++, 0i64, v3);
while( v10 < v8 );
}
}
}Referenced by:
MiAllocateLargeZeroPages
MiAllocatePartitionPhysicalPages
MiGetLargePage
MiZeroAndConvertPage