MiMirrorBlackPhase
INT64 __fastcall MiMirrorBlackPhase(INT64 a1){
INT64 v2;
int v3;
RTL_BALANCED_NODE *v4;
unsigned __int64 i;
_QWORD **v6;
unsigned __int64 v7;
_QWORD *v8;
_QWORD *j;
_QWORD **v10;
unsigned __int64 v11;
_QWORD *v12;
v2 = *(_QWORD *)a1;
if( qword_140C4EBC0 )
MiRemoveEnclavePagesFromMirror(*(_QWORD *)a1);
v3 = *(_DWORD *)(a1 + 8);
if( (v3 & 0x40D) != 0 )
{
if( (v3 & 0x100) != 0 )
{
MiIterateOverPartitions((void(__fastcall *)(__int64, __int64))MiMirrorRemoveBlackChildPartitionPages, a1);
v3 = *(_DWORD *)(a1 + 8);
}
if( (v3 & 0xC0) != 0 )
{
MiMirrorReduceBlackToActiveAndPrivatePages(a1);
}
else if( (v3 & 0x100) != 0 )
{
MiMirrorReduceBlackWrites((INT64)&MiSystemPartition, a1);
}
else
{
MiIterateOverPartitions((void(__fastcall *)(__int64, __int64))MiMirrorReduceBlackWrites, a1);
}
v4 = RootPointer;
i = 0i64;
while( v4 )
{
i = (unsigned __int64)v4;
v4 = v4->Children[0];
}
while( i )
{
v6 = *(_QWORD ***)(i + 8);
v7 = i;
*(_BYTE *)(i + 70) = 1;
if( v6 )
{
v8 = *v6;
for( i = (unsigned __int64)v6; v8; v8 = (_QWORD *)*v8 )
i = (unsigned __int64)v8;
}
else
{
while( 1 )
{
i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64;
if( !i || *(_QWORD *)i == v7 )
break;
v7 = i;
}
}
}
for( j = (_QWORD *)qword_140C4E2A8; j; j = (_QWORD *)*j )
i = (unsigned __int64)j;
while( i )
{
v10 = *(_QWORD ***)(i + 8);
v11 = i;
*(_BYTE *)(i + 70) = 1;
if( v10 )
{
v12 = *v10;
for( i = (unsigned __int64)v10; v12; v12 = (_QWORD *)*v12 )
i = (unsigned __int64)v12;
}
else
{
while( 1 )
{
i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64;
if( !i || *(_QWORD *)i == v11 )
break;
v11 = i;
}
}
}
}
return MiMirrorPerformBlackWrites(v2);
}Referenced by:
MmDuplicateMemory