MxCopyPage

VOID __stdcall MxCopyPage(UINT64 PageFrameIndex, PVOID SourceVa){
  unsigned __int64 Phase0Mapping; 
  void *v4; 
  UINT64 *v5; 
  UINT64 ValidPte; 
  __int64 v7; 
  BOOL v8; 
  unsigned __int64 v9; 
  Phase0Mapping = (unsigned __int64)MxGetPhase0Mapping();
  v4 = (void *)Phase0Mapping;
  if( !Phase0Mapping )
    KeBugCheckEx(0x1Au, 0x3030305ui64, PageFrameIndex, 0i64, 0i64);
  v5 = (UINT64 *)((char *)MmGetPteBase() + ((Phase0Mapping >> 9) & 0x7FFFFFFFF8i64));
  ValidPte = MiMakeValidPte((UINT64)v5, PageFrameIndex, 2684354564i64);
  v8 = MiPteInShadowRange((UINT64)v5);
  if( v8 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 && (ValidPte & 1) != 0 )
    ValidPte |= v7;
  *v5 = ValidPte;
  KeCopyPage(v4);
  v9 = ZeroPte;
  if( v8 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 && (ZeroPte & 1) != 0 )
    v9 = ZeroPte | 0x8000000000000000ui64;
  *v5 = v9;
  KeFlushSingleTb(v4, 0i64, 1i64);
}

Referenced by:

MiCreateSystemPageTable