MiMapSinglePage
VOID *__stdcall MiMapSinglePage(VOID *VirtualAddress, UINT64 PageFrameIndex, UINT64 Priority){
char v3;
char v4;
int v5;
UINT64 v7;
VOID *result;
_XSTATE_CONFIGURATION *v9;
_MMPFN *v10;
_BYTE *v11;
int v12;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v13;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v14;
int v15;
__int64 v16;
unsigned __int64 Long;
int v18;
v4 = v3;
v5 = Priority;
v7 = (UINT64)VirtualAddress;
if( VirtualAddress )
{
v9 = (_XSTATE_CONFIGURATION *)((char *)MmGetPteBase() + (((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64));
LODWORD(v16) = MI_READ_PTE_LOCK_FREE((INT64)v9);
if( v16 )
{
Long = ZeroPte.u.Long;
LOBYTE(v18) = MiPteInShadowRange((UINT64)v9);
if( v18 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
v9->EnabledFeatures = Long;
KeFlushSingleTb(v7, FlushKernel, 1i64);
}
LABEL_4:
v10 = &MmGetPfnDb()[PageFrameIndex];
v11 = (_BYTE *)((((v5 >> 31) & 0xFFFFFFFD) + 4) | 2);
if( (v5 & 0x40000000) != 0 )
v11 = (_BYTE *)(((v5 >> 31) & 0xFFFFFFFD) + 4);
MiMakeProtectionPfnCompatible(v11, v10);
LODWORD(v13.Long) = MiMakeValidPte(v9, PageFrameIndex, v12 | 0xA0000000);
v14.Long = v13.Long;
goto LABEL_7;
}
result = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), 1ui64);
v9 = (_XSTATE_CONFIGURATION *)result;
if( !result )
return result;
v7 = (__int64)(((_QWORD)result << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
if( (v4 & 2) == 0 )
goto LABEL_4;
v14.Long = ZeroPte.u.Long;
LABEL_7:
LOBYTE(v15) = MiPteInShadowRange((UINT64)v9);
if( v15 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v14.Long & 1) != 0 )
v14.Long |= 0x8000000000000000ui64;
v9->EnabledFeatures = v14.Long;
return(VOID *)v7;
}Referenced by:
MiFillCombinePage
MiInitializeForkMaps
MiUpdateForkMaps