MiSlowRotateCopy

VOID __stdcall MiSlowRotateCopy(_MDL *DestinationMdl, _MDL *SourceMdl, _MMVAD_SHORT *Vad){
  UINT64 *v3; 
  unsigned __int64 v4; 
  union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v5; 
  _MEMORY_CACHING_TYPE v6; 
  __int64 v7; 
  char *v8; 
  _MMPTE *v9; 
  UINT64 v10; 
  unsigned __int64 Long; 
  int v12; 
  unsigned __int64 v13; 
  int v14; 
  _MMPTE_COPY_LIST PteCopyList[4]; 
  _MMPTE *MappingPte; 

  v3 = (UINT64 *)&SourceMdl[1];
  v4 = (unsigned __int64)SourceMdl->ByteCount >> 12;
  *(_OWORD *)PteCopyList = 0i64;
  MappingPte = 0i64;
  v5.LongFlags = (unsigned int)Vad->u;
  if( (v5.LongFlags & 0x380) != 0 && (v5.LongFlags & 0xC00) == 3072 )
    v6 = MmWriteCombined;
  else
    v6 = (v5.LongFlags & 0xC00) != 1024;
  if( v4 )
  {
    v7 = (_QWORD)MmGetPteBase() << 25;
    v8 = (char *)((char *)DestinationMdl - (char *)v3);
    do
    {
      MiGetPteMappingPair(1ui64, PteCopyList);
      v9 = MappingPte;
      v10 = (UINT64)&MappingPte[1];
      MiInitializeSlowPte(MappingPte, *v3, v6);
      MiInitializeSlowPte((_MMPTE *)v10, *(_QWORD *)&v8[(_QWORD)v3 + 48], v6);
      KeCopyPage((PVOID)((__int64)((v10 << 25) - v7) >> 16));
      Long = ZeroPte.u.Long;
      LOBYTE(v12) = MiPteInShadowRange((UINT64)v9);
      if( v12 )
      {
        if( (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) == 0 )
        {
          MappingPte->u.Long = ZeroPte.u.Long;
          goto LABEL_12;
        }
        v9 = MappingPte;
        if( (ZeroPte.u.Long & 1) != 0 )
          Long = ZeroPte.u.Long | 0x8000000000000000ui64;
      }
      v9->u.Long = Long;
LABEL_12:
      v13 = ZeroPte.u.Long;
      LOBYTE(v14) = MiPteInShadowRange(v10);
      if( v14 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
        v13 = ZeroPte.u.Long | 0x8000000000000000ui64;
      *(_QWORD *)v10 = v13;
      MiReturnPteMappingPair(PteCopyList);
      ++v3;
      --v4;
    }
    while( v4 );
  }
}

Referenced by:

MmRotatePhysicalView