MxCreatePfns
VOID __stdcall MxCreatePfns(MMPTE *PointerPxe, MMPTE *EndPxe, UINT64 PagingLevel, _LOADER_PARAMETER_BLOCK *LoaderBlock){
_MMPTE *PteBase;
int v6;
unsigned __int64 v8;
INT64 v9;
UINT64 v10;
unsigned __int64 v11;
__int64 v12;
UINT64 v13;
__int64 v14;
char *v15;
unsigned __int64 v16;
unsigned __int16 v17;
__int64 v18;
__int64 v19;
UINT64 v20;
unsigned __int64 v21;
unsigned __int16 v22;
__int64 v23;
__int64 v24;
UINT64 v25;
unsigned __int64 v26;
unsigned __int64 v27;
UINT64 v28;
UINT64 v29;
int v30;
if( PointerPxe <= EndPxe )
{
v30 = PagingLevel;
PteBase = MmGetPteBase();
v6 = PagingLevel;
v8 = (unsigned __int64)PointerPxe;
while( 1 )
{
v9 = MI_READ_PTE_LOCK_FREE(v8);
v28 = v9;
v10 = v9;
if( (v9 & 1) != 0 )
break;
LABEL_13:
v8 += 8i64;
if( v8 > (unsigned __int64)EndPxe )
return;
}
v11 = v9;
MiPteInShadowRange((UINT64)&v28);
v12 = (v11 >> 12) & 0xFFFFFFFFFi64;
v29 = MI_READ_PTE_LOCK_FREE((INT64)PteBase + ((v8 >> 9) & 0x7FFFFFFFF8i64));
v13 = v29;
MiPteInShadowRange((UINT64)&v29);
v14 = (v13 >> 12) & 0xFFFFFFFFFi64;
v15 = (char *)MmGetPfnDb() + 48 * v14;
*((_QWORD *)v15 + 3) ^= (*((_QWORD *)v15 + 3) ^ (*((_QWORD *)v15 + 3) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
if( v6 )
{
if( (v10 & 0x80u) == 0i64 )
{
MxCreatePfn(v12, (_MMPTE *)v8, v10, v14);
if( (_MMPTE *)v8 != MmGetPxeSelfRef() )
{
PteBase = MmGetPteBase();
MxCreatePfns(
(MMPTE *)((__int64)((v8 << 25) - ((_QWORD)PteBase << 25)) >> 16),
(MMPTE *)(((__int64)((v8 << 25) - ((_QWORD)PteBase << 25)) >> 16) + 4088),
(unsigned int)(v6 - 1),
LoaderBlock);
goto LABEL_13;
}
goto LABEL_12;
}
v21 = v10 & 0xFFFFFFFFFFFFFFFBui64;
v22 = v21 | 0x800;
if( (v21 & 0x42) == 0 )
v22 = v21;
v23 = v21 | 0x800;
v24 = ((unsigned __int16)((unsigned __int8)word_140C4DD48 << 8) ^ v22) & 0x100;
if( (v21 & 0x42) == 0 )
v23 = v21;
v25 = v23 ^ v24;
MiWriteValidPteNewProtection((INT64 *)v8, v25);
v26 = (__int64)((v8 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
v27 = v26 + 4096;
while( v26 < v27 )
{
if( (unsigned int)MiIsRegularMemory(LoaderBlock, v12) )
MxCreatePfn(v12, (_MMPTE *)v26, v25, v14);
++v12;
v26 += 8i64;
}
}
else
{
v16 = v10 & 0xFFFFFFFFFFFFFFFBui64;
v17 = v16 | 0x800;
if( (v16 & 0x42) == 0 )
v17 = v16;
v18 = v16 | 0x800;
v19 = ((unsigned __int16)((unsigned __int8)word_140C4DD48 << 8) ^ v17) & 0x100;
if( (v16 & 0x42) == 0 )
v18 = v16;
v20 = v18 ^ v19;
MiWriteValidPteNewProtection((INT64 *)v8, v20);
if( (unsigned int)MiIsRegularMemory(LoaderBlock, v12) )
MxCreatePfn(v12, (_MMPTE *)v8, v20, v14);
}
v6 = v30;
LABEL_12:
PteBase = MmGetPteBase();
goto LABEL_13;
}
}Referenced by:
MiInitializePfnsForValidMappings
MxCreatePfns