MiBuildMdlForMappedFileFault

NTSTATUS __stdcall MiBuildMdlForMappedFileFault(
        _MMINPAGE_SUPPORT *InPageSupport,
        _MMPTE *BottomPte,
        _MMPTE *EndPte,
        _MI_PARTITION *Partition,
        UINT64 CommitPages,
        UINT64 PageFrameIndex,
        UINT64 ProtectionMask,
        _MI_FAULT_VA_LIST *FaultHead,
        _MI_COLOR_BASE *ColorBase){
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v9; 
  unsigned int v12; 
  _MMPTE *i; 
  __int64 v14; 
  UINT64 v15; 
  _MMPFN *PfnDb; 
  _MMPFN *v17; 
  __int64 v18; 
  unsigned __int64 Long; 
  INT64 v20; 
  NTSTATUS result; 
  unsigned int v22; 
  _MI_PFN_CACHE_ATTRIBUTE v23; 
  UINT64 v24; 
  unsigned int v25; 
  unsigned int SizeOfBitMap; 
  _QWORD *v27; 
  _MMPTE *v28; 
  unsigned int v29; 
  unsigned int v30; 
  unsigned int *v31; 
  unsigned int *v32; 
  __int64 v33; 
  unsigned int *v34; 
  unsigned int v35; 
  __int64 v36; 
  _MMPTE *v37; 
  INT64 v38; 
  __int16 v39; 
  _MI_PARTITION *v40; 
  __int64 v41; 
  _MI_FAULT_VA_LIST *v42; 
  INT64 v43; 
  __int64 v44; 
  __int64 v45; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v46; 
  __int64 v47; 
  int v48; 
  INT64 v49; 
  unsigned int v50; 
  INT64 v51; 
  __int64 v52; 
  unsigned int v53; 
  _MI_PARTITION *v54; 
  UINT64 v55; 
  UINT64 v56; 
  unsigned __int64 v57; 
  __int64 v58; 
  _MI_PFN_CACHE_ATTRIBUTE v59; 
  NTSTATUS v60; 
  INT64 v61; 
  _MMPFN *v62; 
  _MMPTE *PointerPte; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v64; 
  _RTL_BITMAP BitMapHeader; 
  __int128 v66[4]; 
  __int64 v67; 

  v9.Long = (unsigned __int64)InPageSupport->PteContents.u;
  v61 = (INT64)FaultHead;
  v58 = v67;
  PointerPte = InPageSupport->PointerPte;
  v56 = (UINT64)InPageSupport;
  BitMapHeader.Buffer = (unsigned int *)v66;
  v54 = Partition;
  v57 = (unsigned __int64)BottomPte;
  *(_QWORD *)&BitMapHeader.SizeOfBitMap = 512i64;
  memset(v66, 0, sizeof(v66));
  v64.Long = v9.Long;
  RtlSetAllBits(&BitMapHeader);
  v62 = 0i64;
  v12 = 0;
  for( i = BottomPte; i <= EndPte; ++i )
  {
    LODWORD(v14) = MI_READ_PTE_LOCK_FREE((INT64)i);
    if( v14 == v9.Long )
    {
      _bittestandreset((signed __int32 *)BitMapHeader.Buffer, ((unsigned int)i >> 3) & 0x1FF);
      ++v12;
    }
  }
  v15 = (unsigned int)CommitPages;
  PfnDb = MmGetPfnDb();
  if( v12 <= (unsigned __int64)(unsigned int)CommitPages )
    v15 = v12;
  if( PageFrameIndex == -1i64 )
  {
    v51 = 0i64;
    v18 = 0i64;
  }
  else
  {
    v17 = &PfnDb[PageFrameIndex];
    MiSetPfnBlink(v17, 0xFFFFFFFFFui64, 0i64);
    PfnDb = MmGetPfnDb();
    v51 = (INT64)v17;
    v18 = 1i64;
  }
  v52 = v18;
  if( v18 == v15 )
  {
    v20 = v61;
  }
  else
  {
    Long = v9.Long;
    if( (v9.Long & 0x400) == 0 )
    {
      if( *(&stru_140C4DB30 + 42) && (v9.Long & 0x10) == 0 )
        Long = v9.Long & ~*(&stru_140C4DB30 + 42);
      v62 = &PfnDb[(Long >> 12) & 0xFFFFFFFFFi64];
      Long = v62->OriginalPte.u.Long;
    }
    v20 = v61;
    MiGetHardFaultPages((INT64)&v51, v15, v54, v61, (INT64)ColorBase, v56, Long);
    v18 = v52;
  }
  if( v18 == v12 )
    goto LABEL_26;
  if( v18 )
  {
    v22 = ((unsigned int)PointerPte >> 3) & 0x1FF;
    if( v18 != v12 - MiReduceMappedFileReadBehind(&BitMapHeader, v22) )
      MiReduceMappedFileReadAhead(&BitMapHeader, v22);
LABEL_26:
    v60 = v18;
    v23 = MiProtectionToCacheAttribute((unsigned int)ProtectionMask);
    v24 = v56;
    v25 = 0;
    SizeOfBitMap = BitMapHeader.SizeOfBitMap;
    v59 = v23;
    v27 = (_QWORD *)(v56 + 320);
    v55 = v56 + 320;
    if( !BitMapHeader.SizeOfBitMap )
    {
LABEL_80:
      result = v60;
      *(_DWORD *)(v24 + 184) = (unsigned int)((__int64)((__int64)v27 - v24 - 320) >> 3) << 12;
      return result;
    }
    v28 = (_MMPTE *)(v57 & 0xFFFFFFFFFFFFF000ui64);
    v57 &= 0xFFFFFFFFFFFFF000ui64;
    while( 1 )
    {
      v50 = v25;
      v29 = v25;
      if( SizeOfBitMap > v25 )
        break;
      v30 = 0;
LABEL_52:
      v53 = v30;
      if( v25 )
      {
        if( v29 != v25 )
        {
          v36 = v29 - v25;
          do
          {
            *v27++ = *(&stru_140C4DB30 + 497);
            --v36;
          }
          while( v36 );
          v55 = (UINT64)v27;
        }
        *(_DWORD *)(v24 + 192) |= 0x20000u;
      }
      v37 = &v28[v29];
      RtlSetBits(&BitMapHeader, v29, v30);
      if( v30 )
      {
        v38 = v56;
        v39 = v9.Long;
        v9.Long = v55;
        v40 = (_MI_PARTITION *)(v39 & 0x400);
        v41 = v30;
        v42 = (_MI_FAULT_VA_LIST *)v61;
        v54 = (_MI_PARTITION *)(unsigned int)v40;
        v58 = v41;
        do
        {
          v43 = v51;
          v44 = *(_QWORD *)(v51 + 24) & 0xFFFFFFFFFi64;
          if( v44 == 0xFFFFFFFFFi64 )
            v51 = 0i64;
          else
            v51 = (INT64)&MmGetPfnDb()[v44];
          v52 = --v18;
          v45 = (v43 - (__int64)MmGetPfnDb()) / 48;
          *(_QWORD *)v9.Long = v45;
          v9.Long += 8i64;
          if( v40 )
            LODWORD(v46.Long) = MI_READ_PTE_LOCK_FREE((INT64)v37);
          else
            v46.Long = (unsigned __int64)v62->OriginalPte.u;
          *(union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} *)(v43 + 16) = (union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;})v46.Long;
          if( v42 )
            MiAdvanceFaultList(v42);
          LODWORD(v49) = v59;
          MiInitializeHardFaultPfn(v43, v38, (UINT64)v37, v37 == PointerPte, v49);
          v40 = v54;
          if( v54 )
          {
            v47 = MiSwizzleInvalidPte(32 * (ProtectionMask & 0x1F | ((v45 & 0xFFFFFFFFFi64) << 7) | 0x40));
            LOBYTE(v48) = MiPteInShadowRange((UINT64)v37);
            if( v48 )
            {
              if( (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v47 & 1) != 0 )
                v47 |= 0x8000000000000000ui64;
              v18 = v52;
            }
            v37->u.Long = v47;
            v40 = v54;
          }
          ++v37;
          --v58;
        }
        while( v58 );
        v30 = v53;
        v29 = v50;
        v24 = v56;
        v55 = v9.Long;
        v27 = (_QWORD *)v9.Long;
        LOWORD(v9.Long) = v64.Long;
      }
      if( v18 )
      {
        SizeOfBitMap = BitMapHeader.SizeOfBitMap;
        v25 = v30 + v29;
        v28 = (_MMPTE *)v57;
        if( v30 + v29 != BitMapHeader.SizeOfBitMap )
          continue;
      }
      goto LABEL_80;
    }
    v31 = &BitMapHeader.Buffer[(unsigned __int64)(SizeOfBitMap - 1) >> 5];
    v32 = &BitMapHeader.Buffer[(unsigned __int64)v25 >> 5];
    if( v32 != v31 )
    {
      v33 = v25 & 0x1F;
      if( (*v32 | *((_DWORD *)qword_140011CE0 + v33)) == -1 )
      {
        ++v32;
        v29 = v25 - v33 + 32;
        v50 = v29;
        if( v32 < v31 )
        {
          do
          {
            if( *v32 != -1 )
              break;
            ++v32;
            v29 += 32;
          }
          while( v32 < v31 );
          v50 = v29;
        }
      }
    }
    if( v29 < SizeOfBitMap )
    {
      do
      {
        SizeOfBitMap = BitMapHeader.SizeOfBitMap;
        if( !_bittest((const signed __int32 *)BitMapHeader.Buffer, v29) )
          break;
        v50 = ++v29;
      }
      while( v29 < BitMapHeader.SizeOfBitMap );
    }
    v30 = 0;
    if( v32 != v31 )
    {
      if( (~*((_DWORD *)qword_140011CE0 + (v29 & 0x1F)) & *v32) == 0 )
      {
        v30 = 32 - (v29 & 0x1F);
        if( v30 == -1 )
        {
LABEL_62:
          v18 = v52;
LABEL_51:
          v28 = (_MMPTE *)v57;
          goto LABEL_52;
        }
        v34 = v32 + 1;
        while( v34 < v31 )
        {
          if( *v34 )
            break;
          ++v34;
          v30 += 32;
          if( v30 == -1 )
            goto LABEL_62;
        }
      }
      v18 = v52;
      SizeOfBitMap = BitMapHeader.SizeOfBitMap;
    }
    v35 = v30 + v29;
    if( v30 + v29 < SizeOfBitMap )
    {
      do
      {
        if( _bittest((const signed __int32 *)BitMapHeader.Buffer, v35) )
          break;
        if( v30 == -1 )
          break;
        ++v35;
        ++v30;
      }
      while( v35 < BitMapHeader.SizeOfBitMap );
    }
    goto LABEL_51;
  }
  if( v20 )
  {
    if( !*((_QWORD *)ColorBase + 15) )
      *(_BYTE *)(v20 + 1) = 2;
  }
  return 0;
}

Referenced by:

MiResolveMappedFileFault