MiBuildMappedCluster

_MDL *__stdcall MiBuildMappedCluster(_MMPFN *Pfn1, _MDL *Mdl, _NOTIFY_MAPPED_WRITE_STATUS CcStatus){
  _NOTIFY_MAPPED_WRITE_STATUS v3; 
  _MDL *v4; 
  _LIST_ENTRY *Blink; 
  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;} v6; 
  unsigned __int64 EntireField; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  char *v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  INT64 v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  int v23; 
  unsigned __int64 v24; 
  UINT8 v25; 
  __int64 v26; 
  bool v27; 
  unsigned __int64 v28; 
  unsigned __int64 v29; 
  _MDL *result; 
  unsigned __int64 v31; 
  _MMPFN *v32; 
  __int64 v33; 
  char *v34; 
  _MI_RESAVAIL_CHARGE v35; 
  _MMPFN *PfnDb; 
  unsigned __int64 v37; 
  unsigned __int64 v38; 
  unsigned __int64 v39; 
  unsigned __int64 v40; 
  char *Pool; 
  _MDL *v42; 
  __int64 *v43; 
  VOID *v44; 
  INT64 v45; 
  unsigned __int64 v46; 
  _MMPFN *v47; 
  __int64 v48; 
  _MI_RESAVAIL_CHARGE v49; 
  _MDL *Next; 
  UINT8 v51; 
  unsigned __int64 v52; 
  __int64 v53; 
  _MI_RESAVAIL_CHARGE v54; 
  __int64 v55; 
  _MDL *v56; 
  _MDL *v57; 
  _MMPFN *v58; 
  _MMPFN *v59; 
  unsigned __int64 v60; 
  unsigned __int64 v61; 
  _MMPFN *v62; 
  unsigned __int64 v63; 
  unsigned __int64 v64; 
  _MDL *v65; 
  char *VirtualAddress; 
  unsigned __int64 v67; 
  unsigned __int64 v68; 
  unsigned __int64 v69; 
  unsigned __int64 v70; 
  _MDL *v71; 
  _MI_PARTITION *Partition; 
  __int64 v73; 
  unsigned __int64 v74; 
  UINT64 SpinCount; 
  UINT64 PageFrameIndex; 
  _MDL *v77; 
  unsigned __int64 v78; 
  _MDL *v79; 
  _MDL *v82; 
  _MI_RESAVAIL_CHARGE v84; 
  _MI_RESAVAIL_CHARGE v85; 
  UINT8 OldIrql; 

  v3 = CcStatus;
  OldIrql = 0;
  v4 = Mdl;
  Blink = Pfn1->ListEntry.Blink;
  v6.Long = (unsigned __int64)Pfn1->OriginalPte.u;
  EntireField = Pfn1->u4.EntireField;
  v8 = (__int64)((unsigned __int128)(((char *)Pfn1 - (char *)MmGetPfnDb()) * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64) >> 3;
  v79 = Mdl + 1;
  v65 = Mdl + 1;
  v9 = (unsigned __int64)Blink | 0x8000000000000000ui64;
  v77 = (_MDL *)((v8 >> 63) + v8);
  v70 = v9;
  v10 = v9 & 0xFFFFFFFFFFFFF000ui64;
  v69 = v9;
  Partition = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * ((EntireField >> 39) & 0x3FF));
  if( *(&stru_140C4DB30 + 42) && (v6.Long & 0x10) == 0 )
    v6.Long &= ~*(&stru_140C4DB30 + 42);
  v11 = v6.Hard._bf_0 >> 16;
  v73 = v11;
  if( v10 < *(_QWORD *)(v11 + 8) )
    v10 = *(_QWORD *)(v11 + 8);
  v12 = v10;
  if( v10 < v9 - 120 )
    v12 = v9 - 120;
  PageFrameIndex = EntireField & 0xFFFFFFFFFi64;
  VirtualAddress = (char *)MiMapPageInHyperSpaceWorker(EntireField & 0xFFFFFFFFFi64, &OldIrql, 0x80000000ui64);
  LODWORD(v78) = v9;
  v13 = (unsigned __int64)&VirtualAddress[v9 & 0xFFF];
  v67 = v9;
  v14 = v9;
  v15 = VirtualAddress;
  v16 = v9;
  if( v3 )
    v14 = v10;
  if( v9 > v14 )
  {
    PfnDb = MmGetPfnDb();
    do
    {
      v13 -= 8i64;
      v37 = v16;
      v38 = *(_QWORD *)v13;
      if( (*(_QWORD *)v13 & 0xC01i64) != 2048
        || (PfnDb[((v38 & ~*(&stru_140C4DB30 + 42)) >> 12) & 0xFFFFFFFFFi64].u4._bf_0 & 0x4000000000000i64) == 0
        || (*(_BYTE *)(&PfnDb[((v38 & ~*(&stru_140C4DB30 + 42)) >> 12) & 0xFFFFFFFFFi64].u3 + 1) & 0x10) == 0
        || PfnDb[((v38 & ~*(&stru_140C4DB30 + 42)) >> 12) & 0xFFFFFFFFFi64].u3.ReferenceCount
        || Partition != *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267)
                                          + 8
                                          * (((unsigned __int64)PfnDb[((v38 & ~*(&stru_140C4DB30 + 42)) >> 12) & 0xFFFFFFFFFi64].u4._bf_0 >> 39) & 0x3FF)) )
      {
        break;
      }
      v9 -= 8i64;
      v16 = v9;
      if( v9 < v12 )
        v16 = v37;
    }
    while( v9 > v14 );
    v11 = v73;
    v4 = Mdl;
    v3 = CcStatus;
    v15 = VirtualAddress;
    v67 = v16;
    v70 = v9;
  }
  v17 = *(unsigned int *)(v11 + 44);
  v18 = ((unsigned __int16)v13 ^ (unsigned __int16)v16) & 0xFFF ^ v13;
  v19 = (v16 & 0xFFFFFFFFFFFFF000ui64) + 4096;
  if( v19 > *(_QWORD *)(v11 + 8) + 8 * v17 )
    v19 = *(_QWORD *)(v11 + 8) + 8 * v17;
  v74 = v19;
  v20 = v19;
  if( v19 > v16 + 128 )
    v20 = v16 + 128;
  if( !v3 )
  {
    v19 = v16 + 8;
    v74 = v16 + 8;
  }
  v68 = v16;
  v21 = v16 + 8;
  if( v3 )
    v21 = v20;
  v22 = v16;
  v64 = v21;
  v23 = 1;
  v84 = MiChargedLocal;
  if( v16 < v19 )
  {
    v24 = v69;
    v64 = v21;
    while( v22 == v24 )
    {
      v65->Next = v77;
      v65 = (_MDL *)((char *)v65 + 8);
LABEL_23:
      v22 += 8i64;
      v18 += 8i64;
      v68 = v22;
      if( v22 >= v19 )
        goto LABEL_24;
    }
    if( v23 != 3 || (__int64)(((char *)v65 - (char *)v4 - 48) & 0xFFFFFFFFFFFFFFF8ui64) < 128 )
    {
      v31 = *(_QWORD *)v18;
      if( (*(_QWORD *)v18 & 0xC01i64) == 2048 )
      {
        if( (MmGetPfnDb()[((v31 & ~*(&stru_140C4DB30 + 42)) >> 12) & 0xFFFFFFFFFi64].u4._bf_0 & 0x4000000000000i64) == 0 )
        {
          v24 = v69;
          v18 -= 8i64;
          v22 -= 8i64;
          goto LABEL_43;
        }
        v32 = &MmGetPfnDb()[((v31 & ~*(&stru_140C4DB30 + 42)) >> 12) & 0xFFFFFFFFFi64];
        LODWORD(SpinCount) = 0;
        while( _interlockedbittestandset64((volatile signed __int32 *)&v32->u2, 0x3Fui64) )
        {
          do
            KeYieldProcessorEx(&SpinCount);
          while( v32->u2._bf_0 < 0 );
        }
        LODWORD(v33) = MI_READ_PTE_LOCK_FREE(v18);
        if( v31 != v33 )
        {
          _InterlockedAnd64(&v32->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          v15 = VirtualAddress;
          v18 -= 8i64;
          v24 = v69;
          v22 -= 8i64;
          v21 = v64;
          goto LABEL_43;
        }
        if( (*(_BYTE *)(&v32->u3 + 1) & 0x10) != 0
          && !v32->u3.ReferenceCount
          && Partition == *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267)
                                            + 8 * (((unsigned __int64)v32->u4._bf_0 >> 39) & 0x3FF)) )
        {
          if( v22 >= v64 )
          {
LABEL_42:
            _InterlockedAnd64(&v32->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
            v15 = VirtualAddress;
            v24 = v69;
            v21 = v64;
LABEL_43:
            v23 = v84;
            goto LABEL_23;
          }
          if( VirtualAddress )
          {
            MiUnmapPageInHyperSpaceWorker(VirtualAddress, 2u, 0x80000000ui64);
            v84 = MiReferencePageForModifiedWrite(v32, 0i64);
            v34 = (char *)MiMapPageInHyperSpaceWorker(PageFrameIndex, 0i64, 0x80000000ui64);
            v35 = v84;
            v18 = (INT64)&v34[v18 & 0xFFF];
            VirtualAddress = v34;
            v15 = v34;
          }
          else
          {
            v54 = MiReferencePageForModifiedWrite(v32, 0i64);
            v15 = 0i64;
            v35 = v54;
            v84 = v54;
          }
          if( v35 )
          {
            v65->Next = (_MDL *)(((v31 & ~*(&stru_140C4DB30 + 42)) >> 12) & 0xFFFFFFFFFi64);
            v65 = (_MDL *)((char *)v65 + 8);
            goto LABEL_42;
          }
        }
        else
        {
          v15 = VirtualAddress;
        }
        _InterlockedAnd64(&v32->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
        v21 = v64;
      }
    }
    v25 = OldIrql;
    if( v15 )
    {
      MiUnmapPageInHyperSpaceWorker(v15, OldIrql, 0x80000000ui64);
      v15 = 0i64;
    }
    v39 = v69;
    if( v22 >= v69 )
      goto LABEL_25;
    v55 = ((char *)v65 - (char *)v4 - 48) >> 3;
    if( v55 )
    {
      v56 = v4 + 1;
      if( v65 > &v4[1] )
      {
        v57 = v65;
        v58 = MmGetPfnDb();
        do
        {
          v57 = (_MDL *)((char *)v57 - 8);
          v59 = &v58[(__int64)v57->Next];
          v60 = MiLockPageInline(v59);
          MiWriteCompletePfn(v59);
          _InterlockedAnd64(&v59->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          __writecr8(v60);
        }
        while( v57 > v56 );
        v19 = v74;
        v65 = v57;
        v4 = Mdl;
      }
      MiReleaseWriteInProgressCharges(Partition, v55, 1ui64);
      v39 = v69;
    }
    v21 = v64;
    if( v64 == v67 + 8 )
    {
      v19 = v39 + 8;
      v74 = v39 + 8;
      v21 = v39 + 8;
    }
    else if( v19 > v39 + 128 )
    {
      v21 = v39 + 128;
    }
    v67 = v39;
    v64 = v21;
    v15 = (char *)MiMapPageInHyperSpaceWorker(PageFrameIndex, &OldIrql, 0x80000000ui64);
    VirtualAddress = v15;
    v18 = (INT64)&v15[(v78 & 0xFFF) - 8];
    v24 = v69;
    v22 = v69 - 8;
    goto LABEL_43;
  }
LABEL_24:
  v25 = OldIrql;
LABEL_25:
  if( v15 )
    MiUnmapPageInHyperSpaceWorker(v15, v25, 0x80000000ui64);
  if( v22 <= v64 )
    v21 = v22;
  v26 = (__int64)(v21 - v67) >> 3;
  if( v84 == MiChargedGlobalNowLow )
    goto LABEL_32;
  v27 = v22 <= v64;
  v28 = v70;
  if( v27 && v70 >= v67 )
    goto LABEL_32;
  v40 = v68;
  Pool = (char *)MiAllocatePool(64i64, 8 * ((__int64)(v68 - v70) >> 3) + 48, 0x65576D4Dui64);
  v82 = (_MDL *)Pool;
  v42 = (_MDL *)Pool;
  if( !Pool )
    goto LABEL_32;
  v71 = v79;
  v78 = (unsigned __int64)(Pool + 48);
  v43 = (__int64 *)(Pool + 48);
  v85 = MiChargedLocal;
  v44 = MiMapPageInHyperSpaceWorker(Pfn1->u4._bf_0 & 0xFFFFFFFFFi64, &OldIrql, 0x80000000ui64);
  v45 = (INT64)v44 + (v28 & 0xFFF);
  while( v28 < v40 )
  {
    if( v28 < v64 && v28 >= v67 )
    {
      Next = v71->Next;
      v71 = (_MDL *)((char *)v71 + 8);
      *v43 = (__int64)Next;
      goto LABEL_78;
    }
    if( v85 == MiChargedGlobalNowLow && (__int64)(((char *)v43 - (char *)v42 - 48) & 0xFFFFFFFFFFFFFFF8ui64) >= 128 )
      goto LABEL_90;
    v46 = *(_QWORD *)v45;
    if( (*(_QWORD *)v45 & 0xC01i64) != 2048 )
      goto LABEL_90;
    if( (MmGetPfnDb()[((v46 & ~*(&stru_140C4DB30 + 42)) >> 12) & 0xFFFFFFFFFi64].u4._bf_0 & 0x4000000000000i64) != 0 )
    {
      v47 = &MmGetPfnDb()[((v46 & ~*(&stru_140C4DB30 + 42)) >> 12) & 0xFFFFFFFFFi64];
      HIDWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)&v47->u2, 0x3Fui64) )
      {
        do
          KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
        while( v47->u2._bf_0 < 0 );
      }
      LODWORD(v48) = MI_READ_PTE_LOCK_FREE(v45);
      if( v46 == v48 )
      {
        if( (*(_BYTE *)(&v47->u3 + 1) & 0x10) != 0
          && !v47->u3.ReferenceCount
          && Partition == *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267)
                                            + 8 * (((unsigned __int64)v47->u4._bf_0 >> 39) & 0x3FF)) )
        {
          if( v44 )
          {
            MiUnmapPageInHyperSpaceWorker(v44, 2u, 0x80000000ui64);
            v85 = MiReferencePageForModifiedWrite(v47, 0i64);
            v44 = MiMapPageInHyperSpaceWorker(PageFrameIndex, 0i64, 0x80000000ui64);
            v45 = (INT64)v44 + (v45 & 0xFFF);
            v49 = v85;
          }
          else
          {
            v49 = MiReferencePageForModifiedWrite(v47, 0i64);
            v85 = v49;
          }
          if( v49 )
          {
            *v43 = (v46 >> 12) & (~*(&stru_140C4DB30 + 42) >> 12) & 0xFFFFFFFFFi64;
            _InterlockedAnd64(&v47->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
            v40 = v68;
LABEL_78:
            v45 += 8i64;
            v28 += 8i64;
            ++v43;
            goto LABEL_79;
          }
        }
        _InterlockedAnd64(&v47->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
        v42 = v82;
LABEL_90:
        v51 = OldIrql;
        if( v44 )
        {
          MiUnmapPageInHyperSpaceWorker(v44, OldIrql, 0x80000000ui64);
          v44 = 0i64;
        }
        v52 = v67;
        if( v28 >= v67 )
          goto LABEL_87;
        v53 = ((char *)v43 - (char *)v82 - 48) >> 3;
        v77 = (_MDL *)v53;
        if( v53 )
        {
          v61 = v78;
          if( (unsigned __int64)v43 > v78 )
          {
            do
            {
              v62 = &MmGetPfnDb()[*--v43];
              v63 = MiLockPageInline(v62);
              MiWriteCompletePfn(v62);
              _InterlockedAnd64(&v62->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
              __writecr8(v63);
            }
            while( (unsigned __int64)v43 > v61 );
            v53 = (__int64)v77;
            v52 = v67;
          }
          MiReleaseWriteInProgressCharges(Partition, v53, 1ui64);
        }
        v71 = v79;
        v28 = v52;
        v44 = MiMapPageInHyperSpaceWorker(Pfn1->u4._bf_0 & 0xFFFFFFFFFi64, &OldIrql, 0x80000000ui64);
        v45 = (INT64)v44 + (v52 & 0xFFF);
        goto LABEL_95;
      }
      _InterlockedAnd64(&v47->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    }
LABEL_95:
    v40 = v68;
LABEL_79:
    v42 = v82;
  }
  v51 = OldIrql;
LABEL_87:
  if( v44 )
    MiUnmapPageInHyperSpaceWorker(v44, v51, 0x80000000ui64);
  v4 = v42;
  v26 = ((char *)v43 - (char *)v42 - 48) >> 3;
LABEL_32:
  v29 = v26 << 12;
  v4->Next = 0i64;
  v4->StartVa = 0i64;
  v4->Size = 8 * ((v29 >> 12) + 6);
  v4->MdlFlags = 2;
  result = v4;
  *(_QWORD *)&v4->ByteCount = (unsigned int)v29;
  return result;
}

Referenced by:

MiGatherMappedPages