MiBuildForkPageTable

VOID __stdcall MiBuildForkPageTable(
        UINT64 PageFrameIndex,
        _MMPTE *PointerPde,
        _MMPTE *PointerNewPde,
        UINT64 ContainingFrame,
        UINT64 MakeValid){
  _MMPFN *PfnDb; 
  _MMPFN *v9; 
  _MMPFN *v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  char v13; 
  char v14; 
  unsigned __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  int v18; 
  __int64 v19; 
  int v20; 
  int v21; 

  PfnDb = MmGetPfnDb();
  v9 = &PfnDb[(_QWORD)PointerPde];
  v10 = &PfnDb[MakeValid];
  v9->OriginalPte.u.Long = MiSwizzleInvalidPte(128i64);
  v9->u4._bf_0 ^= (v11 ^ v9->u4._bf_0) & 0xFFFFFFFFFi64;
  v12 = MiLockPageInline(v10);
  v10->u2._bf_0 ^= ((v10->u2._bf_0 + 1) ^ v10->u2._bf_0) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  LODWORD(MakeValid) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&v9->u2, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&MakeValid);
    while( v9->u2._bf_0 < 0 );
  }
  v13 = *((_BYTE *)&v9->u3 + 2) | 0x10;
  *((_BYTE *)&v9->u3 + 2) = v13;
  v14 = v13;
  if( (v13 & 0xC0) != 64 )
  {
    MiChangePageAttribute(v9, MiCached, 1ui64);
    v14 = *((_BYTE *)&v9->u3 + 2);
  }
  v15 = v9->u2._bf_0 & 0xC000000000000001ui64;
  v9->u3.ReferenceCount = 1;
  v9->PteLong = (unsigned __int64)PointerNewPde;
  v9->u2._bf_0 = v15 | 1;
  *((_BYTE *)&v9->u3 + 2) = v14 & 0xF8 | 6;
  MiAddLockedPageCharge(v9, 1ui64);
  _InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v12);
  if( v21 == 1 )
  {
    LODWORD(v19) = MiMakeTransitionPte((INT64)PointerPde, 4);
    v17 = v19;
    LOBYTE(v20) = MiPteInShadowRange(ContainingFrame);
    if( v20 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v17 & 1) != 0 )
      goto LABEL_14;
  }
  else
  {
    LODWORD(v16) = MiMakeValidPte((_XSTATE_CONFIGURATION *)PointerNewPde, (INT64)PointerPde, 2147483652i64);
    v17 = v16 | 4;
    LOBYTE(v18) = MiPteInShadowRange(ContainingFrame);
    if( v18 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v17 & 1) != 0 )
LABEL_14:
      v17 |= 0x8000000000000000ui64;
  }
  *(_QWORD *)ContainingFrame = v17;
}

Referenced by:

MiUpdateForkMaps