MiInitializeProtoPfn
VOID __stdcall MiInitializeProtoPfn(
UINT64 PageFrameIndex,
MMPTE *PointerProtoPte,
UINT64 ProtectionMask,
UINT64 PfnInitializeFlags){
unsigned int v4;
char *v7;
_MMPFN *v8;
UINT64 v9;
UINT64 SpinCount;
int PageIrql;
PageIrql = PfnInitializeFlags;
LOBYTE(PageIrql) = 0;
v4 = ProtectionMask;
v7 = (char *)MmGetPfnDb() + 48 * PageFrameIndex;
while( 1 )
{
v8 = MiLockProtoPoolPage(PointerProtoPte, (UINT8 *)&PageIrql);
if( v8 )
break;
MmAccessFault(2ui64, PointerProtoPte, 0, 0i64);
}
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v7 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v7 + 3) < 0 );
}
MiInitializePfn((_RTL_BITMAP_EX *)v7, (UINT64 *)PointerProtoPte, v4);
*(_QWORD *)PointerProtoPte = MiMakeValidPte(0i64, PageFrameIndex, v4 | 0x80000000) & 0xFFFFFFFFFFFFFEFFui64;
++*((_WORD *)v7 + 16);
MiDecrementShareCount((UINT64)v7);
_InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
LOBYTE(v9) = PageIrql;
MiUnlockProtoPoolPage(v8, v9);
}Referenced by:
MiFillPerSessionProtos