MiZeroLargePage
VOID __stdcall MiZeroLargePage(_MI_ZERO_THREAD_CONTEXT *ThreadContext){
unsigned int v1;
_MI_PFN_CACHE_ATTRIBUTE v2;
_MI_PFN_CACHE_ATTRIBUTE v3;
unsigned int v4;
__int64 v5;
unsigned __int64 v6;
unsigned __int64 v7;
int v8;
int v9;
unsigned __int64 v10;
_MMPTE *v11;
_MMPTE *v12;
unsigned __int64 v13;
unsigned __int64 v14;
_MMPTE *v15;
unsigned __int64 v16;
unsigned __int64 v17;
unsigned __int64 v18;
int v19;
_KTBFLUSH_TYPE v20;
unsigned __int64 v21;
VOID *v22;
UINT64 v23;
_MMPTE *PteBase;
__int64 v25;
__int64 v26;
__int64 v27;
int v28;
int v29;
unsigned __int64 Long;
_MMPTE *v31;
INT64 v32[16];
v3 = v2;
v4 = v1;
v5 = v1;
v6 = ((char *)ThreadContext - (char *)MmGetPfnDb()) / 48;
v7 = MiLargePageSizes[v1];
if( v6 <= 0xFFFFFFFFFi64 && (((unsigned __int64)MmGetPfnDb()[v6].u4._bf_0 >> 50) & 1) != 0 )
{
MiMakeProtectionPfnCompatible((_BYTE *)4, (_MMPFN *)ThreadContext);
v9 = v8;
}
else
{
v9 = 4;
}
v10 = 0i64;
if( v4 <= 1
&& (memset(v32, 0i64, sizeof(v32)), MiCreateUltraThreadContext((INT64)v32, 0i64, 2 - (unsigned int)(v4 == 0))) )
{
MiGetUltraMapping((_MI_ZERO_THREAD_CONTEXT *)&v32[4 * v5], v4);
v22 = (VOID *)v21;
v23 = (UINT64)MmGetPdeBase() + ((v21 >> 18) & 0x3FFFFFF8);
if( !v4 )
{
PteBase = MmGetPteBase();
v25 = 1i64;
do
{
v23 = (UINT64)PteBase + ((v23 >> 9) & 0x7FFFFFFFF8i64);
--v25;
}
while( v25 );
}
LODWORD(v26) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v23, v6, v9 | 0xA4000000);
v27 = v26;
LOBYTE(v28) = MiPteInShadowRange(v23);
v29 = v28;
if( v28 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v27 & 1) != 0 )
v27 |= 0x8000000000000000ui64;
*(_QWORD *)v23 = v27;
KeZeroPages(v22, v7 << 12);
Long = ZeroPte.u.Long;
if( v29 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
*(_QWORD *)v23 = Long;
MiDeleteUltraThreadContext((INT64)v32);
}
else
{
v11 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), (unsigned int)v7);
v31 = v11;
v12 = v11;
if( v11 )
{
LODWORD(v13) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v11, v6, v9 | 0xA0000000);
v14 = v13;
if( v7 )
{
v15 = v12;
v16 = v6 << 12;
v17 = v7;
do
{
v14 ^= (v14 ^ v16) & 0xFFFFFFFFF000i64;
v18 = v14;
LOBYTE(v19) = MiPteInShadowRange((UINT64)v15);
if( v19 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v14 & 1) != 0 )
v18 = v14 | 0x8000000000000000ui64;
v15->u.Long = v18;
v16 += 4096i64;
++v15;
--v17;
}
while( v17 );
v12 = v31;
}
KeZeroPages((VOID *)((__int64)(((_QWORD)v12 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16), v7 << 12);
MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v12, (unsigned int)v7, v20);
}
else if( v7 )
{
do
MiZeroPhysicalPage(v6 + v10++, 0i64, v3);
while( v10 < v7 );
}
}
}Referenced by:
MiAllocateLargeZeroPages
MiAllocatePartitionPhysicalPages
MiGetLargePage
MiZeroAndConvertPage