MiSlowRotateCopy

void __fastcall MiSlowRotateCopy(__int64 a1, __int64 a2, __int64 a3){
  UINT64 *v3; 
  unsigned __int64 v4; 
  int v5; 
  _MEMORY_CACHING_TYPE v6; 
  __int64 v7; 
  __int64 v8; 
  _MMPTE *v9; 
  _MMPTE *v10; 
  INT64 v11[2]; 
  _MMPTE *MappingPte; 
  v3 = (UINT64 *)(a2 + 48);
  v4 = (unsigned __int64)*(unsigned int *)(a2 + 40) >> 12;
  *(_OWORD *)v11 = 0i64;
  MappingPte = 0i64;
  v5 = *(_DWORD *)(a3 + 48);
  if( (v5 & 0x380) != 0 && (v5 & 0xC00) == 3072 )
    v6 = MmWriteCombined;
  else
    v6 = (v5 & 0xC00) != 1024;
  if( v4 )
  {
    v7 = (_QWORD)MmGetPteBase() << 25;
    v8 = a1 - (_QWORD)v3;
    do
    {
      MiGetPteMappingPair(1i64, (INT64)v11);
      v9 = MappingPte;
      v10 = (_MMPTE *)((char *)MappingPte + 8);
      MiInitializeSlowPte(MappingPte, *v3, v6);
      MiInitializeSlowPte(v10, *(UINT64 *)((char *)v3 + v8 + 48), v6);
      KeCopyPage((PVOID)((((_QWORD)v10 << 25) - v7) >> 16));
      *(_QWORD *)v9 = ZeroPte;
      *(_QWORD *)v10 = ZeroPte;
      MiReturnPteMappingPair((INT64)v11);
      ++v3;
      --v4;
    }
    while( v4 );
  }
}

Referenced by:

MmRotatePhysicalView