MiPickClusterForMappedFileFault

INT64 __fastcall MiPickClusterForMappedFileFault(
        INT64 a1,
        INT64 a2,
        INT64 a3,
        UINT64 a4,
        UINT64 a5,
        INT64 a6,
        UINT64 *a7,
        UINT64 *a8){
  __int64 v8; 
  unsigned int v9; 
  __int64 v10; 
  unsigned int v11; 
  unsigned __int64 v12; 
  _ETHREAD *CurrentThread; 
  unsigned int v15; 
  UINT64 v16; 
  unsigned __int64 v17; 
  UINT64 v18; 
  INT64 result; 
  unsigned int v20; 
  int v21; 
  unsigned int v22; 
  unsigned __int64 i; 
  UINT64 v24; 
  unsigned __int64 v25; 
  unsigned __int64 v26; 
  int v27; 
  __int64 v28; 
  int v29; 
  __int64 v30; 
  __int64 v31; 
  v8 = *(_QWORD *)(a2 + 208);
  v9 = 0;
  v10 = *(_QWORD *)(a2 + 168);
  v11 = 1;
  v12 = *(_QWORD *)(a2 + 232);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v15 = 1;
  v31 = *(_QWORD *)v8;
  if( (v10 & 0x400) == 0 )
    goto LABEL_5;
  if( *((_BYTE *)CurrentThread + 1309) )
    goto LABEL_5;
  v29 = *(_DWORD *)(*(_QWORD *)v8 + 56i64);
  if( (v29 & 8) != 0 && *((_BYTE *)CurrentThread + 1308) != 2 )
    goto LABEL_5;
  if( *(__int64 *)(a1 + 7168) < 160 )
    goto LABEL_5;
  if( dword_140C4EA00 )
  {
    --dword_140C4EA00;
LABEL_5:
    v16 = v12;
    v17 = v12;
    goto LABEL_6;
  }
  if( !(unsigned int)MiSufficientAvailablePages(a1, 0x140ui64) )
    goto LABEL_5;
  v20 = *(_DWORD *)(a2 + 184);
  if( v20 == 1 )
    goto LABEL_5;
  v17 = a4 - 8 + 8 * (*(unsigned int *)(v8 + 44) - (unsigned __int64)(*(_DWORD *)(v8 + 52) & 0x3FFFFFFF));
  v21 = v29;
  if( !a3 )
  {
    if( (v29 & 0x20) != 0 )
    {
      v20 = 4;
      if( (*(_BYTE *)(v8 + 32) & 4) != 0 )
        v20 = 8;
    }
    else if( !v20 )
    {
      v20 = *((_DWORD *)CurrentThread + 322) + 1;
    }
  }
  v30 = 8i64 * v20;
  if( v17 > v12 + v30 - 8 )
    v17 = v12 + v30 - 8;
  if( !a3 && (v21 & 0x20000000) != 0 )
  {
    v22 = MiStartingOffset(v8, v12, a5);
    v27 = v22 & (dword_140C4EA90 - 1);
    if( v17 > v12 + 8 * (((unsigned int)(dword_140C4EA90 - v27) >> 12) - 1i64) )
      v17 = v12 + 8 * (((unsigned int)(dword_140C4EA90 - v27) >> 12) - 1i64);
  }
  else
  {
    v22 = 0;
  }
  if( v17 > (v12 & 0xFFFFFFFFFFFFF000ui64 | 0xFF8) )
    v17 = v12 & 0xFFFFFFFFFFFFF000ui64 | 0xFF8;
  for( i = v17; i > v12; i -= 8i64 )
  {
    if( MI_READ_PTE_LOCK_FREE(i) == v10 )
    {
      ++v15;
    }
    else if( i == v17 )
    {
      v17 -= 8i64;
    }
  }
  v24 = v17 - v30 + 8;
  if( v24 < a4 )
    v24 = a4;
  v25 = v12 & 0xFFFFFFFFFFFFF000ui64;
  if( v24 >= (v12 & 0xFFFFFFFFFFFFF000ui64) )
    v25 = v24;
  if( a3 || (*(_DWORD *)(a2 + 192) & 0x40) != 0 )
  {
    v26 = v12;
  }
  else
  {
    v26 = v25;
    if( (*(_DWORD *)(v31 + 56) & 0x20000000) != 0 )
    {
      v28 = (v22 >> 12) & ((unsigned int)(dword_140C4EA90 - 1) >> 12);
      if( v25 < v12 - 8 * v28 )
        v26 = v12 - 8i64 * (unsigned int)v28;
    }
  }
  v16 = v26;
  while( v26 < v12 )
  {
    if( MI_READ_PTE_LOCK_FREE(v26) == v10 )
    {
      ++v15;
    }
    else if( v26 == v16 )
    {
      v16 += 8i64;
    }
    v26 += 8i64;
  }
LABEL_6:
  v18 = v15 - 1;
  if( a6 == -1 )
    v18 = v15;
  if( (_DWORD)v18 )
  {
    if( a6 == -1 )
      v11 = 3;
    v9 = MiObtainFaultCharges((_MI_PARTITION *)a1, v18, v11);
  }
  result = v9 + 1;
  if( a6 == -1 )
    result = v9;
  *a7 = v16;
  *a8 = v17;
  return result;
}

Referenced by:

MiResolveMappedFileFault