MiBuildForkPageTable

VOID __stdcall MiBuildForkPageTable(
        UINT64 PageFrameIndex,
        MMPTE *PointerPde,
        MMPTE *PointerNewPde,
        UINT64 ContainingFrame,
        UINT64 MakeValid){
  _MMPFN *PfnDb; 
  INT64 v9; 
  INT64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  char v13; 
  char v14; 
  unsigned __int64 v15; 
  UINT64 v16; 
  UINT64 TransitionPte; 
  int v18; 
  PfnDb = MmGetPfnDb();
  v9 = (INT64)PfnDb + 48 * (_QWORD)PointerPde;
  v10 = (INT64)PfnDb + 48 * MakeValid;
  *(_QWORD *)(v9 + 16) = MiSwizzleInvalidPte(128i64);
  *(_QWORD *)(v9 + 40) ^= (v11 ^ *(_QWORD *)(v9 + 40)) & 0xFFFFFFFFFi64;
  v12 = (unsigned __int8)MiLockPageInline(v10);
  *(_QWORD *)(v10 + 24) ^= ((*(_QWORD *)(v10 + 24) + 1i64) ^ *(_QWORD *)(v10 + 24)) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
  LODWORD(MakeValid) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)(v9 + 24), 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&MakeValid);
    while( *(__int64 *)(v9 + 24) < 0 );
  }
  v13 = *(_BYTE *)(v9 + 34) | 0x10;
  *(_BYTE *)(v9 + 34) = v13;
  v14 = v13;
  if( (v13 & 0xC0) != 64 )
  {
    MiChangePageAttribute(v9, 1i64, 1);
    v14 = *(_BYTE *)(v9 + 34);
  }
  v15 = *(_QWORD *)(v9 + 24) & 0xC000000000000001ui64;
  *(_WORD *)(v9 + 32) = 1;
  *(_QWORD *)(v9 + 8) = PointerNewPde;
  *(_QWORD *)(v9 + 24) = v15 | 1;
  *(_BYTE *)(v9 + 34) = v14 & 0xF8 | 6;
  MiAddLockedPageCharge(v9, 1);
  _InterlockedAnd64((volatile signed __int64 *)(v9 + 24), 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v12);
  if( v18 == 1 )
    TransitionPte = MiMakeTransitionPte((UINT64)PointerPde, 4ui64, v16);
  else
    TransitionPte = MiMakeValidPte((UINT64)PointerNewPde, (INT64)PointerPde, 2147483652i64) | 4;
  *(_QWORD *)ContainingFrame = TransitionPte;
}

Referenced by:

MiUpdateForkMaps