MmMapHotPatchTablePage
NTSTATUS __stdcall MmMapHotPatchTablePage(UINT64 a1, INT64 a2, INT64 a3){
NTSTATUS SystemRegionType;
_MMPTE *PteBase;
int v8;
_XSTATE_CONFIGURATION *v9;
_MMPFN *PfnDb;
_MMPFN *v11;
UINT8 v12;
char v13;
unsigned __int64 v14;
__int64 v15;
_MMPFN *v16;
unsigned __int64 v17;
__int64 v18;
__int64 bf_0;
char v20;
unsigned __int64 v21;
SystemRegionType = MiGetSystemRegionType(a1);
PteBase = MmGetPteBase();
if( SystemRegionType == 1 )
{
v8 = 1;
v9 = (_XSTATE_CONFIGURATION *)(*(_QWORD *)(a3 + 288)
+ 8
* ((__int64)(((a1 >> 9) & 0x7FFFFFFFF8i64)
- 8i64
* ((*(_DWORD *)(a3 + 64) >> 12)
+ (unsigned int)((*(_DWORD *)(a3 + 64) & 0xFFF) != 0))
- ((*(_QWORD *)(a3 + 48) >> 9) & 0x7FFFFFFFF8i64)) >> 3));
}
else
{
v8 = 0;
v9 = (_XSTATE_CONFIGURATION *)((char *)PteBase + ((a1 >> 9) & 0x7FFFFFFFF8i64));
}
PfnDb = MmGetPfnDb();
v11 = &PfnDb[a2];
v12 = MiLockPageInline(v11);
v13 = *((_BYTE *)&v11->u3 + 2) | 0x10;
v14 = v12;
v11->u2._bf_0 &= ~0x4000000000000000ui64;
*((_BYTE *)&v11->u3 + 2) = v13;
LODWORD(v15) = MiGetContainingPageTable((UINT64)v9);
v11->u4._bf_0 ^= (v11->u4._bf_0 ^ v15) & 0xFFFFFFFFFi64;
v16 = &PfnDb[v15];
MiLockNestedPageAtDpcInline(v16);
v16->u2._bf_0 ^= ((v16->u2._bf_0 + 1) ^ v16->u2._bf_0) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64(&v16->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v11->OriginalPte.u.Long = MiSwizzleInvalidPte(32i64);
v11->PteLong = (unsigned __int64)v9;
if( v8 )
{
bf_0 = v11->u2._bf_0;
v11->u4._bf_0 |= 0x8000000000000000ui64;
v20 = *(_BYTE *)(&v11->u3 + 1) & 0xF8 | 3;
v11->u2._bf_0 = bf_0 ^ v18 & ((bf_0 - 1) ^ bf_0);
*((_BYTE *)&v11->u3 + 2) = v20;
}
else
{
++v11->u3.ReferenceCount;
}
_InterlockedAnd64(&v11->u2.Lock, v17);
__writecr8(v14);
if( v8 )
LODWORD(v21) = MiMakeTransitionPte(a2, 1);
else
LODWORD(v21) = MiMakeValidPte(v9, a2, 536870913i64);
v9->EnabledFeatures = v21;
return v21;
}Referenced by:
PsDispatchIumService