Sessions, Window Stations and Desktops(GetDesktopWindow函数得到的桌面句柄, 是Csrss.exe创建的一个窗口)

时间:2022-12-06 07:10:32

由于不是搞安全的,对这块的东西一直不是很清楚,今天特意整理下。

总的来说,他们的关系如下:
Sessions, Window Stations and Desktops(GetDesktopWindow函数得到的桌面句柄, 是Csrss.exe创建的一个窗口)

我们知道Windows是支持多用户的,Session可以理解为每个用户登录,比如当前登录和远程登陆。
Window Stations可以理解为登陆后的不同用户组,我们在任务管理器中可以看到不同的用户名(比如 Richard, system, local service等),其中只有一个活动Station WinSta0, 只有这个Station是接受用户鼠标键盘输入的。而WinSta0 Station 又包括3个Desktop(包括Winlogon, Disconnect, Default), 其中Winlogon指的是登陆Desktop,当我们按Ctrl+Alt+Del时就会进入该Desktop;Disconnect指的是屏保Desktop; Default指的就是我们平时有任务栏的Desktop, 当然真正的Default Desktop是没有应用程序的在上面的,我们看到的桌面其实是启动Shell Explorer后的界面。

总结几点和我们平时写程序有关的: 
(1)我们平时通过GetDesktopWindow()得到的桌面句柄, 是Csrss.exe创建的一个窗口,它被放在WinStation内的Desktop内. 
而我们通过Win+D看到的桌面, 其实是Expolore.exe创建的一个Pop up窗口, 它和我们普通的pop up 窗口一样, Owner是GetDesktopWindow()
(2)我们可以通过CreateDesktop, OpenDesktop, SwitchDesktop等API创建和切换Desktop。
(3)我们平时写服务程序时发现窗口弹不出来, 因为服务不是运行在Station WinSta0下面. 通过FindWindow也找不到我们要找的窗口,因为它下面没有我们的当前WinStation
的Desktop。
(4)一个window station 对象包括一个剪贴板、一个全局原子集和多个Desktop对象, 所以你可以在同一个一个window station内的多个Desktop之间通过剪贴板传送数据.
(5)所有的进程都和Session, WinStation, Desktop相关联,所以我们可以把它表示成这样一个路径: Session 1\WinSta0\Default, 这样我们也就理解为什么有些API需要我们传类似这样的信息.

参考资料:

 
http://www.cppblog.com/weiym/archive/2012/05/12/174701.html