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