MiCopyFileOnlyGlobalSubsectionPage
INT64 __fastcall MiCopyFileOnlyGlobalSubsectionPage(
INT64 a1,
INT64 *a2,
UINT64 r8_0,
INT64 r9_0,
INT64 a5,
INT64 a6,
INT64 a7){
INT64 v7;
char *v12;
unsigned __int64 v13;
__int64 v14;
INT64 *v15;
INT64 v16;
int v17;
UINT64 v18;
int v19;
_MMPFN *v20;
__int64 v21;
_QWORD *v22;
INT64 v23;
__int64 v24;
unsigned __int64 v25;
_MMPFN *v26;
INT64 v27;
UINT64 v28;
_MMPFN *a3;
INT64 v31;
UINT64 SpinCount;
INT64 *v33;
_MMPFN *a4;
v33 = a2;
v7 = a5;
a4 = 0i64;
a3 = 0i64;
v12 = (char *)MmGetPfnDb() + 48 * a5;
LODWORD(a5) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v12 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)&a5);
while( *((__int64 *)v12 + 3) < 0 );
}
v13 = MI_READ_PTE_LOCK_FREE(r8_0);
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, (MMPTE *)r8_0);
v12[34] = v12[34] & 0xF8 | 2;
*((_WORD *)v12 + 16) = 1;
v12[34] |= 0x20u;
*(_QWORD *)v12 = (a1 + 32) & -(__int64)(a1 != 0);
v12[35] ^= (v12[35] ^ (*(_DWORD *)(a1 + 192) >> 9)) & 7;
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
v31 = *a2;
v15 = (INT64 *)(v31 + 72);
ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(v31 + 72));
++*(_QWORD *)(v31 + 32);
ExReleaseSpinLockExclusiveFromDpcLevel(v15);
v16 = v33[1] + 8i64 * (unsigned int)((__int64)(r8_0 - *(_QWORD *)(a7 + 72)) >> 3);
if( ((r8_0 ^ v16) & 0xFFFFFFFFF000i64) != 0 )
v17 = MiTryLockProtoPoolPageAtDpc((INT64 *)v16, 0xFFFFFFFFF000i64, &a3, &a4);
else
v17 = (unsigned int)MiTryLockLeafPage((_MMPTE *)v16, 0xFFFFFFFFF000ui64);
v19 = v17;
if( v17 < 0 )
goto LABEL_30;
v20 = a4;
if( (*((_BYTE *)a4 + 35) & 0x40) != 0 )
{
_InterlockedAnd64((volatile signed __int64 *)a4 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( a3 )
{
LOBYTE(v18) = 2;
MiUnlockProtoPoolPage(a3, v18);
}
v20 = a4;
v19 = -1073740023;
}
if( v19 < 0 )
{
LABEL_30:
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v12 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v12 + 3) < 0 );
}
MiHandleInPageError((UINT64)v12);
MiRemoveLockedPageChargeAndDecRef((_MMPFN *)v12);
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
return(unsigned int)v19;
}
else
{
v21 = (v20 - MmGetPfnDb()) / 48;
if( (r9_0 & 1) != 0 )
{
v22 = (_QWORD *)(r9_0 & 0xFFFFFFFFFFFFFFFEui64);
if( *(_BYTE *)v22 == 1 )
{
MiAdvanceFaultList(v22);
*(_DWORD *)(a1 + 192) |= 8u;
}
}
*(_QWORD *)(a1 + 168) = MI_READ_PTE_LOCK_FREE(r8_0);
*(_QWORD *)(a1 + 232) = r8_0;
if( (int)PsGetIoPriorityThread((__int64)KeGetCurrentThread()) < 2 )
*(_DWORD *)(a1 + 192) |= 0x80u;
v23 = a7;
v24 = (__int64)v33;
*(_QWORD *)(a1 + 272) = 0i64;
*(_DWORD *)(a1 + 280) = 4325432;
*(_QWORD *)(a1 + 304) = 0i64;
*(_QWORD *)(a1 + 312) = 4096i64;
*(_QWORD *)(a1 + 320) = v7;
v25 = MiStartingOffset(v24, r8_0, *(_DWORD *)(v23 + 64));
*(_QWORD *)(a1 + 248) = v12;
v26 = (_MMPFN *)a6;
*(_QWORD *)(a1 + 96) = v25;
v27 = v31;
*(_QWORD *)(a1 + 240) = r8_0;
*(_QWORD *)(a1 + 208) = v27;
*(_QWORD *)(a1 + 200) = 0i64;
*(_DWORD *)(a1 + 184) = 4096;
MiObtainProtoReference((INT64)v26, 1);
*(_QWORD *)(a1 + 160) = v26;
MiCopyPage(v7, v21, 0i64, 68);
if( v14 != -1 )
MiFlowThroughInsertNode((_MMINPAGE_SUPPORT *)a1, (_MMPFN *)((char *)MmGetPfnDb() + 48 * v14));
_InterlockedAnd64((volatile signed __int64 *)a4 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( a3 )
{
LOBYTE(v28) = 2;
MiUnlockProtoPoolPage(a3, v28);
}
LOBYTE(v28) = 2;
MiUnlockProtoPoolPage(v26, v28);
__incgsdword(0x2E98u);
*(_DWORD *)(a1 + 80) = 0;
*(_QWORD *)(a1 + 88) = 4096i64;
KeSetEvent((PRKEVENT)(a1 + 32), 0);
return 0i64;
}
}Referenced by:
MiResolveMappedFileFault