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

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

不对的地方欢迎探讨白话windows之 会话、工作站、桌面、窗口之间的关系_第1张图片 


原文链接:http://bbs.pediy.com/showthread.php?t=173271


你可能感兴趣的:(Windows)