MiDetachProcessFromSession

VOID __stdcall MiDetachProcessFromSession(UINT64 TrimmerThread){
  int v1; 
  _MMPTE *v2; 
  unsigned __int64 Long; 
  int v4; 
  _MM_SESSION_SPACE *Session; 
  __int64 v6; 
  int v7[8]; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  memset(&LockHandle, 0, sizeof(LockHandle));
  v1 = TrimmerThread;
  v2 = &MmGetPml4eBase()[(qword_140C4DB20 >> 39) & 0x1FF];
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 522, &LockHandle);
  Long = ZeroPte.u.Long;
  LOBYTE(v4) = MiPteInShadowRange((UINT64)v2);
  if( v4 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
    Long = ZeroPte.u.Long | 0x8000000000000000ui64;
  v2->u.Long = Long;
  Session = KeGetCurrentThread()->ApcState.Process->Session;
  if( v1 == 1 )
  {
    v6 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * *((unsigned __int16 *)Session + 215));
    _InterlockedOr(v7, 0);
    *(_DWORD *)(v6 + 6872) = KiTbFlushTimeStamp;
    KeGetCurrentThread()->ApcState.Process->Session = 0i64;
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
}

Referenced by:

MiDereferenceSessionFinal
MiTrimOrAgeWorkingSet