MiMirrorBrownPhase
INT64 __fastcall MiMirrorBrownPhase(INT64 a1){
int v1;
int v3;
VOID **i;
_MI_PARTITION *v5;
int j;
int v7;
UINT64 v8;
int v9;
unsigned int v10;
VOID **NextPartition;
VOID **v12;
unsigned __int64 a3;
v1 = *(_DWORD *)(a1 + 8);
if( (v1 & 0xC0) == 0 )
{
a3 = 0i64;
v3 = (v1 & 0xA) == 0;
for( i = 0i64; ; i = v12 )
{
NextPartition = PsGetNextPartition(i);
v12 = NextPartition;
if( !NextPartition )
break;
v5 = (_MI_PARTITION *)*NextPartition;
if( (*(_DWORD *)(a1 + 8) & 0x100) == 0 || v5 == (_MI_PARTITION *)&MiSystemPartition )
{
for( j = 0; ; ++j )
{
MiActOnMirrorBitmap((unsigned __int64 *)qword_140C4E450, 2);
if( j == v3 && !*(_BYTE *)(a1 + 20) )
{
*(_BYTE *)(a1 + 20) = 1;
_InterlockedIncrement(&dword_140C4EA8C);
}
v7 = *(_DWORD *)(a1 + 8);
if( (v7 & 0x400) != 0 || (v7 & 4) != 0 )
{
v8 = *(unsigned int *)(a1 + 12);
}
else
{
if( (v7 & 0x10) == 0 )
MiEmptyAllWorkingSets(v5);
v8 = 0i64;
}
MiMirrorGatherBrownPages((INT64 *)a1, v5, *(unsigned int *)(a1 + 16), v8);
MiMirrorPerformBrownWrites(*(_QWORD *)a1, *(_DWORD *)(a1 + 8), &a3);
v10 = v9;
if( v9 < 0 )
{
PsQuitNextPartition(v12);
return v10;
}
if( *(_BYTE *)(a1 + 20) == 1 || a3 < 0x400 )
break;
}
if( (*(_DWORD *)(a1 + 8) & 0x100) == 0 )
continue;
PsQuitNextPartition(v12);
return 0i64;
}
}
}
return 0i64;
}Referenced by:
MmDuplicateMemory