MiLogPageAccess
VOID __stdcall MiLogPageAccess(_MMSUPPORT_INSTANCE *Vm, _MMPTE *PointerPte){
unsigned __int64 *AgeDistribution;
wchar_t *bf_0;
unsigned __int64 v4;
unsigned int v6;
__int64 v7;
_MMPFN *v8;
unsigned __int64 *v9;
_UNICODE_STRING *v10;
_MM_PAGE_ACCESS_INFO_HEADER *AccessLog;
int v12;
__int64 v13;
unsigned __int64 FirstFileEntry;
__int64 v15;
unsigned __int64 v16;
bool v17;
__int64 v18;
bool v19;
__int64 v20;
signed __int64 *v21;
UINT64 v22;
volatile int *v23;
unsigned __int8 v24;
_EX_FAST_REF *v25;
unsigned __int64 v26;
signed __int64 v27;
signed __int64 v28;
__int64 v29;
unsigned int v30;
__int64 v31;
unsigned __int64 *FileEntry;
unsigned __int64 *v33;
unsigned __int64 v34;
_KSPIN_LOCK_QUEUE *volatile Next;
unsigned int v36;
_KLOCK_QUEUE_HANDLE LockQueue;
int v38;
int v39;
__int64 v40;
_MMPTE *PteAddress;
bf_0 = (wchar_t *)(unsigned __int8)Vm->Flags._bf_0;
AgeDistribution = (unsigned __int64 *)((char *)&stru_140C4DB30 + 6584);
v39 = 3;
LOBYTE(bf_0) = (unsigned __int8)bf_0 & 7;
*(_QWORD *)&LockQueue.OldIrql = 0i64;
v38 = 0;
v4 = (unsigned __int64)PointerPte;
if( (_BYTE)bf_0 != 2 )
AgeDistribution = Vm[1].AgeDistribution;
v6 = (unsigned __int8)PointerPte & 1;
v36 = v6;
if( ((unsigned __int8)PointerPte & 1) != 0 )
v4 = (unsigned __int64)PointerPte & 0xFFFFFFFFFFFFFFFEui64;
v7 = (*(_QWORD *)v4 >> 12) & 0xFFFFFFFFFi64;
v8 = &MmGetPfnDb()[v7];
v9 = (unsigned __int64 *)((char *)&stru_140C4DB30 + 6608);
if( (_BYTE)bf_0 != 2 )
v9 = &Vm[1].AgeDistribution[3];
LockQueue.LockQueue.Lock = v9;
LockQueue.LockQueue.Next = 0i64;
v10 = (_UNICODE_STRING *)_InterlockedExchange64((volatile __int64 *)v9, (__int64)&LockQueue);
if( v10 )
KxWaitForLockOwnerShip((INT64)&LockQueue);
AccessLog = (_MM_PAGE_ACCESS_INFO_HEADER *)*AgeDistribution;
if( !*AgeDistribution || (unsigned __int64 *)&AccessLog->PageEntry[1] > AccessLog->FileEntry )
{
AccessLog = MiAllocateAccessLog(Vm);
if( !AccessLog )
goto LABEL_41;
}
LOBYTE(v12) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v8, v10, v7, bf_0);
if( !v12
|| (v13 = v8->OriginalPte.u.Hard.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0,
(v13 & 0x400) == 0) )
{
v34 = (v4 << 16) | ((unsigned __int64)v6 << 9);
goto LABEL_36;
}
if( *(&stru_140C4DB30 + 42) && (v13 & 0x10) == 0 )
v13 &= ~*(&stru_140C4DB30 + 42);
FirstFileEntry = (unsigned __int64)AccessLog->FirstFileEntry;
v15 = v13 >> 16;
v16 = (v8->PteLong | 0x8000000000000000ui64) << 16;
v17 = AccessLog->Process <= (_EPROCESS *)1;
PteAddress = (_MMPTE *)(v8->PteLong | 0x8000000000000000ui64);
if( v17 )
{
v19 = (*(_BYTE *)(v15 + 34) & 2) == 0;
v20 = *(_QWORD *)v15;
v40 = *(_QWORD *)v15;
if( v19 || (*(_DWORD *)(v20 + 56) & 0x4000000) == 0 )
{
v21 = (signed __int64 *)(v20 + 64);
v22 = (UINT64)ObFastReferenceObject((_EX_FAST_REF *)(v20 + 64));
if( !v22 )
{
v23 = (volatile int *)(v20 + 72);
v24 = ExAcquireSpinLockShared((INT64 *)(v20 + 72));
v25 = (_EX_FAST_REF *)(v20 + 64);
v26 = v24;
v22 = (UINT64)ObFastReferenceObjectLocked(v25);
ExReleaseSpinLockSharedFromDpcLevel(v23);
__writecr8(v26);
v20 = v40;
}
v18 = *(_QWORD *)(v22 + 24);
_m_prefetchw(v21);
v27 = *v21;
if( (v22 ^ *v21) >= 0xF )
{
LABEL_26:
ObDereferenceObjectDeferDelete(v22);
}
else
{
while( 1 )
{
v28 = v27;
v27 = _InterlockedCompareExchange64(v21, v27 + 1, v27);
if( v28 == v27 )
break;
if( (v22 ^ v27) >= 0xF )
goto LABEL_26;
}
}
LODWORD(v29) = MiStartingOffset((_SUBSECTION *)v15, PteAddress, 0xFFFFFFFFui64);
v30 = *(_DWORD *)(v20 + 56);
v6 = v36;
v31 = v29 << *((_BYTE *)&v38 + 4 * (((unsigned __int64)v30 >> 5) & 1));
v40 = v31 ^ ((unsigned __int16)v31 ^ (unsigned __int16)(32 * v30)) & 0x400;
FirstFileEntry -= 8i64;
v16 = v40;
goto LABEL_28;
}
LABEL_41:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
return;
}
v18 = v15;
LABEL_28:
FileEntry = AccessLog->FileEntry;
v33 = FileEntry + 1;
if( (unsigned __int64)(FileEntry + 1) > FirstFileEntry )
goto LABEL_33;
while( *v33 != v18 )
{
if( (unsigned __int64)++v33 > FirstFileEntry )
goto LABEL_33;
}
if( (unsigned __int64)v33 > FirstFileEntry )
{
LABEL_33:
v33 = AccessLog->FileEntry;
AccessLog->FileEntry = FileEntry - 1;
*v33 = v18;
}
v34 = v16 & 0xFFFFFFFFFFFFFC00ui64 | ((unsigned __int64)v6 << 9) | (AccessLog->FirstFileEntry - v33) & 0x1FF;
LABEL_36:
*AccessLog->PageFrameEntry = v34;
++AccessLog->PageEntry;
_m_prefetchw(&LockQueue);
Next = LockQueue.LockQueue.Next;
if( !LockQueue.LockQueue.Next )
{
if( (_KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
(volatile signed __int64 *)LockQueue.LockQueue.Lock,
0i64,
(signed __int64)&LockQueue) == &LockQueue )
return;
Next = KxWaitForLockChainValid(&LockQueue.LockQueue);
}
LockQueue.LockQueue.Next = 0i64;
_InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
}Referenced by:
MI_WSLE_LOG_ACCESS
MiClearPteAccessed
MiCopyOnWrite
MiDeleteVa
MiIssueHardFault
MiResetAccessBitPte
MiResetAccessBitPteWorker
MmUnmapViewInSystemCache