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