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;
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 和 桌面是以相同的方式工作的。
……