MiInitializeProtoPfn
VOID __stdcall MiInitializeProtoPfn(
UINT64 PageFrameIndex,
VOID *PointerProtoPte,
UINT64 ProtectionMask,
UINT64 PfnInitializeFlags){
unsigned int v4;
_MMPFN *v7;
_MMPFN *v8;
ULONG_PTR v9;
__int64 v10;
unsigned __int64 v11;
int v12;
UINT64 SpinCount;
int PageIrql;
PageIrql = PfnInitializeFlags;
LOBYTE(PageIrql) = 0;
v4 = ProtectionMask;
v7 = &MmGetPfnDb()[PageFrameIndex];
while( 1 )
{
v8 = MiLockProtoPoolPage((_MMPTE *)PointerProtoPte, (UINT8 *)&PageIrql);
v9 = (unsigned int)v8;
if( v8 )
break;
MmAccessFault(2ui64, PointerProtoPte, 0, 0i64);
}
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v7->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v7->u2._bf_0 < 0 );
}
MiInitializePfn((_RTL_BITMAP_EX *)v7, (UINT64 *)PointerProtoPte, v4);
LODWORD(v10) = MiMakeValidPte(0i64, PageFrameIndex, v4 | 0x80000000);
v11 = v10 & 0xFFFFFFFFFFFFFEFFui64;
LOBYTE(v12) = MiPteInShadowRange((UINT64)PointerProtoPte);
if( v12 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v11 & 1) != 0 )
v11 |= 0x8000000000000000ui64;
*(_QWORD *)PointerProtoPte = v11;
++v7->u3.ReferenceCount;
MiDecrementShareCount(v7);
_InterlockedAnd64(&v7->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
MiUnlockProtoPoolPage(v9, PageIrql);
}Referenced by:
MiFillPerSessionProtos