MiCopyImageExtentContents
NTSTATUS __stdcall MiCopyImageExtentContents(
_MMINPAGE_SUPPORT *InPageSupport,
_SUBSECTION *a2,
_MMPTE *a3,
INT64 a4,
UINT64 SpinCount,
INT64 ProtoPfn,
INT64 a7){
unsigned __int64 v7;
_MMPFN *v12;
unsigned __int64 v13;
unsigned __int64 v14;
__int64 v15;
_CONTROL_AREA *ControlArea;
_MI_FAULT_VA_LIST *v17;
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;} v18;
UINT64 v19;
_LARGE_INTEGER v20;
_LARGE_INTEGER v21;
unsigned __int64 v22;
ULONG_PTR v23;
_MMPFN *v24;
INT64 v26;
_CONTROL_AREA *v27;
v7 = SpinCount;
v12 = &MmGetPfnDb()[SpinCount];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v12->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v12->u2._bf_0 < 0 );
}
LODWORD(v13) = MI_READ_PTE_LOCK_FREE((INT64)a3);
v14 = v13;
if( (v13 & 0x400) != 0 )
{
v15 = -1i64;
}
else
{
if( *(&stru_140C4DB30 + 42) )
{
if( (v13 & 0x10) != 0 )
v14 = v13 & 0xFFFFFFFFFFFFFFEFui64;
else
v14 = ~*(&stru_140C4DB30 + 42) & v13;
}
v15 = (v14 >> 12) & 0xFFFFFFFFFi64;
}
MiInitializeTransitionPfn(v7, a3);
*((_BYTE *)&v12->u3 + 2) = *(_BYTE *)(&v12->u3 + 1) & 0xF8 | 2;
v12->u3.ReferenceCount = 1;
*((_BYTE *)&v12->u3 + 2) |= 0x20u;
v12->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = (unsigned __int64)&InPageSupport->ListHead[1] & -(__int64)(InPageSupport != 0i64);
*((_BYTE *)&v12->u3 + 3) ^= (*((_BYTE *)&v12->u3 + 3) ^ ((unsigned __int32)InPageSupport->u1.e1._bf_0 >> 9)) & 7;
_InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
ControlArea = a2->ControlArea;
v27 = a2->ControlArea;
ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&a2->ControlArea->ControlAreaLock);
++ControlArea->NumberOfPfnReferences;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
if( (a4 & 1) != 0 )
{
v17 = (_MI_FAULT_VA_LIST *)(a4 & 0xFFFFFFFFFFFFFFFEui64);
if( *(_BYTE *)v17 == 1 )
{
MiAdvanceFaultList(v17);
InPageSupport->u1.e1._bf_0 |= 8u;
}
}
LODWORD(v18.Long) = MI_READ_PTE_LOCK_FREE((INT64)a3);
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;})v18.Long;
InPageSupport->PointerPte = a3;
if( PsGetIoPriorityThread((_ETHREAD *)KeGetCurrentThread()) < IoPriorityNormal )
InPageSupport->u1.e1._bf_0 |= 0x80u;
if( a7 )
v19 = *(unsigned int *)(a7 + 64);
else
v19 = 0xFFFFFFFFi64;
v20.anonymous_0.LowPart = MiStartingOffset(a2, a3, v19);
v21 = v20;
LODWORD(v22) = MiEndingOffsetWithLock(a2);
v23 = 4096;
if( v21.QuadPart + 4096 > v22 )
v23 = (v22 - v21.anonymous_0.LowPart + 511) & 0xFFFFFE00;
InPageSupport->BasePte = a3;
InPageSupport->Pfn = v12;
InPageSupport->FilePointer = 0i64;
InPageSupport->ControlArea = v27;
InPageSupport->ReadOffset = v21;
InPageSupport->Mdl.Next = 0i64;
*(_DWORD *)&InPageSupport->Mdl.Size = 4325432;
InPageSupport->Mdl.StartVa = 0i64;
*(_QWORD *)&InPageSupport->Mdl.ByteCount = 4096i64;
InPageSupport->Page[0] = v7;
InPageSupport->IoStatus.Information = 4096i64;
InPageSupport->ByteCount = 4096;
if( v15 != -1 )
MiFlowThroughInsertNode(InPageSupport, &MmGetPfnDb()[v15]);
v24 = (_MMPFN *)ProtoPfn;
MiObtainProtoReference((_MMPFN *)ProtoPfn, 0i64);
InPageSupport->LockedProtoPfn = v24;
MiUnlockProtoPoolPage((ULONG_PTR)v24, 2u);
LODWORD(v26) = 1;
MiFillPageWithImageExtentContents(
(__int64)v27->u2.SeImageStub->u1.ImageFileExtents & 0xFFFFFFF0,
v7,
v21.anonymous_0.LowPart,
v23,
v26);
__incgsdword(0x2E98u);
InPageSupport->IoStatus.Status = 0;
return KeSetEvent((PRKEVENT)&InPageSupport->ListHead[1], 0, 0);
}Referenced by:
MiResolveMappedFileFault