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