VOID __stdcall MiSetPfnOwnedAndActive(
_MMPFN *Pfn1,
UINT64 PfnState,
_MMPTE *PointerPte,
_MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
UINT64 ReferenceCount){
char v7;
UINT8 v9;
unsigned int v10;
unsigned __int64 v11;
v7 = PfnState;
v9 = MiLockPageInline(Pfn1);
v10 = *((unsigned __int8 *)&Pfn1->u3 + 2);
Pfn1->u4._bf_0 &= ~0x8000000000000000ui64;
Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = 0i64;
v11 = v9;
if( v10 >> 6 != CacheAttribute )
{
MiChangePageAttribute(Pfn1, CacheAttribute, 1ui64);
LOBYTE(v10) = *((_BYTE *)&Pfn1->u3 + 2);
}
Pfn1->u2._bf_0 = Pfn1->u2._bf_0 & 0xC000000000000000ui64 | 1;
if( (_DWORD)ReferenceCount )
Pfn1->u3.ReferenceCount = ReferenceCount;
Pfn1->PteLong = (unsigned __int64)PointerPte;
*((_BYTE *)&Pfn1->u3 + 2) = v10 & 0xF8 | 6;
if( (v7 & 1) != 0 )
{
Pfn1->u4._bf_0 = Pfn1->u4._bf_0 & 0xFFFFFFF000000000ui64 | 0xFFFFFFFFDi64;
Pfn1->OriginalPte.u.Long = MiSwizzleInvalidPte(128i64);
Pfn1->PteLong = (unsigned __int64)MmGetPteBase();
Pfn1->u2._bf_0 |= 0x4000000000000000ui64;
}
_InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v11);
}