MiFinishMdlForMappedFileFault
VOID __stdcall MiFinishMdlForMappedFileFault(
_MMINPAGE_SUPPORT *InPageSupport,
VOID *TrapInformation,
UINT64 CommitPages,
_MMPFN *TransitionPfn,
UINT64 SessionId){
_SUBSECTION *Subsection;
__int64 ByteCount;
__int64 v9;
_CONTROL_AREA *ControlArea;
_MMPFN *LockedProtoPfn;
_MMPTE *v13;
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;} v14;
UINT64 v15;
_LARGE_INTEGER v16;
_LARGE_INTEGER v17;
unsigned __int64 v18;
__int32 bf_0;
char v20;
int v21;
char v22;
char *v23;
__int64 v24;
int v25;
_MDL *v26;
_MMPFN *v27;
__int16 v28;
char v29;
UINT64 SpinCount;
_MMPTE *v31;
UINT64 v32;
_MMPTE *PointerPte;
Subsection = InPageSupport->Subsection;
ByteCount = InPageSupport->ByteCount;
v9 = (unsigned int)CommitPages;
ControlArea = Subsection->ControlArea;
MiReferenceControlAreaPfn(Subsection->ControlArea, Subsection, CommitPages);
LockedProtoPfn = InPageSupport->LockedProtoPfn;
MiObtainProtoReference(LockedProtoPfn, 0i64);
LODWORD(v32) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&LockedProtoPfn->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v32);
while( LockedProtoPfn->u2._bf_0 < 0 );
}
LockedProtoPfn->u2._bf_0 ^= ((LockedProtoPfn->u2._bf_0 + v9) ^ LockedProtoPfn->u2._bf_0) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64(&LockedProtoPfn->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v13 = (_MMPTE *)(MmGetPfnDb()[InPageSupport->Page[0]].PteLong | 0x8000000000000000ui64);
v31 = v13;
if( TransitionPfn )
MiFlowThroughInsertNode(InPageSupport, TransitionPfn);
PointerPte = InPageSupport->PointerPte;
LODWORD(v14.Long) = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
v15 = (unsigned int)SessionId;
InPageSupport->PteContents.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;})v14.Long;
v16.anonymous_0.LowPart = MiStartingOffset(Subsection, v13, v15);
v17 = v16;
LODWORD(v18) = MiEndingOffsetWithLock(Subsection);
bf_0 = InPageSupport->u1.e1._bf_0;
if( (bf_0 & 0x20000) != 0 )
{
bf_0 &= ~0x20000u;
v20 = 1;
InPageSupport->u1.e1._bf_0 = bf_0;
}
else
{
v20 = 0;
}
v21 = bf_0;
if( (ControlArea->u.LongFlags & 0x20) != 0 && v17.QuadPart + ByteCount > v18 )
{
LODWORD(ByteCount) = (v18 - v17.anonymous_0.LowPart + 511) & 0xFFFFFE00;
v21 = bf_0 | 0x20000;
InPageSupport->u1.e1._bf_0 = bf_0 | 0x20000;
}
v22 = (char)TrapInformation;
v23 = (char *)((unsigned __int64)TrapInformation & 0xFFFFFFFFFFFFFFFEui64);
v24 = v22 & 1;
if( v24 && (v29 = *v23, *v23 == 1) || v24 && (v29 = *v23, *v23 == 2) )
{
if( v23 && v29 != 2 )
InPageSupport->u1.e1._bf_0 = v21 | 8;
}
if( PsGetIoPriorityThread((_ETHREAD *)KeGetCurrentThread()) < IoPriorityNormal )
InPageSupport->u1.e1._bf_0 = v25 | 0x80;
InPageSupport->Mdl.Next = v26;
InPageSupport->Mdl.MdlFlags = (__int16)v26;
InPageSupport->Mdl.Size = 8 * ((((unsigned __int64)(unsigned int)ByteCount + 4095) >> 12) + 6);
InPageSupport->Mdl.StartVa = v26;
InPageSupport->Mdl.ByteOffset = (unsigned int)v26;
InPageSupport->Mdl.ByteCount = ByteCount;
LODWORD(SpinCount) = (_DWORD)v26;
if( _interlockedbittestandset64((volatile signed __int32 *)&LockedProtoPfn->u2, 0x3Fui64) )
{
do
{
do
KeYieldProcessorEx(&SpinCount);
while( LockedProtoPfn->u2._bf_0 < 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)&LockedProtoPfn->u2, 0x3Fui64) );
v13 = v31;
}
*((_BYTE *)&LockedProtoPfn->u3 + 2) &= ~0x20u;
MiRemoveLockedPageChargeAndDecRef(LockedProtoPfn);
_InterlockedAnd64(&LockedProtoPfn->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v27 = &MmGetPfnDb()[InPageSupport->Page[PointerPte - v13]];
v28 = InPageSupport->Mdl.MdlFlags | 0x42;
InPageSupport->Mdl.MdlFlags = v28;
if( !v20 )
InPageSupport->Mdl.MdlFlags = v28 | 0x4000;
InPageSupport->ReadOffset = v17;
InPageSupport->BasePte = v13;
InPageSupport->Pfn = v27;
InPageSupport->FilePointer = 0i64;
InPageSupport->ControlArea = ControlArea;
}Referenced by:
MiResolveMappedFileFault