MiInitializePfnForOtherProcess
VOID __stdcall MiInitializePfnForOtherProcess(
UINT64 PageFrameIndex,
_MMPTE *PointerPte,
UINT64 ContainingPageFrame,
UINT64 Flags){
__int16 v4;
_MMPFN *PfnDb;
_MMPFN *v8;
UINT8 v9;
unsigned __int64 v10;
__int64 v11;
unsigned __int64 v12;
char v13;
UINT64 SpinCount;
v4 = Flags;
PfnDb = MmGetPfnDb();
v8 = &PfnDb[PageFrameIndex];
if( (Flags & 0x10) != 0 )
{
LODWORD(SpinCount) = 0;
v9 = 17;
while( _interlockedbittestandset64((volatile signed __int32 *)&v8->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v8->u2._bf_0 < 0 );
}
}
else
{
v9 = MiLockPageInline(&PfnDb[PageFrameIndex]);
}
v10 = v8->u2._bf_0 & 0xF0FFFFFFFFFFFFFFui64;
v8->PteLong = (unsigned __int64)PointerPte;
v8->u2._bf_0 = v10;
v8->OriginalPte.u.Long = MiSwizzleInvalidPte(128i64);
v8->u3.ReferenceCount = 1;
if( (v4 & 0x80u) != 0 )
v12 = v11 ^ ((v11 + 1) ^ v11) & 0x3FFFFFFFFFFFFFFFi64;
else
v12 = v11 & 0xC000000000000000ui64 | 1;
v8->u2._bf_0 = v12;
v13 = *((_BYTE *)&v8->u3 + 2) | 0x10;
*((_BYTE *)&v8->u3 + 2) = v13;
if( (v4 & 0x200) != 0 )
*((_BYTE *)&v8->u3 + 2) = v13 & 0xF8 | 6;
v8->u4._bf_0 ^= (ContainingPageFrame ^ v8->u4._bf_0) & 0xFFFFFFFFFi64;
_InterlockedAnd64(&v8->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( v9 != 17 )
__writecr8(v9);
if( (v4 & 0x800) == 0 )
MiLockAndIncrementShareCount(ContainingPageFrame);
}Referenced by:
MiAllocateTopLevelPage
MiDemoteValidLargePageOneLevel
MiDuplicateCloneLeaf
MiInitializeShadowPageTable
MiInitializeSystemPageTable
MiMakeOutswappedPageResident
MiMapNewSession
MiMapPageFileHash