MiMirrorPerformBrownWrites
VOID __fastcall MiMirrorPerformBrownWrites(INT64 a1, CHAR a2, _QWORD *a3){
UINT64 v3;
int v4;
__int64 v5;
CHAR v6;
unsigned __int64 v7;
unsigned __int64 i;
_QWORD *v9;
__int64 j;
unsigned __int64 v11;
unsigned __int64 v12;
unsigned __int64 v13;
_DWORD *v14;
__int64 v15;
unsigned __int64 k;
unsigned __int64 v17;
int v18;
_DWORD *v19;
__int64 v20;
unsigned __int64 v21;
unsigned __int64 v22;
volatile signed __int32 *v23;
unsigned int v24;
unsigned __int64 v25;
__int64 v26;
__int64 v27;
char *v28;
char *v29;
char *v30;
__int64 v31;
unsigned __int64 v32;
UINT8 *v33;
UINT64 v34;
unsigned __int64 v35;
volatile signed __int32 *v36;
unsigned __int64 v37;
char *v38;
char *v39;
unsigned __int64 v40;
int v41;
__int64 v42;
int v46;
v3 = 0i64;
v46 = 0;
v4 = 0;
v42 = 0i64;
v5 = 0i64;
v6 = a2;
while( 1 )
{
v7 = v3 & -(__int64)(v3 < qword_140C4E450[0]);
for( i = qword_140C4E450[0] - 1; i - v7 == -1i64; i = v20 - 1 )
{
v11 = -1i64;
LABEL_45:
if( !v7 )
goto LABEL_10;
v20 = v3 + 1;
v7 = 0i64;
if( v3 + 1 > qword_140C4E450[0] )
v20 = qword_140C4E450[0];
}
v9 = (_QWORD *)(qword_140C4E458 + 8 * (v7 >> 6));
for( j = ((1i64 << (v7 & 0x3F)) - 1) | ~*v9; j == -1; j = ~*v9 )
{
if( (unsigned __int64)++v9 > qword_140C4E458 + 8 * (i >> 6) )
goto LABEL_42;
}
_BitScanForward64((unsigned __int64 *)&j, ~j);
v11 = j + (((__int64)v9 - qword_140C4E458) >> 3 << 6);
if( v11 > i )
{
LABEL_42:
v11 = -1i64;
goto LABEL_45;
}
if( v11 == -1i64 )
goto LABEL_45;
LABEL_10:
if( v11 < v3 || v11 == -1i64 )
goto LABEL_31;
if( qword_140C4E450[0] > v11 )
{
v12 = v11;
v13 = qword_140C4E458 + 4 * ((unsigned __int64)(qword_140C4E450[0] - 1) >> 5);
v14 = (_DWORD *)(qword_140C4E458 + 4 * (v11 >> 5));
if( v14 != (_DWORD *)v13 && (*v14 | *((_DWORD *)qword_140011CE0 + (v11 & 0x1F))) == -1 )
{
v12 = (v11 & 0xFFFFFFFFFFFFFFE0ui64) + 32;
for( ++v14; (unsigned __int64)v14 < v13 && *v14 == -1; ++v14 )
v12 += 32i64;
}
while( v12 < qword_140C4E450[0] && _bittest64((const signed __int64 *)qword_140C4E458, v12) )
++v12;
v15 = 0i64;
if( v14 != (_DWORD *)v13 && (*v14 & ~*((_DWORD *)qword_140011CE0 + (v12 & 0x1F))) == 0 )
{
v15 = 32 - (v12 & 0x1F);
if( v15 == -1 )
goto LABEL_25;
v19 = v14 + 1;
while( (unsigned __int64)v19 < v13 && !*v19 )
{
++v19;
v15 += 32i64;
if( v15 == -1 )
goto LABEL_25;
}
}
for( k = v15 + v12; k < qword_140C4E450[0]; ++v15 )
{
if( _bittest64((const signed __int64 *)qword_140C4E458, k) )
break;
if( v15 == -1 )
break;
++k;
}
LABEL_25:
if( v15 )
goto LABEL_26;
goto LABEL_50;
}
v15 = 0i64;
LABEL_50:
v12 = qword_140C4E450[0];
LABEL_26:
v17 = v12 - v11;
v41 = v6 & 8;
if( (v6 & 8) == 0 )
goto LABEL_27;
if( v4 != 1 )
break;
v21 = v11 & 0x1F;
v22 = v17;
v23 = (volatile signed __int32 *)(qword_140C4E468 + 4 * (v11 >> 5));
if( v21 + v17 <= 0x20 )
{
if( v17 == 32 )
{
*v23 = -1;
goto LABEL_64;
}
v24 = ((1 << v17) - 1) << v21;
goto LABEL_63;
}
if( (v11 & 0x1F) != 0 )
{
_InterlockedOr(v23, ((1 << (32 - (v11 & 0x1F))) - 1) << v21);
v22 = v17 - (32 - (unsigned int)(v11 & 0x1F));
++v23;
}
if( v22 >= 0x20 )
{
v25 = v22 >> 5;
v22 += -32i64 * (v22 >> 5);
do
{
*v23++ = -1;
--v25;
}
while( v25 );
}
if( v22 )
{
v24 = (1 << v22) - 1;
LABEL_63:
_InterlockedOr(v23, v24);
}
LABEL_64:
v3 = v17 + v15 + v11;
LABEL_30:
if( v3 >= qword_140C4E450[0] )
goto LABEL_31;
}
v3 = v11;
v26 = 3 * v11;
v15 = 0i64;
v27 = -1i64;
if( v17 > 0x100 )
v17 = 256i64;
v28 = (char *)MmGetPfnDb() + 16 * v26;
v29 = &v28[48 * v17];
v30 = v28 + 24;
while( 1 )
{
v31 = v27;
v32 = (unsigned __int8)MiLockPageInline((INT64)v28);
if( *((_WORD *)v30 + 4) || (unsigned __int8)((v30[10] & 7) - 2) > 2u )
{
_InterlockedAnd64((volatile signed __int64 *)v30, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v32);
if( v27 != -1 )
goto LABEL_91;
goto LABEL_84;
}
if( !(unsigned int)MiUnlinkPageFromList((_MMPFN *)v28, 0i64) )
break;
*(_QWORD *)v30 &= 0xC000000000000000ui64;
if( !(unsigned int)MiAddLockedPageCharge((INT64)v28, 0) )
{
MiPfnReferenceCountIsZero((_MMPFN *)v28, v3, v33);
goto LABEL_88;
}
v34 = v3 & 0x1F;
LOBYTE(v35) = 1;
v36 = (volatile signed __int32 *)(qword_140C4E468 + 4 * (v3 >> 5));
if( v34 + 1 > 0x20 )
{
if( (v3 & 0x1F) == 0 )
goto LABEL_82;
_InterlockedAnd(v36++, ~(((1 << (32 - (v3 & 0x1F))) - 1) << v34));
v35 = 1i64 - (32 - (unsigned int)(v3 & 0x1F));
if( v35 >= 0x20 )
{
v37 = v35 >> 5;
v35 += -32i64 * (v35 >> 5);
do
{
*v36++ = 0;
--v37;
}
while( v37 );
}
if( v35 )
LABEL_82:
_InterlockedAnd(v36, -1 << v35);
}
else
{
_InterlockedAnd(v36, ~(1 << v34));
}
_InterlockedAnd64((volatile signed __int64 *)v30, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v32);
v27 = v3;
if( v31 != -1 )
v27 = v31;
LABEL_84:
v28 += 48;
v30 += 48;
++v3;
if( v28 >= v29 )
{
v4 = v46;
goto LABEL_89;
}
}
MiDiscardTransitionPteEx((UINT64)v28, 0i64);
LABEL_88:
_InterlockedAnd64((volatile signed __int64 *)v28 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v32);
v4 = 1;
v46 = 1;
LABEL_89:
if( v27 == -1 )
{
v5 = v42;
v6 = a2;
goto LABEL_30;
}
LABEL_91:
v5 = v42;
v17 = v3 - v27;
v11 = v27;
LABEL_27:
v5 += v17;
v42 = v5;
v18 = (*(__int64(__fastcall **)(unsigned __int64, unsigned __int64))(a1 + 16))(v11 << 12, v17 << 12);
if( v41 )
{
v38 = (char *)MmGetPfnDb() + 48 * v11;
v39 = &v38[48 * v17];
do
{
v40 = (unsigned __int8)MiLockPageInline((INT64)v38);
MiRemoveLockedPageChargeAndDecRef((_MMPFN *)v38);
_InterlockedAnd64((volatile signed __int64 *)v38 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v40);
v38 += 48;
}
while( v38 < v39 );
}
if( v18 >= 0 )
{
v4 = v46;
v6 = a2;
v3 = v15 + v11 + v17;
goto LABEL_30;
}
LABEL_31:
*a3 = v5;
}Referenced by:
MiMirrorBrownPhase