WINDOWS session管理初识2

摘要:
先决条件知识:相同会话的进程-˃会话指向的值在1中相同。我们知道smss。exe创建一个新会话,然后启动新的csrs。exe和winlogon.exe。

前置知识:同一个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呢??

明天分解

免责声明:文章转载自《WINDOWS session管理初识2》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇设置jdk版本hyper-v简介及安装使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

sqlalchemy 单表增删改查

1、连接数据库,并创建session from sqlalchemy.orm importsessionmaker from sqlalchemy importcreate_engine engine =create_engine( "mysql+pymysql://root:密码@127.0.0.1:3306/数据库?charset=u...

Hibernate之主键生成策略

Hibernate之主键生成策略 1.1 程序员自己控制:assigned 1.2 数据库控制: identity(标识列/自动增长) sequence 1.3 hibernate控制:increment uuid/uuid.hex 1.4 其它:native hibernate.cfg.xml核心配置文件 Student.hbm.xml 1 <...

21.Shiro在springboot与vue前后端分离项目里的session管理

1.前言 当决定前端与后端代码分开部署时,发现shiro自带的session不起作用了。 然后通过对请求head的分析,然后在网上查找一部分解决方案。 最终就是,登录成功之后,前端接收到后端传回来的sessionId,存入cookie当中。 之后,前端向后端发送请求时,请求Head中都会带上这个sessionid。 后端代码通过对这个sessionid的解...

Django【十七】权限管理与路径导航

1、url权限管理 设计表 1、设计表 系统一共有多少个路径; 有哪些用户使用; 用户在公司的角色; 对角色进行权限分配(什么样的角色可以访问什么样的路径); 2、往表中添加数据,分配角色权限 3、登录成功,设置session,并将该用户可以访问的url从表中取出保存在session中, 4、设置中间件rocess_re...

[开源项目]Hibernate基本使用

开源项目(1)Hibernate基本使用 Hibernate介绍 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。  官网  http://hibernate.org/  以下为其原理和基本的结构示意图 一步一步简单讲述其基本应用 1、创建java...

c#web中定义全局变量,传递变量

c# web开发中,定义全局变量是经常用到的.我的做法是 1\在一个webform 中, public static int aaa;  public static string bbb; //最简单的定义全局变量的方法 如果想在各个web form  用到传递 全局变量,则在 类文件中定义变量 public static int  abc; //最简单的...