MiUnlinkProcessFromSession

VOID __stdcall MiUnlinkProcessFromSession(_EPROCESS *Process){
  _MM_SESSION_SPACE *Session; 
  _LIST_ENTRY *p_SessionProcessLinks; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *Blink; 
  _LIST_ENTRY *v6; 
  _LIST_ENTRY *v7; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  memset(&LockHandle, 0, sizeof(LockHandle));
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 522, &LockHandle);
  Session = Process->Session;
  if( Session )
  {
    p_SessionProcessLinks = &Process->SessionProcessLinks;
    if( Process->SessionProcessLinks.Flink )
    {
      if( (Process->Vm.Instance.Flags._bf_1 & 1) != 0 && !*((_QWORD *)Session + 85) )
        *((_QWORD *)Session + 85) = 1i64;
      Flink = p_SessionProcessLinks->Flink;
      Blink = Process->SessionProcessLinks.Blink;
      if( p_SessionProcessLinks->Flink->Blink != p_SessionProcessLinks || Blink->Flink != p_SessionProcessLinks )
LABEL_12:
        __fastfail(3u);
      Blink->Flink = Flink;
      Flink->Blink = Blink;
    }
  }
  v6 = Process->MmProcessLinks.Flink;
  v7 = Process->MmProcessLinks.Blink;
  if( v6->Blink != &Process->MmProcessLinks || v7->Flink != &Process->MmProcessLinks )
    goto LABEL_12;
  v7->Flink = v6;
  v6->Blink = v7;
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
}

Referenced by:

MiDeleteFinalPageTables