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