Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1801655
  • 博文数量: 290
  • 博客积分: 10653
  • 博客等级: 上将
  • 技术积分: 3178
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-24 23:08
文章存档

2013年(6)

2012年(15)

2011年(25)

2010年(86)

2009年(52)

2008年(66)

2007年(40)

分类: WINDOWS

2009-07-01 16:21:38

窗口站:

一个窗口站是一个安全对象,其中包含一个剪贴板,一系列的全局原子以及一组桌面对象。分配给一个交互式用户登陆会话的交互式窗口站还包含键盘,鼠标和显示设备。交互式的窗口站对用户可见并且能接受来自用户的输入。所有其它的窗口站对用户都是非交互的,这意味着它们对用户不可见,也不能接受用户输入;

 

桌面:

桌面是包含在窗口站中的安全对象,一个桌面有一个逻辑显示表面并且包含着窗口,菜单和钩子;一个windows的窗口站能有多个桌面,仅有可交互的窗口站的桌面能被显示以及接受用户输入。在一个可交互的窗口站上,同一时刻仅有一个活动桌面。活动桌面也被称为输入桌面,是当前显示给用户并接受用户输入的桌面。应用程序能够使用OpenInputDesktop函数来获得输入桌面都句柄;具有一定访问权限都应用程序,还能够使用SwitchDesktop函数来指定一个不同的输入桌面;

 

交互式服务:

交互式服务是一个能和输入桌面(活动桌面)交互的服务。其它的桌面不能够接收用户的输入。

交互服务必须运行在 LocalSystem 帐户的上下文中,进行配置后以交互方式运行。在调用CreateService函数时指定dwServeceType参数为SERVICE_INTERACTIVE_PROCESS旗标,服务就能够被配置为以交互的方式运行。但是,下面的注册表项包含一个的值NoInteractiveServices,用于控制该 SERVICE_INTERACTIVE_PROCESS 标志的影响:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows

 

NoInteractiveServices的默认值为0,意味着有SERVICE_INTERACTIVE_PROCESS标志的服务能以交互的方式运行。当 NoInteractiveServices 值设置为非零值时,在那之后启动的服务,无论它是否设置了SERVICE_INTERACTIVE_PROCESS,都不能以交互都方式运行;

 

窗口站和桌面都创建:

系统会自动创建交互式窗口站。 当一个交互式的用户登录时,系统会将交互式窗口站和用户的登录会话相关联。 系统还将为交互式窗口站创建默认输入桌面。

当一个非交互都进程,如win32服务尝试连接到一个win32(系统)并且进程的登陆会话中并没有窗口站存在时,Win32 会尝试为会话创建一个窗口站和桌面。 创建的窗口站的名称基于该登录会话标识符并且桌面被命名为"default"。窗口站和桌面的自由访问列表DACL允许服务的用户账户拥有如下存取权限:

WindowStation: WINSTA_READATTRIBUTES | WINSTA_ACCESSCLIPBOARD | WINSTA_CREATEDESKTOP | WINSTA_ACCESSGLOBALATOMS | WINSTA_EXITWINDOWS | STANDARD_RIGHTS_REQUIRED

 

Desktop: DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS | DESKTOP_CREATEWINDOW | DESKTOP_CREATEMENU | DESKTOP_HOOKCONTROL | DESKTOP_ENUMERATE | STANDARD_RIGHTS_REQUIRED

 

一个进程能使用CreateWIndowStation函数来创建一个新的窗口站,并调用CreateDeskTop函数创建一个新的桌面;

进程和窗口站的连接:

当一个进程第一次调用USER32GDI32的函数(其它的窗口站或桌面函数),必须转到win32服务时,进程能够与窗口站和桌面自动的产生一个连接。Wiin32服务依据下面的规则来判断窗口站应该和那一个进程连接:

如果进程调用了SetProcessWindowStation函数,它就和函数指定的窗口站连接。

如果进程并没有调用SetProcessWindowStation函数,它就和从父进程继承而来的窗口站连接。

 

如果进程没有调用SetProcessWindowStation函数,也没有继承到窗口站,那么win32服务尝试打开MAXIMUM_ALLOWED权限并按如下方式连接一个窗口站:

 

当创建进程时,如果一个窗口站的名称在STARTUPINFO结构的lpDeskTop成员中被指定并传递给CreateProcess函数,那么进程就和指定的窗口站连接。否则,如果这个进程在一个交互式用户的登陆会话中运行,进程就和交互式窗口站连接。

如果进程运行在一个非交互的登陆会话中,窗口站命名形式基于登陆会话标识并尝试去打开窗口站,如果打开失败是因为这个窗口站不存在,那么win32尝试去创建一个窗口站和一个默认的桌面;

 

 

阅读(992) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~