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