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