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