MiMapArbitraryPage
NTSTATUS __stdcall MiMapArbitraryPage(
_MI_PAGE_COMBINING_SUPPORT *Pcs,
_MI_ARBITRARY_PAGE_MAP *PageMap,
_MI_COMBINE_CANDIDATE EntryCandidate,
UINT64 StandbyOnly){
__int64 v4;
int v5;
_XSTATE_CONFIGURATION *v6;
__int64 v10;
unsigned __int8 CurrentIrql;
_MI_COMBINE_CANDIDATE v12;
char v13;
INT64 v14;
unsigned __int64 v15;
unsigned __int64 v16;
int v17;
UINT64 SpinCount;
int v20;
v4 = *((_QWORD *)PageMap + 8);
v5 = StandbyOnly;
v6 = (_XSTATE_CONFIGURATION *)*((_QWORD *)PageMap + 9);
v10 = (v4 - (__int64)MmGetPfnDb()) / 48;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v4 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)(v4 + 24) < 0 );
}
v12 = MiCombineCandidate(Pcs, (_MMPFN *)(unsigned int)EntryCandidate);
if( !v5 )
{
if( v12 )
goto LABEL_4;
LABEL_18:
_InterlockedAnd64((volatile signed __int64 *)(v4 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
return 0;
}
if( v12 != v5 )
goto LABEL_18;
LABEL_4:
if( v20 == 1 && (unsigned __int8)((*(_BYTE *)(v4 + 34) & 7) - 2) > 1u )
goto LABEL_18;
v13 = *(_BYTE *)(v4 + 34) >> 6;
if( v13 == 3 )
goto LABEL_18;
v14 = 1i64;
if( v13 )
{
if( v13 == 2 )
v14 = 25i64;
}
else
{
v14 = 9i64;
}
LODWORD(v14) = v14 | 0x20000000;
LODWORD(v15) = MiMakeValidPte(v6, v10, v14);
*((_QWORD *)PageMap + 7) = v6;
v16 = v15;
*((_QWORD *)PageMap + 6) = v4;
LOBYTE(v17) = MiPteInShadowRange((UINT64)v6);
if( v17 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v16 & 1) != 0 )
v16 |= 0x8000000000000000ui64;
v6->EnabledFeatures = v16;
_InterlockedAnd64((volatile signed __int64 *)(v4 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
return 1;
}Referenced by:
MiCombineAllPhysicalMemory
MiCombinePte
MiSharePages