MiMirrorPerformBrownWrites
__int64 __fastcall MiMirrorPerformBrownWrites(__int64 a1, char a2, _QWORD *a3){
unsigned int v3;
UINT64 v4;
int v5;
__int64 v6;
char v7;
unsigned __int64 v8;
unsigned __int64 i;
_QWORD *v10;
__int64 j;
unsigned __int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
_DWORD *v15;
__int64 v16;
unsigned __int64 v17;
unsigned __int64 v18;
_DWORD *v20;
UINT64 v21;
unsigned __int64 v22;
unsigned __int64 v23;
volatile signed __int32 *v24;
unsigned int v25;
unsigned __int64 v26;
unsigned __int64 v27;
__int64 v28;
_MMPFN *v29;
_MMPFN *v30;
_MIPFNBLINK *p_u2;
__int64 v32;
unsigned __int64 v33;
int v34;
UINT8 v35;
UINT64 v36;
unsigned __int64 v37;
volatile signed __int32 *v38;
unsigned __int64 v39;
_MMPFN *v40;
_MMPFN *v41;
unsigned __int64 v42;
int v43;
int v44;
__int64 v45;
int v49;
v3 = 0;
v43 = 0;
v4 = 0i64;
v49 = 0;
v5 = 0;
v45 = 0i64;
v6 = 0i64;
v7 = a2;
while( 1 )
{
v8 = v4 & -(__int64)(v4 < *(&stru_140C4DB30 + 292));
for( i = *(&stru_140C4DB30 + 292) - 1i64; i - v8 == -1i64; i = v21 - 1 )
{
v12 = -1i64;
LABEL_46:
if( !v8 )
goto LABEL_10;
v21 = v4 + 1;
v8 = 0i64;
if( v4 + 1 > *(&stru_140C4DB30 + 292) )
v21 = *(&stru_140C4DB30 + 292);
}
v10 = (_QWORD *)(*(&stru_140C4DB30 + 293) + 8 * (v8 >> 6));
for( j = ((1i64 << (v8 & 0x3F)) - 1) | ~*v10; j == -1; j = ~*v10 )
{
if( (unsigned __int64)++v10 > *(&stru_140C4DB30 + 293) + 8 * (i >> 6) )
goto LABEL_43;
}
_BitScanForward64((unsigned __int64 *)&j, ~j);
v12 = j + (((__int64)v10 - *(&stru_140C4DB30 + 293)) >> 3 << 6);
if( v12 > i )
{
LABEL_43:
v12 = -1i64;
goto LABEL_46;
}
if( v12 == -1i64 )
goto LABEL_46;
LABEL_10:
if( v12 < v4 || v12 == -1i64 )
goto LABEL_32;
if( *(&stru_140C4DB30 + 292) > v12 )
{
v13 = v12;
v14 = *(&stru_140C4DB30 + 293) + 4 * ((unsigned __int64)(*(&stru_140C4DB30 + 292) - 1i64) >> 5);
v15 = (_DWORD *)(*(&stru_140C4DB30 + 293) + 4 * (v12 >> 5));
if( v15 != (_DWORD *)v14 && (*v15 | *((_DWORD *)qword_140011CE0 + (v12 & 0x1F))) == -1 )
{
v13 = (v12 & 0xFFFFFFFFFFFFFFE0ui64) + 32;
for( ++v15; (unsigned __int64)v15 < v14 && *v15 == -1; ++v15 )
v13 += 32i64;
}
while( v13 < *(&stru_140C4DB30 + 292) && _bittest64(*(&stru_140C4DB30 + 293), v13) )
++v13;
v16 = 0i64;
if( v15 != (_DWORD *)v14 && (*v15 & ~*((_DWORD *)qword_140011CE0 + (v13 & 0x1F))) == 0 )
{
v16 = 32 - (v13 & 0x1F);
if( v16 == -1 )
goto LABEL_26;
v20 = v15 + 1;
while( (unsigned __int64)v20 < v14 && !*v20 )
{
++v20;
v16 += 32i64;
if( v16 == -1 )
goto LABEL_26;
}
}
v17 = v16 + v13;
if( v16 + v13 < *(&stru_140C4DB30 + 292) )
{
do
{
if( _bittest64(*(&stru_140C4DB30 + 293), v17) )
break;
if( v16 == -1 )
break;
++v17;
++v16;
}
while( v17 < *(&stru_140C4DB30 + 292) );
v3 = v43;
}
LABEL_26:
if( v16 )
goto LABEL_27;
goto LABEL_51;
}
v16 = 0i64;
LABEL_51:
v13 = *(&stru_140C4DB30 + 292);
LABEL_27:
v18 = v13 - v12;
v44 = v7 & 8;
if( (v7 & 8) == 0 )
goto LABEL_28;
if( v5 != 1 )
break;
v22 = v12 & 0x1F;
v23 = v18;
v24 = (volatile signed __int32 *)(*(&stru_140C4DB30 + 295) + 4 * (v12 >> 5));
if( v22 + v18 <= 0x20 )
{
if( v18 == 32 )
{
*v24 = -1;
goto LABEL_65;
}
v25 = ((1 << v18) - 1) << v22;
goto LABEL_64;
}
if( (v12 & 0x1F) != 0 )
{
_InterlockedOr(v24, ((1 << (32 - (v12 & 0x1F))) - 1) << v22);
v23 = v18 - (32 - (unsigned int)(v12 & 0x1F));
++v24;
}
if( v23 >= 0x20 )
{
v26 = v23 >> 5;
v23 += -32i64 * (v23 >> 5);
do
{
*v24++ = -1;
--v26;
}
while( v26 );
}
if( v23 )
{
v25 = (1 << v23) - 1;
LABEL_64:
_InterlockedOr(v24, v25);
}
LABEL_65:
v4 = v18 + v16 + v12;
LABEL_31:
if( v4 >= *(&stru_140C4DB30 + 292) )
goto LABEL_32;
}
v4 = v12;
v27 = v12;
v16 = 0i64;
v28 = -1i64;
if( v18 > 0x100 )
v18 = 256i64;
v29 = &MmGetPfnDb()[v27];
v30 = &v29[v18];
p_u2 = &v29->u2;
while( 1 )
{
v32 = v28;
v33 = MiLockPageInline(v29);
if( LOWORD(p_u2[1]._bf_0) || (unsigned __int8)((BYTE2(p_u2[1]._bf_0) & 7) - 2) > 2u )
{
_InterlockedAnd64(&p_u2->Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v33);
if( v28 != -1 )
goto LABEL_92;
goto LABEL_85;
}
MiUnlinkPageFromList(v29, 0i64);
if( !v34 )
break;
p_u2->_bf_0 &= 0xC000000000000000ui64;
if( MiAddLockedPageCharge(v29, 0i64) == MiChargeFailed )
{
MiPfnReferenceCountIsZero(v29, v4, v35);
goto LABEL_89;
}
v36 = v4 & 0x1F;
LOBYTE(v37) = 1;
v38 = (volatile signed __int32 *)(*(&stru_140C4DB30 + 295) + 4 * (v4 >> 5));
if( v36 + 1 > 0x20 )
{
if( (v4 & 0x1F) == 0 )
goto LABEL_83;
_InterlockedAnd(v38++, ~(((1 << (32 - (v4 & 0x1F))) - 1) << v36));
v37 = 1i64 - (32 - (unsigned int)(v4 & 0x1F));
if( v37 >= 0x20 )
{
v39 = v37 >> 5;
v37 += -32i64 * (v37 >> 5);
do
{
*v38++ = 0;
--v39;
}
while( v39 );
}
if( v37 )
LABEL_83:
_InterlockedAnd(v38, -1 << v37);
}
else
{
_InterlockedAnd(v38, ~(1 << v36));
}
_InterlockedAnd64(&p_u2->Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v33);
v28 = v4;
if( v32 != -1 )
v28 = v32;
LABEL_85:
++v29;
p_u2 += 6;
++v4;
if( v29 >= v30 )
{
v5 = v49;
goto LABEL_90;
}
}
MiDiscardTransitionPteEx(v29, 0i64);
LABEL_89:
_InterlockedAnd64(&v29->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v33);
v5 = 1;
v49 = 1;
LABEL_90:
if( v28 == -1 )
{
v3 = v43;
v6 = v45;
v7 = a2;
goto LABEL_31;
}
LABEL_92:
v6 = v45;
v18 = v4 - v28;
v12 = v28;
LABEL_28:
v6 += v18;
v45 = v6;
v43 = (*(__int64(__fastcall **)(unsigned __int64, unsigned __int64))(a1 + 16))(v12 << 12, v18 << 12);
v3 = v43;
if( v44 )
{
v40 = &MmGetPfnDb()[v12];
v41 = &v40[v18];
do
{
v42 = MiLockPageInline(v40);
MiRemoveLockedPageChargeAndDecRef(v40);
_InterlockedAnd64(&v40->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v42);
++v40;
}
while( v40 < v41 );
}
if( v43 >= 0 )
{
v5 = v49;
v7 = a2;
v4 = v16 + v12 + v18;
goto LABEL_31;
}
LABEL_32:
*a3 = v6;
return v3;
}Referenced by:
MiMirrorBrownPhase