MiFinishMdlForMappedFileFault
VOID __fastcall MiFinishMdlForMappedFileFault(
_MMINPAGE_SUPPORT *InPageSupport,
VOID *TrapInformation,
UINT64 CommitPages,
_MMPFN *TransitionPfn,
UINT64 SessionId){
_CONTROL_AREA **v5;
__int64 v7;
__int64 v9;
_CONTROL_AREA *v11;
INT64 v12;
unsigned __int64 v13;
INT64 v14;
unsigned int v15;
unsigned __int64 v16;
UINT64 v17;
int v18;
char v19;
int v20;
char v21;
char *v22;
__int64 v23;
int v24;
__int64 v25;
char *v26;
__int16 v27;
char v28;
UINT64 SpinCount;
unsigned __int64 v30;
UINT64 v31;
INT64 v32;
v5 = (_CONTROL_AREA **)*((_QWORD *)InPageSupport + 26);
v7 = *((unsigned int *)InPageSupport + 46);
v9 = (unsigned int)CommitPages;
v11 = *v5;
MiReferenceControlAreaPfn(*v5, (_SUBSECTION *)v5, CommitPages);
v12 = *((_QWORD *)InPageSupport + 20);
MiObtainProtoReference(v12, 0);
LODWORD(v31) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v12 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&v31);
while( *(__int64 *)(v12 + 24) < 0 );
}
*(_QWORD *)(v12 + 24) ^= ((*(_QWORD *)(v12 + 24) + v9) ^ *(_QWORD *)(v12 + 24)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)(v12 + 24), 0x7FFFFFFFFFFFFFFFui64);
v13 = *((_QWORD *)MmGetPfnDb() + 6 * *((_QWORD *)InPageSupport + 40) + 1) | 0x8000000000000000ui64;
v30 = v13;
if( TransitionPfn )
MiFlowThroughInsertNode(InPageSupport, TransitionPfn);
v32 = *((_QWORD *)InPageSupport + 29);
v14 = MI_READ_PTE_LOCK_FREE(v32);
v15 = SessionId;
*((_QWORD *)InPageSupport + 21) = v14;
v16 = MiStartingOffset((__int64)v5, v13, v15);
v17 = MiEndingOffsetWithLock((__int64)v5);
v18 = *((_DWORD *)InPageSupport + 48);
if( (v18 & 0x20000) != 0 )
{
v18 &= ~0x20000u;
v19 = 1;
*((_DWORD *)InPageSupport + 48) = v18;
}
else
{
v19 = 0;
}
v20 = v18;
if( (*((_DWORD *)v11 + 14) & 0x20) != 0 && v16 + v7 > v17 )
{
LODWORD(v7) = (v17 - v16 + 511) & 0xFFFFFE00;
v20 = v18 | 0x20000;
*((_DWORD *)InPageSupport + 48) = v18 | 0x20000;
}
v21 = (char)TrapInformation;
v22 = (char *)((unsigned __int64)TrapInformation & 0xFFFFFFFFFFFFFFFEui64);
v23 = v21 & 1;
if( v23 && (v28 = *v22, *v22 == 1) || v23 && (v28 = *v22, *v22 == 2) )
{
if( v22 && v28 != 2 )
*((_DWORD *)InPageSupport + 48) = v20 | 8;
}
if( (int)PsGetIoPriorityThread((__int64)KeGetCurrentThread()) < 2 )
*((_DWORD *)InPageSupport + 48) = v24 | 0x80;
*((_QWORD *)InPageSupport + 34) = v25;
*((_WORD *)InPageSupport + 141) = v25;
*((_WORD *)InPageSupport + 140) = 8 * ((((unsigned __int64)(unsigned int)v7 + 4095) >> 12) + 6);
*((_QWORD *)InPageSupport + 38) = v25;
*((_DWORD *)InPageSupport + 79) = v25;
*((_DWORD *)InPageSupport + 78) = v7;
LODWORD(SpinCount) = v25;
if( _interlockedbittestandset64((volatile signed __int32 *)(v12 + 24), 0x3Fui64) )
{
do
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)(v12 + 24) < 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)(v12 + 24), 0x3Fui64) );
v13 = v30;
}
*(_BYTE *)(v12 + 34) &= ~0x20u;
MiRemoveLockedPageChargeAndDecRef((_MMPFN *)v12);
_InterlockedAnd64((volatile signed __int64 *)(v12 + 24), 0x7FFFFFFFFFFFFFFFui64);
v26 = (char *)MmGetPfnDb() + 48 * *((_QWORD *)InPageSupport + ((__int64)(v32 - v13) >> 3) + 40);
v27 = *((_WORD *)InPageSupport + 141) | 0x42;
*((_WORD *)InPageSupport + 141) = v27;
if( !v19 )
*((_WORD *)InPageSupport + 141) = v27 | 0x4000;
*((_QWORD *)InPageSupport + 12) = v16;
*((_QWORD *)InPageSupport + 30) = v13;
*((_QWORD *)InPageSupport + 31) = v26;
*((_QWORD *)InPageSupport + 25) = 0i64;
*((_QWORD *)InPageSupport + 26) = v11;
}Referenced by:
MiResolveMappedFileFault