MiMapPagesToZero
NTSTATUS __stdcall MiMapPagesToZero(_MI_LIST_THREAD_CONTEXT *ThreadContext, _MMPFN *Pfn1, UINT64 a3){
unsigned int v3;
_MI_LIST_THREAD_CONTEXT *v4;
__int64 v6;
unsigned __int64 v7;
_MMPTE *PteBase;
UINT64 v9;
__int64 v10;
signed __int64 v11;
unsigned __int8 CurrentIrql;
int v13;
__int64 v15;
unsigned __int64 v16;
int v17;
char v18;
unsigned int v19;
unsigned __int64 v20;
unsigned __int64 v21;
_MMPTE *PteLimit;
unsigned __int64 v23;
NTSTATUS v24;
unsigned __int64 v25;
unsigned __int64 v26;
int v27;
unsigned int v28;
__int64 v29;
__int64 v30;
unsigned __int64 v31;
int v32;
UINT64 v33;
_MMPTE *Pml4eBase;
_MMPTE *PxeUserLimit;
unsigned __int64 v36;
unsigned __int64 v37;
__int64 v39;
unsigned int v40;
unsigned __int8 v41;
v40 = a3;
v3 = a3;
v4 = ThreadContext;
if( (unsigned int)a3 >= 3 )
{
v6 = 1i64;
}
else
{
_mm_lfence();
v6 = MiLargePageSizes[(unsigned int)a3];
}
v39 = v6;
MiGetUltraMapping(&ThreadContext[8 * (unsigned int)a3 + 22], (unsigned int)a3);
v37 = v7;
PteBase = MmGetPteBase();
v9 = (UINT64)PteBase + ((v7 >> 9) & 0x7FFFFFFFF8i64);
if( v3 <= 1 )
{
v10 = 2 - v3;
do
{
v9 = (UINT64)PteBase + ((v9 >> 9) & 0x7FFFFFFFF8i64);
--v10;
}
while( v10 );
}
v11 = Pfn1 - MmGetPfnDb();
CurrentIrql = KeGetCurrentIrql();
v41 = CurrentIrql;
__writecr8(2ui64);
v13 = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Pfn1->u2, 0x3Fui64) )
{
do
{
++v13;
_mm_pause();
}
while( Pfn1->u2._bf_0 < 0 );
}
if( *((_BYTE *)v4 + 69) == 1 )
{
MiRemoveFaultNode(v4);
_InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
++dword_140C2A070;
return 0;
}
v15 = *((unsigned __int8 *)&Pfn1->u3 + 2) >> 6;
if( v39 != 1 )
goto LABEL_19;
if( (_DWORD)v15 && (_DWORD)v15 != 2 )
{
if( (*(_BYTE *)(&Pfn1->u3 + 1) & 0xC0) == 0xC0 )
MiFinalizePageAttribute(Pfn1, MiCached, 1ui64);
goto LABEL_19;
}
v16 = 0x140000000ui64;
if( *((_DWORD *)&stru_140C4DB30 + 4 * v15 + 107) == 1 )
{
MiChangePageAttribute(Pfn1, MiCached, 1ui64);
LABEL_19:
v16 = 0x140000000ui64;
}
v17 = 4;
v18 = *((_BYTE *)&Pfn1->u3 + 2) >> 6;
if( v18 )
{
if( v18 == 2 )
v17 = 28;
}
else
{
v17 = 12;
}
v19 = v17 | 0xA0000000;
if( v3 <= 1 )
v19 = v17 | 0xA4000000;
v20 = (unsigned __int64)MmGetPteBase();
v21 = ((v11 & 0xFFFFFFFFFi64) << 12) | MmProtectToPteMask[v19 & 0x1F] & 0xFFFF000000000E7Fui64 | 0x21;
if( v9 < v20 )
goto LABEL_49;
PteLimit = MmGetPteLimit();
if( v9 > (unsigned __int64)PteLimit )
goto LABEL_49;
v23 = (__int64)((v9 << 25) - (v20 << 25)) >> 16;
if( v9 >= (unsigned __int64)MmGetPdeBase() && v9 <= (unsigned __int64)MmGetPdeLimit() )
{
if( (_MMPTE *)v9 == MmGetPxeSelfRef() )
{
v21 |= 0x8000000000000000ui64;
}
else if( (v19 & 0x4000000) == 0 )
{
v21 &= ~0x8000000000000000ui64;
}
v24 = MiUserPdeOrAbove(v9);
PteLimit = MmGetPteLimit();
v16 = 0x140000000ui64;
v20 = (unsigned __int64)MmGetPteBase();
if( v24 )
v21 |= 4ui64;
}
v25 = v21;
v21 |= 4ui64;
if( v9 > v20 + 0x3FFFFFFF78i64 )
v21 = v25;
if( (v19 & 0x4000000) != 0 )
{
LODWORD(v26) = MiGetLeafVa(v23);
v23 = v26;
v20 = (unsigned __int64)MmGetPteBase();
}
if( v23 >= 0xFFFF800000000000ui64 )
{
if( *(_BYTE *)(((v23 >> 39) & 0x1FF) - 256 + v16 + 12908296) == 1
|| v23 >= v20 && v23 <= (unsigned __int64)PteLimit )
{
goto LABEL_50;
}
if( v23 < *(&stru_140C4DB30 + 937) || (v27 = *(&stru_140C4DB30 + 537), v23 > *(&stru_140C4DB30 + 175)) )
v27 = *(&stru_140C4DB30 + 536);
}
else
{
v27 = *(&stru_140C4DB30 + 537);
}
if( v27 )
LABEL_49:
v21 |= 0x100ui64;
LABEL_50:
v28 = v40;
v29 = v21 ^ ((unsigned __int16)v21 ^ (unsigned __int16)(*(&stru_140C4DB30 + 536) << 8)) & 0x100 | 0x42;
v30 = v21 ^ ((unsigned __int16)v21 ^ (unsigned __int16)(*(&stru_140C4DB30 + 536) << 8)) & 0x100 | 0xC2;
if( (v19 & 0x4000000) == 0 )
v30 = v29;
v31 = v30 & 0xF0FFFFFFFFFFFFFFui64 | 0xA00000000000000i64;
if( v40 > 1 )
{
v33 = 8 * v39 + v9;
if( v9 < v33 )
{
Pml4eBase = MmGetPml4eBase();
PxeUserLimit = MmGetPxeUserLimit();
do
{
v36 = v31;
if( v9 >= (unsigned __int64)Pml4eBase
&& v9 <= (unsigned __int64)PxeUserLimit
&& (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0
&& (v31 & 1) != 0 )
{
v36 = v31 | 0x8000000000000000ui64;
}
*(_QWORD *)v9 = v36;
v9 += 8i64;
v31 ^= (v31 ^ (v31 + 4096)) & 0xFFFFFFFFF000i64;
}
while( v9 < v33 );
CurrentIrql = v41;
v4 = ThreadContext;
v28 = v40;
}
v9 -= 8 * v39;
}
else
{
LOBYTE(v32) = MiPteInShadowRange(v9);
if( v32 )
{
if( (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 )
v31 |= 0x8000000000000000ui64;
}
*(_QWORD *)v9 = v31;
}
*((_QWORD *)v4 + 4) = v9;
*((_QWORD *)v4 + 5) = v37;
*((_QWORD *)v4 + 6) = v37 + (v39 << 12) - 1;
v4[16] = v28;
*((_QWORD *)v4 + 9) = Pfn1;
_InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
return 1;
}Referenced by:
MiGetPagesToZero
MiZeroLargePages