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