MiCopyFileOnlyGlobalSubsectionPage
NTSTATUS __stdcall MiCopyFileOnlyGlobalSubsectionPage(
_MMINPAGE_SUPPORT *InPageSupport,
INT64 a2,
_MMPTE *a3,
INT64 a4,
UINT64 SpinCount,
INT64 ProtoPfn,
INT64 a7){
unsigned __int64 v7;
_MMPFN *v12;
unsigned __int64 v13;
unsigned __int64 v14;
__int64 v15;
_MMPTE *v16;
int v17;
NTSTATUS v18;
__int64 v19;
__int64 v20;
_MI_FAULT_VA_LIST *v21;
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;} v22;
INT64 v23;
_SUBSECTION *v24;
_LARGE_INTEGER v25;
_MMPFN *v26;
__int64 v28;
UINT64 v29;
_SUBSECTION *Subsection;
__int64 v31;
Subsection = (_SUBSECTION *)a2;
v7 = SpinCount;
v31 = 0i64;
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);
v28 = *(_QWORD *)a2;
ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(*(_QWORD *)a2 + 72i64));
++*(_QWORD *)(v28 + 32);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v28 + 72));
v16 = &Subsection->SubsectionBase[(unsigned int)(((__int64)a3 - *(_QWORD *)(a7 + 72)) >> 3)];
if( (((unsigned __int64)a3 ^ (unsigned __int64)v16) & 0xFFFFFFFFF000i64) != 0 )
v17 = (unsigned int)MiTryLockProtoPoolPageAtDpc(v16, 0xFFFFFFFFF000ui64);
else
v17 = (unsigned int)MiTryLockLeafPage(v16, 0xFFFFFFFFF000ui64);
v18 = v17;
if( v17 < 0 )
goto LABEL_26;
v19 = v31;
if( (*(_BYTE *)(v31 + 35) & 0x40) != 0 )
{
_InterlockedAnd64((volatile signed __int64 *)(v31 + 24), 0x7FFFFFFFFFFFFFFFui64);
v19 = v31;
v18 = -1073740023;
}
if( v18 < 0 )
{
LABEL_26:
LODWORD(v29) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v12->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v29);
while( v12->u2._bf_0 < 0 );
}
MiHandleInPageError(v12);
MiRemoveLockedPageChargeAndDecRef(v12);
_InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
return v18;
}
else
{
v20 = (v19 - (__int64)MmGetPfnDb()) / 48;
if( (a4 & 1) != 0 )
{
v21 = (_MI_FAULT_VA_LIST *)(a4 & 0xFFFFFFFFFFFFFFFEui64);
if( *(_BYTE *)v21 == 1 )
{
MiAdvanceFaultList(v21);
InPageSupport->u1.e1._bf_0 |= 8u;
}
}
LODWORD(v22.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;})v22.Long;
InPageSupport->PointerPte = a3;
if( PsGetIoPriorityThread((_ETHREAD *)KeGetCurrentThread()) < IoPriorityNormal )
InPageSupport->u1.e1._bf_0 |= 0x80u;
v23 = a7;
v24 = Subsection;
InPageSupport->Mdl.Next = 0i64;
*(_DWORD *)&InPageSupport->Mdl.Size = 4325432;
InPageSupport->Mdl.StartVa = 0i64;
*(_QWORD *)&InPageSupport->Mdl.ByteCount = 4096i64;
InPageSupport->Page[0] = v7;
v25.anonymous_0.LowPart = MiStartingOffset(v24, a3, *(unsigned int *)(v23 + 64));
InPageSupport->Pfn = v12;
v26 = (_MMPFN *)ProtoPfn;
InPageSupport->ReadOffset = v25;
InPageSupport->BasePte = a3;
InPageSupport->ControlArea = (_CONTROL_AREA *)v28;
InPageSupport->FilePointer = 0i64;
InPageSupport->ByteCount = 4096;
MiObtainProtoReference(v26, 1ui64);
InPageSupport->LockedProtoPfn = v26;
MiCopyPage(v7, v20, 0i64, 0x44ui64);
if( v15 != -1 )
MiFlowThroughInsertNode(InPageSupport, &MmGetPfnDb()[v15]);
_InterlockedAnd64((volatile signed __int64 *)(v31 + 24), 0x7FFFFFFFFFFFFFFFui64);
MiUnlockProtoPoolPage((ULONG_PTR)v26, 2u);
__incgsdword(0x2E98u);
InPageSupport->IoStatus.Status = 0;
InPageSupport->IoStatus.Information = 4096i64;
KeSetEvent((PRKEVENT)&InPageSupport->ListHead[1], 0, 0);
return 0;
}
}Referenced by:
MiResolveMappedFileFault