MiCopyImageExtentContents
NTSTATUS __fastcall MiCopyImageExtentContents(
_MMINPAGE_SUPPORT *InPageSupport,
_SUBSECTION *a2,
_MMPTE *a3,
INT64 a4,
INT64 SpinCount,
INT64 a6,
INT64 a7){
INT64 v7;
char *v12;
unsigned __int64 v13;
__int64 v14;
__int64 v15;
_QWORD *v16;
unsigned int v17;
unsigned __int64 v18;
_MMPFN *v19;
UINT64 v20;
__int64 v22;
v7 = SpinCount;
v12 = (char *)MmGetPfnDb() + 48 * SpinCount;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v12 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)&SpinCount);
while( *((__int64 *)v12 + 3) < 0 );
}
v13 = MI_READ_PTE_LOCK_FREE((INT64)a3);
if( (v13 & 0x400) != 0 )
{
v14 = -1i64;
}
else
{
if( qword_140C4DC80 )
{
if( (v13 & 0x10) != 0 )
v13 &= ~0x10ui64;
else
v13 &= ~qword_140C4DC80;
}
v14 = (v13 >> 12) & 0xFFFFFFFFFi64;
}
MiInitializeTransitionPfn(v7, a3);
v12[34] = v12[34] & 0xF8 | 2;
*((_WORD *)v12 + 16) = 1;
v12[34] |= 0x20u;
*(_QWORD *)v12 = ((unsigned __int64)InPageSupport + 32) & -(__int64)(InPageSupport != 0i64);
v12[35] ^= (v12[35] ^ (*((_DWORD *)InPageSupport + 48) >> 9)) & 7;
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
v15 = *(_QWORD *)a2;
v22 = *(_QWORD *)a2;
ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(*(_QWORD *)a2 + 72i64));
++*(_QWORD *)(v15 + 32);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v15 + 72));
if( (a4 & 1) != 0 )
{
v16 = (_QWORD *)(a4 & 0xFFFFFFFFFFFFFFFEui64);
if( *(_BYTE *)v16 == 1 )
{
MiAdvanceFaultList(v16);
*((_DWORD *)InPageSupport + 48) |= 8u;
}
}
*((_QWORD *)InPageSupport + 21) = MI_READ_PTE_LOCK_FREE((INT64)a3);
*((_QWORD *)InPageSupport + 29) = a3;
if( (int)PsGetIoPriorityThread((__int64)KeGetCurrentThread()) < 2 )
*((_DWORD *)InPageSupport + 48) |= 0x80u;
if( a7 )
v17 = *(_DWORD *)(a7 + 64);
else
v17 = -1;
v18 = MiStartingOffset((__int64)a2, (unsigned __int64)a3, v17);
MiEndingOffsetWithLock((__int64)a2);
*((_QWORD *)InPageSupport + 30) = a3;
*((_QWORD *)InPageSupport + 31) = v12;
*((_QWORD *)InPageSupport + 25) = 0i64;
*((_QWORD *)InPageSupport + 26) = v22;
*((_QWORD *)InPageSupport + 12) = v18;
*((_QWORD *)InPageSupport + 34) = 0i64;
*((_DWORD *)InPageSupport + 70) = 4325432;
*((_QWORD *)InPageSupport + 38) = 0i64;
*((_QWORD *)InPageSupport + 39) = 4096i64;
*((_QWORD *)InPageSupport + 40) = v7;
*((_QWORD *)InPageSupport + 11) = 4096i64;
*((_DWORD *)InPageSupport + 46) = 4096;
if( v14 != -1 )
MiFlowThroughInsertNode(InPageSupport, (_MMPFN *)((char *)MmGetPfnDb() + 48 * v14));
v19 = (_MMPFN *)a6;
MiObtainProtoReference(a6, 0);
LOBYTE(v20) = 2;
*((_QWORD *)InPageSupport + 20) = v19;
MiUnlockProtoPoolPage(v19, v20);
MiFillPageWithImageExtentContents((PVOID)(*(_QWORD *)(*(_QWORD *)(v22 + 96) + 48i64) & 0xFFFFFFFFFFFFFFF0ui64), v7);
__incgsdword(0x2E98u);
*((_DWORD *)InPageSupport + 20) = 0;
return KeSetEvent((PRKEVENT)((char *)InPageSupport + 32), 0);
}Referenced by:
MiResolveMappedFileFault