MiAttachSession
VOID __stdcall MiAttachSession(_MM_SESSION_SPACE *SessionGlobal){
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;} v2;
_MMPTE *v3;
int v4;
INT64 v5;
INT64 v6;
_KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 522, &LockHandle);
KeGetCurrentThread()->ApcState.Process->Session = SessionGlobal;
v2.Long = *(_QWORD *)((unsigned __int64)SessionGlobal + 816);
v3 = &MmGetPml4eBase()[(qword_140C4DB20 >> 39) & 0x1FF];
LOBYTE(v4) = MiPteInShadowRange((UINT64)v3);
if( v4 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v2.Long & 1) != 0 )
v2.Long |= 0x8000000000000000ui64;
v3->u.Long = v2.Long;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( MiCompareTbFlushTimeStamp(
*(unsigned int *)(*(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * *((unsigned __int16 *)SessionGlobal + 215))
+ 6872i64),
0xFFFFFFFFui64,
v5,
v6,
(UINT64)LockHandle.LockQueue.Next) )
{
KeFlushTb(FlushUser, FlushSubsetProcessors);
}
}Referenced by:
MiTrimOrAgeWorkingSet