MiMapArbitraryPage
VOID __fastcall MiMapArbitraryPage(_QWORD *a1, _QWORD *a2, CHAR a3, INT64 a4, INT64 a5){
__int64 v5;
int v6;
UINT64 *v7;
unsigned int v8;
__int64 v11;
unsigned __int8 CurrentIrql;
int v13;
char v14;
INT64 v15;
UINT64 ValidPte;
UINT64 SpinCount;
v5 = a2[8];
v6 = a4;
v7 = (UINT64 *)a2[9];
v8 = a3;
v11 = (v5 - (__int64)MmGetPfnDb()) / 48;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v5 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)(v5 + 24) < 0 );
}
v13 = MiCombineCandidate((_MI_PAGE_COMBINING_SUPPORT *)a1, (_MMPFN *)v8);
if( !v6 )
{
if( v13 )
goto LABEL_4;
LABEL_17:
_InterlockedAnd64((volatile signed __int64 *)(v5 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
return;
}
if( v13 != v6 )
goto LABEL_17;
LABEL_4:
if( (_DWORD)a5 == 1 && (unsigned __int8)((*(_BYTE *)(v5 + 34) & 7) - 2) > 1u )
goto LABEL_17;
v14 = *(_BYTE *)(v5 + 34) >> 6;
if( v14 == 3 )
goto LABEL_17;
v15 = 1i64;
if( v14 )
{
if( v14 == 2 )
v15 = 25i64;
}
else
{
v15 = 9i64;
}
LODWORD(v15) = v15 | 0x20000000;
ValidPte = MiMakeValidPte((UINT64)v7, v11, v15);
a2[7] = v7;
a2[6] = v5;
*v7 = ValidPte;
_InterlockedAnd64((volatile signed __int64 *)(v5 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
}Referenced by:
MiCombineAllPhysicalMemory
MiCombinePte
MiSharePages