zoukankan      html  css  js  c++  java
  • WINDOWS session管理初识2

    前置知识:同一个Session的进程的eprocess->session指向的值都是一样

    在1中,我们知道smss.exe创建新的session,然后启动新的csrss.exe和winlogon.exe。

    它的管理是这样的

    //先看一个宏定义

    #define SESSION_GLOBAL(_Session) (_Session->GlobalVirtualAddress)

    SessionGlobal = SESSION_GLOBAL (MmSessionSpace);

    在smss.exe创建新的session时,由内核函数MiSessionCreateInternal()实现的:

    NTSTATUS
    MiSessionCreateInternal (
    OUT PULONG SessionId
    )

    PMM_SESSION_SPACE SessionGlobal;定义变量

    中间代码会申请一个新的PMM_SESSION_SPACE内存块赋值给SessionGlobal

    SessionId也会在这里申请

    SessionSpace = MmSessionSpace;

    MM_BUMP_SESS_COUNTER (MM_DBG_SESSION_INITIAL_PAGETABLE_ALLOC, 1);
    MM_BUMP_SESS_COUNTER (MM_DBG_SESSION_INITIAL_PAGE_ALLOC, 1);

    SessionSpace->GlobalVirtualAddress = SessionGlobal;注意这里,新申请的session在这里
    SessionSpace->ReferenceCount = 1;
    SessionSpace->ResidentProcessCount = 1;
    SessionSpace->u.LongFlags = 0;
    SessionSpace->SessionId = *SessionId;
    SessionSpace->LocaleId = PsDefaultSystemLocaleId;
    SessionSpace->SessionPageDirectoryIndex = PageTablePage;

    SessionSpace->Color = PageColor;

    此时MmSessionSpace这个全局变量的GlobalVirtualAddress字段保存者新申请的Session

    smss.exe创建完session后,才会去启动新的子系统进程。

    在创建进程的过程中,会调用一个如下的函数设置EProcess->session字段

    VOID
    MiSessionAddProcess (
    PEPROCESS NewProcess
    )

    {

    SessionGlobal = SESSION_GLOBAL (MmSessionSpace);

    //此时SessionGlobal就是前面创建的新session了

    ASSERT (NewProcess->Session == NULL);
    NewProcess->Session = (PVOID) SessionGlobal;//这里设置

    //
    // Link the process entry into the session space and WSL structures.
    //

    LOCK_EXPANSION (OldIrql);

    InsertTailList (&SessionGlobal->ProcessList, &NewProcess->SessionProcessLinks);//所以这个链表可以遍历进程,但是不同的session有独立的链表
    UNLOCK_EXPANSION (OldIrql);

    PS_SET_BITS (&NewProcess->Flags, PS_PROCESS_FLAGS_IN_SESSION);//标志

    }

    ***************问题:

    按如上的情况发生的话,就产生一个问题,在第二次产生新session后,

    MmSessionSpace->GlobalVirtualAddress这里保存的是最后一次的new session..

    那以前的session里面启动一个进程的话,它是怎么做到此时的子进程session又回到以前的session呢??

    明天分解

  • 相关阅读:
    Hanoi塔
    采药
    进制转换(大数)
    Load Balancing with NGINX 负载均衡算法
    upstream模块实现反向代理的功能
    epoll
    在nginx启动后,如果我们要操作nginx,要怎么做呢 别增加无谓的上下文切换 异步非阻塞的方式来处理请求 worker的个数为cpu的核数 红黑树
    粘性会话 session affinity sticky session requests from the same client to be passed to the same server in a group of servers
    负载均衡 4层协议 7层协议
    A Secure Cookie Protocol 安全cookie协议 配置服务器Cookie
  • 原文地址:https://www.cnblogs.com/kkindof/p/2571782.html
Copyright © 2011-2022 走看看