MiTradeActivePage
__int64 __fastcall MiTradeActivePage(
ULONG_PTR a1,
__int64 a2,
unsigned __int64 a3,
unsigned int a4,
unsigned int a5,
UINT64 a6){
unsigned __int64 v7;
_MMPFN *PfnDb;
__int64 v10;
__int64 v11;
BOOL v12;
INT64 *v13;
INT64 v14;
INT64 v15;
int v17;
char v18;
char v19;
__int64 v20;
unsigned __int64 v21;
UNICODE_STRING *v22;
UINT8 v23;
PWCHAR v24;
int v25;
INT64 *v26;
INT64 v27;
v7 = a3;
if( (*(_QWORD *)(a1 + 24) & 0x3FFFFFFFFFFFFFFFi64) != 1 || *(_WORD *)(a1 + 32) != 1 )
return 0i64;
PfnDb = MmGetPfnDb();
v10 = (a2 - (__int64)PfnDb) / 48;
v11 = (__int64)(a1 - (_QWORD)PfnDb) / 48;
v12 = (MiFlags & 0x8000) != 0 && (unsigned int)MiGetPagePrivilege(a1, 0, 0i64);
v13 = (INT64 *)((char *)MmGetPteBase() + ((v7 >> 9) & 0x7FFFFFFFF8i64));
v14 = MI_READ_PTE_LOCK_FREE((INT64)v13);
v15 = v14;
if( a5 == 2 )
{
if( (v14 & 0x42) != 0 || v12 )
return 0i64;
}
else
{
*v13 = v14 & 0xFFFFFFFFFFFFFBFEui64 | 0x400;
v7 = a3;
KeFlushSingleTb(a3, a4, a5);
}
v17 = *(unsigned __int8 *)(a1 + 34) >> 6;
LODWORD(a6) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(a1 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&a6);
while( *(__int64 *)(a1 + 24) < 0 );
}
MiLockNestedPageAtDpcInline(a2);
MiFinalizePageAttribute((_MMPFN *)a2, (_MI_PFN_CACHE_ATTRIBUTE)v17, 1ui64);
MiCopyPfnEntryEx(a2, a1);
MiCopyPage(v10, v11, 0i64, 6);
_InterlockedAnd64((volatile signed __int64 *)(a2 + 24), 0x7FFFFFFFFFFFFFFFui64);
v18 = *(_BYTE *)(a1 + 35);
*(_QWORD *)(a1 + 40) &= ~0x8000000000000000ui64;
*(_BYTE *)(a1 + 35) = v18 & 0xF7;
v19 = *(_BYTE *)(a1 + 34) & 0xF8 | 5;
*(_BYTE *)(a1 + 34) = v19;
*(_BYTE *)(a1 + 34) = v19 & 0xC7;
*(_BYTE *)(a1 + 35) &= ~0x20u;
_InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
v20 = (v10 & 0xFFFFFFFFFi64) << 12;
v21 = v20 | v15 & 0xFFFF000000000FFFui64;
if( a5 == 2 )
MiWriteValidPteNewPage(v13, v21, 0i64);
else
*v13 = v21;
KeFlushSingleTb(v7, a4, a5);
LOBYTE(v25) = MI_PFN_IS_PROTO((UNICODE_STRING *)a2, v22, v23, v24);
if( v25 )
{
v26 = (INT64 *)(*(_QWORD *)(a2 + 8) | 0x8000000000000000ui64);
v27 = MI_READ_PTE_LOCK_FREE((INT64)v26);
MiWriteValidPteNewPage(v26, v20 | v27 & 0xFFFF000000000FFFui64, 0i64);
}
return 1i64;
}Referenced by:
MiLockCode
MiMakeVaRangePhysicallyContiguous
MiReplaceLockedPage