MiCopyKstack

VOID *__stdcall MiCopyKstack(_MMPFN *NewPfn, _MMPFN *OldPfn, _MMPTE *TargetPte){
  unsigned __int64 v3; 
  __int64 v6; 
  __int64 v7; 
  __int64 v8; 
  char v9; 
  VOID *result; 

  v3 = OldPfn->PteLong | 0x8000000000000000ui64;
  v6 = (_QWORD)MmGetPteBase() << 25;
  v7 = (__int64)((v3 << 25) - v6) >> 16;
  KeCopyPage((PVOID)((((_QWORD)TargetPte << 25) - v6) >> 16));
  LODWORD(v8) = MI_READ_PTE_LOCK_FREE(v3);
  MiWriteValidPteNewPage(
    (INT64 *)v3,
    v8 & 0xFFFF000000000FFFui64 | (((NewPfn - MmGetPfnDb()) & 0xFFFFFFFFFi64) << 12),
    0i64);
  v9 = *(_BYTE *)(&OldPfn->u3 + 1) & 0xF8 | 5;
  OldPfn->u4._bf_0 &= 0x8FFFFFFFFFFFFFFFui64;
  result = (VOID *)v7;
  *((_BYTE *)&OldPfn->u3 + 2) = v9;
  return result;
}

Referenced by:

MiStackTheftIsr
MiSwapStackPage