首页
论坛
专栏
课程

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

2013-6-8 22:51 22808

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

2013-6-8 22:51
22808

会话(
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)内核对象。

不对的地方欢迎探讨

[公告]安全测试和项目外包请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (44)
mms 2013-6-8 23:35
2
0
mark
还有,你这是什么的读后感?还是对自己的知识做一个梳理?
xicao 2013-6-8 23:38
3
0
整理的挺好的
ddlx 5 2013-6-8 23:39
4
0
主要是通过MSDN和实际测试出来的结果
cnxxm 2013-6-9 02:53
5
0
很不错,有用
correy 4 2013-6-9 08:27
6
0
这个必须支持

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

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

非服务器系统,都是只能同时登录一个用户把,服务器系统没有限制。我公司就是使用2003做的服务器,多人同时登陆没有问题。
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,杀不掉但是音频会失效,还没尝试过,但是这个不太可能啊
游人啊k 2013-6-10 17:39
24
0
能画个图吗?。。图最好理解了。
ddlx 5 2013-6-10 19:57
25
0
感觉画图好麻烦
IDGHOST 2013-6-12 07:27
26
0
你说system是系统内核本身,我就越来越糊涂了。
虽说是0号进程(空闲进程),实际上存在Kprocess,不像是虚拟的。
不同点:相对system权限来说,这个R3被拒绝访问,线程更多,无分页内存。
相同点:有ntkrnlpa(windbg看到的是另一个)的线程,看起来更像是寄生的。
wogao 2013-6-12 08:26
27
0
楼主整理的挺好的,辛苦啦
ddlx 5 2013-6-12 09:45
28
0
0号进程管理0号线程的。每个Cpu都有一个0号线程,0号线程是空闲线程,当Cpu没有其他线程需要运行的时候,就会让0号线程运行。这也说明了为什么0号进程显示的Cpu占用率代表Cpu空闲率了。
(0号进程是有EPROCESS的,只是没法通过Pid找到它)

另外线程问题,内核线程都属于system进程的(除了0号线程)。
为什么说system是系统本身呢?有一下几点证明:
1. system进程是没有实体的,并且从字面上和对该进程的描述(NT Kernel & System)上可以说明。
2. system没有用户态模式,system是一个系统内核进程。全系统只有两个:Idle和system。
3. 所有内核线程都归system管理

分页内存和未分页内存是由内核中全局变量指定的,在system进程信息中体现不出来(上一个跟帖说的有错误啊,不好意思~)

不知道能否解决你的疑惑
ddlx 5 2013-6-12 09:59
29
0
用windbg看一下进程信息会有更好的理解效果
0号进程:!process poi(PsIdleProcess) f
system进程:!process poi(PsInitialSystemProcess) f
IDGHOST 2013-6-12 10:58
30
0
我的理解:
1   0,4号进程都是内核的宿主(system也能被R3进程申请分页内存),哪个进程的非分页内存里的才是存放内核映像。
2.  我发现ntdll,ole等有仅存在于Idle的线程。
3.  另外我想知道userinit的父进程是?为什么不是system进程,这进程退出得太快很难查。
无论如何在这里总算学到了不少。
ddlx 5 2013-6-12 11:41
31
0
1. system要在R3申请分页内存需要一些特殊技巧吧(没试过,system是没有PEB的,就是申请了也没多大用)。system和idle进程中都不会有存放内核镜像。非分页内存由内核的全局变量维护,不存在system和0号进程的VadRoot 中。另外,内核镜像不是都存放在非分页内存中。nt模块的代码有一部分是存放在非分页内存的如.text段, 有一部分是存在分页内存里的如PAGE段,还有一部分是存放在分页内存并可抛弃如INIT段,这个由PE的段头属性决定。
2. 这个是不可能的吧,idle没有R3的内存布局,也没PEB,也不能被用户态访问,idle进程中更不能存在ntdll,ole模块。不知道你用什么工具看的,或者运行什么软件导致这样的情况,给介绍一下
3. userinit进程是用户初始化进程,是在用户登录后,做初始化工作用的。所以他的父进程是winLogin.exe。
IDGHOST 2013-6-12 12:19
32
0
好吧,我承认我才学疏浅,做个渔人比做个愚人要好
1.   我用NtAllocateVirtualMemory向system申请的内存,提下权就行了
2.   我用Kernel Detective查看的线程;若用XT才无语,system模块有ntdll.dll存在
3.   据我了解父进程为system,子进程也会一样。因此我对所用的PS API甚感兴趣。
jylaxp 2013-6-12 12:27
33
0
Mark一下,手机不方便阅读
ddlx 5 2013-6-12 12:28
34
0
只有相互探讨,才能融汇贯通。。理不辨不明~。有兴趣加入群么?151843490。探讨windows内核技术的~
ddlx 5 2013-6-12 13:01
35
0
1. 你是对的
2. 用Kernel Detective看idle线程列表,里面显示的是所有的线程。所属idle的都是线程ID==0的线程。system存在ntdll.dll不奇怪,是为了让其他进程能够使用ntdll.dll预先映射到system进程中的。system本身是不使用该模块的。
3. userinit父进程是winlogin.exe,这个我是看《windows内核原理与实现》中说的。我没实际测试,

交流是学习最快的方法,我不是在炫耀自己知道的多,自己知道的不一定是对的,这也是我来看雪的原因。希望能与大家相互交流,让自己知道存在哪些不足,并验证自己脑子里记得东西哪些是错的。
如有冒犯请多包涵你说的很对”做个渔人比做个愚人要好“,我来看雪也是不想做个愚人
FIGHTING安 1 2013-6-12 13:10
36
0
学习了   楼主辛苦
rhffv 2013-6-12 20:33
37
0
mark
支持一下
EvilKnight 4 2013-6-13 00:21
38
0
不错,支持一下!.
勇敢者 2013-6-13 10:00
39
0
感谢楼主  先收藏了
shuichon 2013-6-13 11:49
40
0
我觉得写的很不错。
simplejy 2013-6-14 08:14
41
0
不错不错,学习了。
ddlx 5 2013-6-15 01:40
42
0
对本帖进行了重新编辑,非常感谢与各位的探讨。发现本帖中确实存在错误。主要是从启动到登陆各个进程启动的顺序和时机不正确。
现已对该问题进行了修正。详见本帖。
瀚海云烟 1 2018-7-25 15:51
43
0
论坛迁移,丢了一些楼层吧~~ 内容值得回味
niuzuoquan 2019-4-3 11:51
44
0
mark
liangyu 2019-4-12 12:58
45
0
此类帖子严重点赞
游客
登录 | 注册 方可回帖
返回