您的位置:首页 > 其它

windows之 会话、工作站、桌面、窗口之间的关系

2013-06-08 22:31 274 查看
一个系统可以同时登录多个用户(包括远程用户登录)
一个用户拥有一个会话(远程用户被称为远程会话)
一个会话拥有多个工作站和窗口。只能拥有一个交互式工作站(Winsta0)。
一个会话拥有一系列私有的进程和模块:Csrss.exe、WinLogin.exe、Lsass.exe、win32k.sys
一个会话拥有一个私有对象名字空间(\BaseNamedObjects),私有对象名字空间中的内核对象不能被其他会话访问。

一个交互式工作站最少拥有三个桌面:默认桌面、登陆桌面、屏保桌面
一个非交互式工作站最少拥有一个桌面
一个桌面拥有0-N个窗口(非交互式工作站中的桌面可以没有窗口)
一个与用户交互的桌面拥有一个Explorer.exe进程
窗口必须与一个桌面绑定

窗口之间不能跨桌面访问

网上介绍相关知识的文章很少,该篇文章是通过MSDN、网络文章、Windows相关书籍、实际实验中总结而来。

windows用户登录过程

在windows启动后,第一个用户登陆前,只有system和smss.exe进程。system是系统进程,smss.exe是会话管理器进程,负责用户登录和登出管理。这两个进程属于system用户进程。

当一个会话登录后,smss.exe会创建csrss.exe和winLogin.exe和加载win32k.sys。csrss.exe是客户端服务器运行时子系统进程,WinLogin.exe是登陆进程。win32k.sys是客户端服务器运行时子系统内核模块。

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

WinLogin.exe在工作期间也会负责很重要的职责。winLogin的职责如下:

初始化 Winsta0工作站。(这是第一个工作站,也是该会话中唯一一个交互式工作站,拥有可视化界面和接收鼠标和键盘输入的能力。)
为Winsta0创建桌面。创建3个桌面:默认桌面、登陆桌面、屏幕保护桌面。默认桌面是咱们俗称的“桌面”。登陆桌面是按下CTRL+ALT+DELETE组合键后显示的桌面,该桌面只能被winLogin.exe访问,防止被非法进程劫持。
创建services.exe进程。services.exe是服务控制管理器进程,用来启动Windows服务。这个时候会有其他非交互式工作站被创建。由于服务进程属于非交互式工作站进程,所以,服务进程是不能弹出窗口的,就是弹出窗口用户也看不见。另外,services.exe不能被多开,防止多个用户登录时,windows服务被多次启动。
创建lsass.exe进程。lsass.exe是本地安全权威子系统。用来在登录、注销、和口令操作过程中交换信息。
启动Userinit.exe。初始化该用户信息。UserInit.exe会创建Explorer.exe,该进程属于Shell进程。这个时候我们就看到亲切的“桌面”了。
WinLogin.exe并不会在做完上述工作后退出,而是用户登出后才会退出。

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

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

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

创建桌面的方法:CreateDesktopCreateDesktopEx

创建窗口的方法:CreateWindowCreateWindowEx

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

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

再次总结:

一个系统可以同时登录多个用户(包括远程用户登录)
一个用户拥有一个会话(远程用户被称为远程会话)
一个会话拥有多个工作站和窗口。只能拥有一个交互式工作站(Winsta0)。
一个会话拥有一系列私有的进程和模块:Csrss.exe、WinLogin.exe、Lsass.exe、win32k.sys
一个会话拥有一个私有对象名字空间(\BaseNamedObjects),私有对象名字空间中的内核对象不能被其他会话访问。

一个交互式工作站最少拥有三个桌面:默认桌面、登陆桌面、屏保桌面
一个非交互式工作站最少拥有一个桌面
一个桌面拥有0-N个窗口(非交互式工作站中的桌面可以没有窗口)
一个与用户交互的桌面拥有一个Explorer.exe进程
窗口必须与一个桌面绑定

窗口之间不能跨桌面访问

转载请注明出处。ddlx studio。点点灵犀。 http://blog.csdn.net/sunyikuyu
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐