MiMakeSystemCacheRangeValid
VOID __stdcall MiMakeSystemCacheRangeValid(
_MMPTE *PointerPte,
_MMPTE *NewPtes,
UINT64 BatchCount,
_MMPFN *ContainingPfn){
_MMPFN *v5;
_MMPTE *PteBase;
unsigned __int64 v7;
UINT64 v8;
__int64 v9;
volatile __int32 *v10;
UINT8 CurrentIrql;
int v12;
UINT64 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;
unsigned __int64 v15;
unsigned int v16;
unsigned __int64 v17;
unsigned __int8 v18;
_MMSUPPORT_INSTANCE *v19;
INT64 v20;
_MMPTE *v21;
__int64 v22;
__int64 v23;
_MMSUPPORT_INSTANCE *v24;
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;} v25;
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;} v26;
_MMPTE *v27;
UINT8 v28;
wchar_t *v29;
_MMPFN *v30;
_UNICODE_STRING *v31;
unsigned int v32;
int v33;
int v34;
int v35;
UINT64 v36;
int v37;
CHAR v38;
_MMPTE *v39;
__int64 v40;
__int64 v41;
_MMPTE *v42;
UINT64 v43;
unsigned __int64 v44;
_MMPFN *v45;
unsigned __int64 v46;
__int64 v47;
__int64 v48;
_CONTROL_AREA *v49;
UINT64 v50;
UINT64 v51;
UINT64 v52;
_ETHREAD *CurrentThread;
_PFSN_TRACE_HEADER *v54;
_PFSN_TRACE_HEADER *v55;
int v56;
signed __int64 Object;
signed __int64 v58;
_MMPTE PteContents;
_MI_FAULT_VA_LIST *VirtualFaultInfo;
__int64 v61;
__int64 v62;
INT64 v63[2];
UINT64 v64;
_MMPTE *v65;
unsigned int v66;
UINT64 Long;
UINT64 SpinCount;
UINT64 v69;
_MMSUPPORT_INSTANCE *v70;
__int64 v71;
_MMPFN *v72;
__int64 v73;
_MMPTE *PteAddress[2];
__int128 v75;
__int128 v76;
__int128 v77;
__int128 v78;
__int128 v79;
__int128 v80;
__int128 v81;
__int64 v82[16];
v72 = ContainingPfn;
v66 = BatchCount;
Long = 0i64;
v82[0] = 0i64;
v64 = 0i64;
*(_OWORD *)v63 = 0i64;
v5 = ContainingPfn;
v65 = PointerPte;
*(_OWORD *)PteAddress = 0i64;
PteBase = MmGetPteBase();
v75 = 0i64;
v76 = 0i64;
v77 = 0i64;
v78 = 0i64;
v79 = 0i64;
v80 = 0i64;
v81 = 0i64;
v73 = (_QWORD)PteBase << 25;
v7 = (__int64)(((_QWORD)PointerPte << 25) - ((_QWORD)PteBase << 25)) >> 16;
v8 = (UINT64)PteBase + (((unsigned __int64)PointerPte >> 9) & 0x7FFFFFFFF8i64);
if( (*(&stru_140C50B28 + 7312) & 7u) < 6 )
{
v10 = (volatile __int32 *)((char *)&stru_140C4DB30 + 6544);
if( (*(&stru_140C50B28 + 7312) & 7) != 2 )
v10 = (volatile __int32 *)((char *)&stru_140C50B28 + 7320);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
_m_prefetchw((const void *)v10);
v12 = *v10 & 0x7FFFFFFF;
if( v12 != _InterlockedCompareExchange(v10, v12 + 1, v12) )
ExpWaitForSpinLockSharedAndAcquire((INT64 *)v10, CurrentIrql);
if( *((_DWORD *)v10 + 1) )
_InterlockedExchange(v10 + 1, 0);
LOBYTE(v9) = CurrentIrql;
v71 = CurrentIrql;
}
else
{
v9 = KeGetCurrentIrql();
v71 = v9;
__writecr8(2ui64);
}
MiLockPageTableInternal((INT64)&stru_140C50B28 + 7128, v8, 0i64);
v13 = *(unsigned __int64 *)((char *)&MmGetPdeBase()->u.Long + ((v7 >> 18) & 0x3FFFFFF8));
v69 = v13;
MiPteInShadowRange((UINT64)&v69);
v14.Long = (unsigned __int64)MmGetPfnDb()[(v13 >> 12) & 0xFFFFFFFFFi64].OriginalPte.u;
if( v14.Long )
v14.Long += 40 * ((v7 >> 18) & 7);
v15 = *(_QWORD *)(v14.Long + 24);
v16 = v66;
BYTE4(v63[1]) = v9;
v17 = v15 & 0xFFFFFFFFFFFFFFFEui64;
v64 = v8;
if( (v15 & 1) == 0 )
v17 = v15;
v18 = BYTE5(v63[1]) | 4;
BYTE5(v63[1]) |= 4u;
v19 = (_MMSUPPORT_INSTANCE *)(*(_QWORD *)(*(&stru_140C4DB30 + 267)
+ 8i64 * (*(_WORD *)(*(_QWORD *)v17 + 60i64) & 0x3FF))
+ 7232i64);
v70 = v19;
v20 = (INT64)v19;
v63[0] = (INT64)v19;
if( v66 )
{
v21 = (_MMPTE *)((char *)v65 - (char *)NewPtes);
v22 = v66;
v23 = 0i64;
v65 = (_MMPTE *)((char *)v65 - (__int64)NewPtes);
v61 = v66;
v24 = v19;
while( 1 )
{
PteAddress[v23] = 0i64;
v25.Long = (unsigned __int64)NewPtes->u;
v26.Long = (unsigned __int64)NewPtes->u;
if( NewPtes >= MmGetPml4eBase() && NewPtes <= MmGetPxeUserLimit() )
{
v22 = v61;
v21 = v65;
}
Long = NewPtes->u.Long;
if( !v26.Long )
goto LABEL_46;
if( (v26.Long & 1) != 0 )
break;
PteAddress[v23] = (_MMPTE *)1;
NewPtes->u.Long = v25.Long | 1;
LABEL_46:
v21 = v65;
++v23;
++NewPtes;
v61 = --v22;
if( !v22 )
{
v8 = v64;
v20 = v63[0];
v5 = v72;
v19 = v70;
v16 = v66;
goto LABEL_48;
}
}
v27 = (_MMPTE *)((char *)NewPtes + (_QWORD)v21);
if( (*((_BYTE *)&NewPtes->u.Long + (_QWORD)v21) & 1) != 0 )
goto LABEL_44;
MiPteInShadowRange((UINT64)&Long);
v30 = &MmGetPfnDb()[(v26.Long >> 12) & 0xFFFFFFFFFi64];
v82[v23] = v30->OriginalPte.u.Hard.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
if( (v18 & 4) == 0 || (v18 & 1) != 0 || (v18 & 2) != 0 )
{
v34 = 0;
goto LABEL_40;
}
v31 = (_UNICODE_STRING *)WORD1(v63[1]);
v32 = (unsigned int)v27;
if( !WORD1(v63[1]) )
{
LABEL_35:
WORD1(v63[1]) = 1;
LOWORD(v63[1]) = (v32 >> 3) & 0x1FF;
LOBYTE(v35) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v30, v31, v28, v29);
if( v35 )
v18 &= ~0x10u;
else
v18 |= 0x10u;
v34 = 4;
BYTE5(v63[1]) = v18;
LABEL_40:
LODWORD(VirtualFaultInfo) = v34;
if( MiAllocateWsle(v24, v27, v30, 0i64, (_MMPTE)v26.Long, VirtualFaultInfo) )
{
if( (v82[v23] & 0x400) != 0 && PfSnNumActiveTraces )
PteAddress[v23] = (_MMPTE *)(v30->PteLong | 0x8000000000000000ui64);
goto LABEL_45;
}
LABEL_44:
PteAddress[v23] = (_MMPTE *)1;
LABEL_45:
v22 = v61;
goto LABEL_46;
}
if( WORD1(v63[1]) + LOWORD(v63[1]) == (((unsigned int)v27 >> 3) & 0x1FF) )
{
LOBYTE(v33) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v30, (_UNICODE_STRING *)0x1FF, v28, v29);
if( v33 )
{
if( (v18 & 0x10) == 0 )
goto LABEL_33;
}
else if( (v18 & 0x10) != 0 )
{
goto LABEL_33;
}
}
MiEmptyDeferredWorkingSetEntries((INT64)v63);
v18 = BYTE5(v63[1]);
LABEL_33:
v32 = (unsigned int)v27;
if( WORD1(v63[1]) )
{
++WORD1(v63[1]);
v34 = 4;
goto LABEL_40;
}
goto LABEL_35;
}
LABEL_48:
if( v8 )
{
if( WORD1(v63[1]) )
{
v36 = ((unsigned __int64)LOWORD(v63[1]) << 12) + ((((__int64)((v8 << 25) - v73) >> 16 << 25) - v73) >> 16);
v37 = 2 * ((v18 >> 4) & 1);
if( v36 < (unsigned __int64)MmGetPteBase() || v36 > (unsigned __int64)MmGetPteLimit() )
{
v38 = v37 | 5;
}
else
{
v38 = v37 | 4;
if( (*(_BYTE *)(v20 + 184) & 7) != 0 )
v38 = 2 * ((v18 & 0x10) != 0);
}
MiAddWorkingSetEntries(v20, v36, (UINT8 *)WORD1(v63[1]), v38);
WORD1(v63[1]) = 0;
}
MiUnlockPageTableInternal(v20, v8);
BYTE5(v63[1]) = v18 | 2;
v64 = 0i64;
}
MiUnlockWorkingSetShared(v19, (unsigned __int8)v71);
v62 = v16;
v39 = &NewPtes[-v16];
v65 = v39;
if( v16 )
{
v40 = v16;
v41 = 0i64;
while( 1 )
{
v42 = PteAddress[v41];
if( v42 == (_MMPTE *)1 )
break;
if( v42 )
{
v47 = v82[v41];
if( *(&stru_140C4DB30 + 42) && (v47 & 0x10) == 0 )
v47 &= ~*(&stru_140C4DB30 + 42);
v48 = v47 >> 16;
v49 = *(_CONTROL_AREA **)v48;
v50 = (UINT64)MiReferenceControlAreaFile(*(_CONTROL_AREA **)v48);
LODWORD(v51) = MiStartingOffset((_SUBSECTION *)v48, v42, 0xFFFFFFFFui64);
v52 = v51;
if( !*(_QWORD *)(v50 + 32) )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v54 = PfSnReferenceProcessTrace(CurrentThread->Tcb.ApcState.Process);
v55 = v54;
if( v54 )
{
if( (unsigned int)PfSnCheckLoggingForThread(CurrentThread, v54, 4ui64) )
{
LODWORD(PteContents.u.Long) = v56;
PfSnLogPageFaultCommon(v55, (_FILE_OBJECT *)v50, *(_QWORD *)(v50 + 24), v52, PteContents.u.Long);
}
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)v55 + 45);
}
}
_m_prefetchw(&v49->FilePointer);
Object = (signed __int64)v49->FilePointer.Object;
if( (v50 ^ Object) >= 0xF )
{
LABEL_77:
ObDereferenceObjectDeferDelete(v50);
}
else
{
while( 1 )
{
v58 = Object;
Object = _InterlockedCompareExchange64((volatile signed __int64 *)&v49->FilePointer, Object + 1, Object);
if( v58 == Object )
break;
if( (v50 ^ Object) >= 0xF )
goto LABEL_77;
}
}
v39 = v65;
goto LABEL_79;
}
LABEL_80:
++v39;
++v41;
--v40;
v65 = v39;
v62 = v40;
if( !v40 )
return;
}
LODWORD(v43) = MI_READ_PTE_LOCK_FREE((INT64)v39);
Long = v43;
LODWORD(v44) = MI_READ_PTE_LOCK_FREE((INT64)&Long);
v45 = &MmGetPfnDb()[(v44 >> 12) & 0xFFFFFFFFFi64];
v46 = MiLockPageInline(v45);
MiDecrementShareCount(v45);
_InterlockedAnd64(&v45->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v5->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v5->u2._bf_0 < 0 );
}
MiDecrementShareCount(v5);
_InterlockedAnd64(&v5->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v46);
LABEL_79:
v40 = v62;
goto LABEL_80;
}
}Referenced by:
MmCheckCachedPageStates