首页
社区
课程
招聘
[原创]白话windows之 会话、工作站、桌面、窗口之间的关系
2013-6-8 22:51 29091

[原创]白话windows之 会话、工作站、桌面、窗口之间的关系

2013-6-8 22:51
29091

会话(
session)、工作站(WindowStation)、桌面(Disktop)、窗口(window)

     一个系统可以同时登录多个用户(包括远程用户登录)
    一个用户拥有一个会话(远程用户被称为远程会话)
    一个会话拥有多个工作站和窗口。只能拥有一个交互式工作站(Winsta0)。
    一个会话拥有一系列私有的进程和模块:Csrss.exe、WinLogin.exe、win32k.sys
    一个会话拥有一个私有对象名字空间(\BaseNamedObjects),私有对象名字空间中的内核对象不能被其他会话访问。
    一个交互式工作站最少拥有三个桌面:默认桌面、登陆桌面、屏保桌面
    一个非交互式工作站最少拥有一个桌面
    一个桌面拥有0-N个窗口(非交互式工作站中的桌面可以没有窗口)
    一个与用户交互的桌面拥有一个Explorer.exe进程
    窗口必须与一个桌面绑定
    窗口之间不能跨桌面访问


windows用户登录过程
[先看一下相关进程启动顺序]
电脑开机到第一次用户登录:
-Idle
-system
--smss.exe
---autochk.exe
---win32k.sys
---csrss.exe
---wininit.exe win8系统才有的进程,应该vista以后都有该进程
----services.exe
----lsass.exe

---winLogin.exe
----services.exe 启动系统服务和加载Auto驱动,win8系统由wininit.exe负责加载
----lsass.exe
win8系统由wininit.exe负责加载
----logonui.exe 此进程显示欢迎界面,在该页面选择用户并输入密码(如果只有一个用户,并且没有密码,则欢迎界面会一闪而过)
----userinit.exe
-----explorer.exe

第二个用户登录:
1. 当在当前用户的开始菜单中选择“注销”按钮,在弹出的窗口中选择“切换用户”按钮
2. 这时当前用户的winLogin.exe创建loginui.exe,显示欢迎界面,等待选择用户和输入密码。
2. 输入账号和密码以,并验证通过后,则:
--smss.exe
---win32k.sys
---csrss.exe
---winlogin.exe
----logonui.exe (该进程并不会再次显示欢迎界面,并随后退出)
----userinit.exe
-----explorer.exe


以上进程启动顺序,经过实际调试测试而出。测试机:xp sp3。

在windows启动后,相关初始化进程相续启动。最开始只有idle和system进程。
system进程初始化BOOT_START类型的驱动程序;加载SYSTEM_START类型的驱动程序并初始化;创建smss.exe进程。

smss.exe是会话管理器进程,负责用户登录和登出管理。
smss.exe紧接着创建autochk.exe检查磁盘,加载win32k.sys子系统内核模块;创建csrss.exe子系统进程;创建wininit.exe进程(此处xp上没有,应该vista以后增加的);创建winLogin.exe进程。

csrss.exe将会管理所有由该会话创建的进程和线程(它将会拥有这些进程和线程的句柄,用来接收相关通知和向他们发送通知。如用户登出时向他们发送退出通知)。

winlogin.exe紧接着创建services.exe和lsass.exe进程。这两个进程在vista以后,由wininit.exe创建。(不确定是不是vista以后增加的,我的win8系统是有wininit.exe进程)
winlogin.exe创建logonui.exe进程。这个时候,显示欢迎界面,选择账号,输入密码就可以登录到系统中了。

输入的密码验证通过后,winlogin会创建userinit.exe进程用来对该用户初始化工作。
当初始化工作做完了,userinit.exe就会启动explorer.exe,这个时候进入到工作桌面了,我们可以工作了,上网、玩游戏、挂QQ,不亦乐乎~

WinLogin.exe除了上面说的工作外,还会做如下事情:

    初始化 Winsta0工作站。(这是第一个工作站,也是该会话中唯一一个交互式工作站,拥有可视化界面和接收鼠标和键盘输入的能力。)
    为Winsta0创建桌面。创建3个桌面:默认桌面、登陆桌面、屏幕保护桌面。默认桌面是咱们俗称的“桌面”。登陆桌面是按下CTRL+ALT+DELETE组合键后显示的桌面,该桌面只能被winLogin.exe访问,防止被非法进程劫持。
  

用户登录完成,这个时候运行程序,如果该程序拥有窗口,不指定所属桌面的话,该窗口属于当前桌面。当然,你可以为你的程序指定窗口和工作站:在CreateProcess时或者通过SetProcessWindowStation、SetThreadDesktop设置。

窗口属于windows子系统资源,属于win32k.sys中的内核对象。但是窗口必须与一个桌面绑定,多个窗口之间不能跨桌面访问。如使用FindWindow是无法找到其他桌面的窗口的,使用SetWindowsHookEx也无法捕获其他桌面窗口产生的消息。

创建一个工作站的方法:CreateWindowStation

创建桌面的方法:CreateDesktop 、CreateDesktopEx

创建窗口的方法:CreateWindow 、CreateWindowEx

当存在多个交互式桌面的时候,俗称多桌面。必须只有一个可以接收键盘和鼠标消息。通过SwitchDesktop来切换当前桌面,通过OpenInputDesktop来打开具有接收键盘和鼠标消息的桌面。

一个会话拥有一个私有对象名字空间。如调用CreateEvent创建一个有名字的事件,可以指定"Global\" or "Local\"前缀。默认为Local。为Local时,只有该会话的进程才能访问该事件。为Global时所有的进程都可以访问该事件,这个用来创建一个全局事件。具有该特性的对象包括:事件(Event)、互斥量(mutex)、信号量(semaphore)、可等待的定时器(waitable timer)、Job、文件映射(file-mapping)内核对象。

不对的地方欢迎探讨

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞7
打赏
分享
最新回复 (47)
雪    币: 1344
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mms 2013-6-8 23:35
2
0
mark
还有,你这是什么的读后感?还是对自己的知识做一个梳理?
雪    币: 243
活跃值: (149)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xicao 2013-6-8 23:38
3
0
整理的挺好的
雪    币: 541
活跃值: (654)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
ddlx 5 2013-6-8 23:39
4
0
主要是通过MSDN和实际测试出来的结果
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cnxxm 2013-6-9 02:53
5
0
很不错,有用
雪    币: 1138
活跃值: (2651)
能力值: ( LV12,RANK:385 )
在线值:
发帖
回帖
粉丝
correy 4 2013-6-9 08:27
6
0
这个必须支持

虽然这些内容在别的地方都见过,
但是难得的是总结,综合.

期待评优加精.
雪    币: 212
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxy19804 2013-6-9 08:35
7
0
喜欢这种总结性的文章,感谢楼主
雪    币: 1042
活跃值: (455)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Rookietp 2013-6-9 09:28
8
0
学习了。mark
雪    币: 541
活跃值: (654)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
ddlx 5 2013-6-9 09:38
9
0
我也是在网上找了好多文章,看MSDN也没看出所以然来,唉,到最后没办法都是自己试验出来的
很是蛋疼啊,希望能对像咱们这么痛苦的人有所帮助吧
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
封心锁爱 2013-6-9 09:51
10
0
mark,学习~
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Artmiss 2013-6-9 10:02
11
0
支持~不错的总结
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sidyh 2013-6-9 11:50
12
0
支持一下
雪    币: 434
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zyicai 2013-6-9 12:22
13
0
楼主辛苦了
雪    币: 45
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
shenger 2013-6-9 13:40
14
0
这个好,学习一下!
雪    币: 1585
活跃值: (182)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shangrila 2013-6-9 15:38
15
0
精神可嘉
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
最爱小铅 2013-6-9 19:40
16
0
楼主辛苦了,总结的很好,菜鸟学习了
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小强零号 2013-6-9 20:10
17
0
学习了!
雪    币: 115
活跃值: (46)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
IDGHOST 2013-6-10 10:30
18
0
文中似乎没有提到system。
{
  照经验来看,system的作用其一应该是加载驱动。
   而且用任务管理器结束,虽结束不掉,但音频会失效。
}
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
KnightLu 2013-6-10 10:42
19
0
学习,谢谢楼主
雪    币: 7
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shenzuole 2013-6-10 10:48
20
0
总结的很好,一目了然。
雪    币: 36
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
花渐欲 2013-6-10 13:07
21
0
1.vista之后 session0被隔离开来了
2.win7,xp什么的普通系统好像远程只能一个用户登录,2008什么的好像可以多个用户远程
雪    币: 541
活跃值: (654)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
ddlx 5 2013-6-10 16:52
22
0
嗯我也注意到了,我用的win8 64, system用户的会话Id被标记为0,当前用户会话Id为非零值,这样做,会话之间的隔离更严格了。
Xp中的登陆的第一个用户,创建一个Local属性的事件,虽然被标记为Local,但是他仍然是全局的。(除啦第一个登陆的用户,其他用户创建的Local属性事件,是私有的)。
Vista以后的系统,就不存在上述问题。

非服务器系统,都是只能同时登录一个用户把,服务器系统没有限制。我公司就是使用2003做的服务器,多人同时登陆没有问题。
雪    币: 541
活跃值: (654)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
ddlx 5 2013-6-10 17:12
23
0
system进程其实就是系统内核本身。只不过把他抽象成一个进程了(我是这么认为)他是所有内核线程的宿主,系统内核的内存使用情况直接反映在system进程信息中。
system在初始化时会做如下事情:
1. 初始化内核组件,主要实行阶段2初始化
2. 初始化BOOT_START类型的驱动程序(BOOT_START加载是在system进程创建之前)
3. 加载并初始化SYSTEM_START类型的驱动程序
4. 在初始化过程中会创建一系列维护系统正常运行的线程,包括内核线程池、维护内存用的线程
AUTO_START类型的驱动是由服务管理器(services.exe)加载的

不过你说的杀system,杀不掉但是音频会失效,还没尝试过,但是这个不太可能啊
雪    币: 253
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
游人啊k 2013-6-10 17:39
24
0
能画个图吗?。。图最好理解了。
雪    币: 541
活跃值: (654)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
ddlx 5 2013-6-10 19:57
25
0
感觉画图好麻烦
游客
登录 | 注册 方可回帖
返回