那些你不曾知道的WindowStations窗口站

Windows XP是美国微软公司研发的基于X86、X64架构的PC和平板电脑使用的操作系统,于2001年8月24日发布RTM版本,并于2001年10月25日开始零售 。其名字中“XP”的意思来自英文中的“体验(Experience)” 。该系统是继Windows 2000及Windows ME之后的下一代Windows操作系统,也是微软首个面向消费者且使用Windows NT5.1架构的操作系统 。WindowStations窗口站?一听到这个名词,很多网民觉得一头雾水,什么是WindowStations窗口站呢?这是很专业的名词吗?我们不需要了解吧,这是很多网友的第一印象,小编告诉你,非也非也.其实, Window stations 和桌面可能是Windows NT服务中最与众不同的了 。绝大多数编程者都不会直接接触这两种对象,尽管用户每时每刻都要碰到它们 。window station 和桌面对象就象其它Windows NT对象,如事件、互斥量和信号量一样,是安全(securable)的 。一个window station 对象包括一个剪贴板、一个全局原子集和更多的桌面对象 。一个window station或者是可见的或者是不可见的 。一个可见的window station接收用户来自于鼠标或键盘的输入 。一个显示设备也与之相连这样信息可以显示给交互式用户 。
在 Windows NT 4.0中,只有一个window station 能被看得到,就是WinSta0 。可见的window station也被定义成交互式的 。一个不可见的window station是不可交互的,而且也不能接收任何用户的输入也没有显示设备与之相连 。
如前所述,桌面包含在window station对象中 。一个桌面对象包含一个逻辑的显示表面,和窗口、菜单等 。只有属于可见window station的桌面才能被看见并接收用户的输入 。这个桌面叫做活动桌面 。
作为交互式用户你在不同的时候碰到三种不同的桌面:缺省(Default)、 Winlogon和Screen-saver 。Winlogon 桌面是当你按下Ctrl+Alt+Delete组合键时显示在你面前的对话框 。缺省(Default)桌面是浏览器(Explorer)或者是由交互式用户启动的所有进程 。它更应当被理解成交互式的应用程序桌面 。最终的桌面是Screen-saver,它显示你的屏幕saver 。你可能已经注意到可以在不同的桌面之间切换 。当一个用户按下Ctrl+Alt+Delete组合键时,操作系统可以从缺省状态切换到Winlogon桌面 。当你在登录对话框中选择取消,系统将再切换回缺省桌面 。有人问我当切换进行的时候,是否其它桌面上的东西都被破坏掉了,答案是 "不" 。虽然你看不到其它桌面,但它们仍然在那里 。
系统中所有的进程都与window station 和桌面相联系 。当一个用户第一次登录时,交互式window station, WinSta0,和缺省桌面都与这个用户的Shell进程相关联 。这样用户就能看到shell了,如果不是这样,用户是什么也看不到的 。而且在这之后,由shell启动的所有进程也会和WinSta0 及缺省桌面相关联 。
你还可以通过STARTUPINFO 数据结构的lpDesktop 成员指定你的进程同哪个window station 和桌面相关联 。这个数据结构传递给CreateProcess 和 CreateProcessAsUser两个函数 。你可以将lpDesktop 初始化为NULL,意思是让CreateProcess函数使用和调用进程相同的window station 和桌面 。你可以将你自己的window station 和桌面组合定义成"WinSta0\Default" 或者就定义成空字符串 。这个参数会让操作系统为启动进程创建一个新的不可见的window station 及桌面 。与这两个新对象关联的安全性授予每个组对它们的完全访问权限 。
typedef struct _STARTUPINFO { // si
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
【那些你不曾知道的WindowStations窗口站】DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
Window stations和桌面是具有安全性的对象 。与window station 和桌面将关联的进程必须由对这些对象的合适的访问权限 。如果进程没有访问权,你会看到这两个消息之一"User32.dll initialization failure(User32.dll初始化失败)" 或 "Kernel32.dll initialization failure.(Kernel32.dll初始化失败)" 。由进程返回的退出码为128 或 ERROR_NO_WAIT_CHILDREN 。那么我所指的合适的访问权是什么意思呢?假如你有一个文件这样的对象 。你可以为这个文件创建一个DACL以使用户具有对这个文件的读访问权 。Window station 和 桌面是以相同的方式工作的 。

    推荐阅读