MiBuildMdlForMappedFileFault

VOID __fastcall MiBuildMdlForMappedFileFault(
        INT64 rcx0,
        INT64 a2,
        UINT64 r8,
        _MI_PARTITION *r9,
        UINT64 a5,
        INT64 a6,
        UINT64 ProtectionMask,
        INT64 a8,
        INT64 a9,
        INT64 a10){
  __int64 v10; 
  unsigned int v13; 
  UINT64 i; 
  UINT64 v15; 
  _MMPFN *PfnDb; 
  _MMPFN *v17; 
  __int64 v18; 
  unsigned __int64 v19; 
  INT64 v20; 
  unsigned int v21; 
  int v22; 
  UINT64 v23; 
  unsigned int v24; 
  unsigned int SizeOfBitMap; 
  _QWORD *v26; 
  unsigned __int64 v27; 
  unsigned int v28; 
  unsigned int v29; 
  unsigned int *v30; 
  unsigned int *v31; 
  __int64 v32; 
  unsigned int *v33; 
  unsigned int v34; 
  __int64 v35; 
  INT64 *v36; 
  INT64 v37; 
  __int16 v38; 
  _MI_PARTITION *v39; 
  INT64 v40; 
  _QWORD *v41; 
  INT64 v42; 
  __int64 v43; 
  __int64 v44; 
  INT64 v45; 
  INT64 v46; 
  unsigned int v47; 
  INT64 v48; 
  __int64 v49; 
  unsigned int v50; 
  _MI_PARTITION *v51; 
  UINT64 v52; 
  UINT64 v53; 
  INT64 v54; 
  INT64 v55; 
  int v56; 
  int v57; 
  INT64 v58; 
  __int64 v59; 
  INT64 *v60; 
  __int64 v61; 
  struct _RTL_BITMAP BitMapHeader; 
  __int128 v63[4]; 
  v10 = *(_QWORD *)(rcx0 + 168);
  v58 = a8;
  v55 = a10;
  v60 = *(INT64 **)(rcx0 + 232);
  v53 = rcx0;
  BitMapHeader.Buffer = (unsigned int *)v63;
  v51 = r9;
  v54 = a2;
  *(_QWORD *)&BitMapHeader.SizeOfBitMap = 512i64;
  memset(v63, 0, sizeof(v63));
  v61 = v10;
  RtlSetAllBits(&BitMapHeader);
  v59 = 0i64;
  v13 = 0;
  for( i = a2; i <= r8; i += 8i64 )
  {
    if( MI_READ_PTE_LOCK_FREE(i) == v10 )
    {
      _bittestandreset((signed __int32 *)BitMapHeader.Buffer, ((unsigned int)i >> 3) & 0x1FF);
      ++v13;
    }
  }
  v15 = (unsigned int)a5;
  PfnDb = MmGetPfnDb();
  if( v13 <= (unsigned __int64)(unsigned int)a5 )
    v15 = v13;
  if( a6 == -1 )
  {
    v48 = 0i64;
    v18 = 0i64;
  }
  else
  {
    v17 = (_MMPFN *)((char *)PfnDb + 48 * a6);
    MiSetPfnBlink(v17, 0xFFFFFFFFFui64, 0i64);
    PfnDb = MmGetPfnDb();
    v48 = (INT64)v17;
    v18 = 1i64;
  }
  v49 = v18;
  if( v18 == v15 )
  {
    v20 = v58;
  }
  else
  {
    v19 = v10;
    if( (v10 & 0x400) == 0 )
    {
      if( qword_140C4DC80 && (v10 & 0x10) == 0 )
        v19 = v10 & ~qword_140C4DC80;
      v59 = (__int64)PfnDb + 48 * ((v19 >> 12) & 0xFFFFFFFFFi64);
      v19 = *(_QWORD *)(v59 + 16);
    }
    v20 = v58;
    MiGetHardFaultPages((INT64)&v48, v15, v51, v58, a9, v53, v19);
    v18 = v49;
  }
  if( v18 == v13 )
    goto LABEL_26;
  if( v18 )
  {
    v21 = ((unsigned int)v60 >> 3) & 0x1FF;
    if( v18 != v13 - MiReduceMappedFileReadBehind(&BitMapHeader, v21) )
      MiReduceMappedFileReadAhead(&BitMapHeader, v21);
LABEL_26:
    v57 = v18;
    v22 = MiProtectionToCacheAttribute((unsigned int)ProtectionMask);
    v23 = v53;
    v24 = 0;
    SizeOfBitMap = BitMapHeader.SizeOfBitMap;
    v56 = v22;
    v26 = (_QWORD *)(v53 + 320);
    v52 = v53 + 320;
    if( !BitMapHeader.SizeOfBitMap )
    {
LABEL_75:
      *(_DWORD *)(v23 + 184) = (unsigned int)((__int64)((__int64)v26 - v23 - 320) >> 3) << 12;
      return;
    }
    v27 = v54 & 0xFFFFFFFFFFFFF000ui64;
    v54 &= 0xFFFFFFFFFFFFF000ui64;
    while( 1 )
    {
      v47 = v24;
      v28 = v24;
      if( SizeOfBitMap > v24 )
        break;
      v29 = 0;
LABEL_52:
      v50 = v29;
      if( v24 )
      {
        if( v28 != v24 )
        {
          v35 = v28 - v24;
          do
          {
            *v26++ = qword_140C4EAB8;
            --v35;
          }
          while( v35 );
          v52 = (UINT64)v26;
        }
        *(_DWORD *)(v23 + 192) |= 0x20000u;
      }
      v36 = (INT64 *)(v27 + 8i64 * v28);
      RtlSetBits(&BitMapHeader, v28, v29);
      if( v29 )
      {
        v37 = v53;
        v38 = v10;
        v10 = v52;
        v39 = (_MI_PARTITION *)(v38 & 0x400);
        v40 = v29;
        v41 = (_QWORD *)v58;
        v51 = (_MI_PARTITION *)(unsigned int)v39;
        v55 = v40;
        do
        {
          v42 = v48;
          v43 = *(_QWORD *)(v48 + 24) & 0xFFFFFFFFFi64;
          if( v43 == 0xFFFFFFFFFi64 )
            v48 = 0i64;
          else
            v48 = (INT64)MmGetPfnDb() + 48 * v43;
          v49 = --v18;
          v44 = (v42 - (__int64)MmGetPfnDb()) / 48;
          *(_QWORD *)v10 = v44;
          v10 += 8i64;
          if( v39 )
            v45 = MI_READ_PTE_LOCK_FREE((INT64)v36);
          else
            v45 = *(_QWORD *)(v59 + 16);
          *(_QWORD *)(v42 + 16) = v45;
          if( v41 )
            MiAdvanceFaultList(v41);
          LODWORD(v46) = v56;
          MiInitializeHardFaultPfn(v42, v37, (UINT64)v36, v36 == v60, v46);
          v39 = v51;
          if( v51 )
          {
            *v36 = MiSwizzleInvalidPte(32 * (ProtectionMask & 0x1F | ((v44 & 0xFFFFFFFFFi64) << 7) | 0x40));
            v39 = v51;
          }
          ++v36;
          --v55;
        }
        while( v55 );
        v29 = v50;
        v28 = v47;
        v23 = v53;
        v52 = v10;
        v26 = (_QWORD *)v10;
        LOWORD(v10) = v61;
      }
      if( v18 )
      {
        SizeOfBitMap = BitMapHeader.SizeOfBitMap;
        v24 = v29 + v28;
        v27 = v54;
        if( v29 + v28 != BitMapHeader.SizeOfBitMap )
          continue;
      }
      goto LABEL_75;
    }
    v30 = &BitMapHeader.Buffer[(unsigned __int64)(SizeOfBitMap - 1) >> 5];
    v31 = &BitMapHeader.Buffer[(unsigned __int64)v24 >> 5];
    if( v31 != v30 )
    {
      v32 = v24 & 0x1F;
      if( (*v31 | *((_DWORD *)qword_140011CE0 + v32)) == -1 )
      {
        ++v31;
        v28 = v24 - v32 + 32;
        v47 = v28;
        if( v31 < v30 )
        {
          do
          {
            if( *v31 != -1 )
              break;
            ++v31;
            v28 += 32;
          }
          while( v31 < v30 );
          v47 = v28;
        }
      }
    }
    if( v28 < SizeOfBitMap )
    {
      do
      {
        SizeOfBitMap = BitMapHeader.SizeOfBitMap;
        if( !_bittest((const signed __int32 *)BitMapHeader.Buffer, v28) )
          break;
        v47 = ++v28;
      }
      while( v28 < BitMapHeader.SizeOfBitMap );
    }
    v29 = 0;
    if( v31 != v30 )
    {
      if( (~*((_DWORD *)qword_140011CE0 + (v28 & 0x1F)) & *v31) == 0 )
      {
        v29 = 32 - (v28 & 0x1F);
        if( v29 == -1 )
        {
LABEL_62:
          v18 = v49;
LABEL_51:
          v27 = v54;
          goto LABEL_52;
        }
        v33 = v31 + 1;
        while( v33 < v30 )
        {
          if( *v33 )
            break;
          ++v33;
          v29 += 32;
          if( v29 == -1 )
            goto LABEL_62;
        }
      }
      v18 = v49;
      SizeOfBitMap = BitMapHeader.SizeOfBitMap;
    }
    v34 = v29 + v28;
    if( v29 + v28 < SizeOfBitMap )
    {
      do
      {
        if( _bittest((const signed __int32 *)BitMapHeader.Buffer, v34) )
          break;
        if( v29 == -1 )
          break;
        ++v34;
        ++v29;
      }
      while( v34 < BitMapHeader.SizeOfBitMap );
    }
    goto LABEL_51;
  }
  if( v20 )
  {
    if( !*(_QWORD *)(a9 + 120) )
      *(_BYTE *)(v20 + 1) = 2;
  }
}

Referenced by:

MiResolveMappedFileFault