Posted on 2010-01-11 23:49
S.l.e!ep.¢% 阅读(1245)
评论(0) 编辑 收藏 引用 所属分类:
RootKit
转:Windows硬件输入模型
------------------------------------
1.SetForegroundWindow 和 SetActiveWindow的区别?
SetActiveWindow改变的是一个线程的局部状态变量,所以这个函数不能够跨线程调用(也就是说不能够改变另外一个线程的局部变量),但是改变当前线程的局部变量的操作总是能够成功的。 SetForegroundWindow,SetWindowPos ,BringWindowToTop三个函数改变的是系统全局的属性:Foreground Window和Z-order,所以可以跨越线程及其进程,但是由于Windows防止突然的一个窗口跳至屏幕的Foreground,所以背景线程调用 SetForegroundWindow产生的将是任务栏闪烁效果,而BringWindowToTop和SetWindowPos (TOP)在没有连接到RIT的时候则干脆不起效果。但是需要注意的是SetWindowPos(BOTTOM)还是有效果的(因为不违反Windows 的这个约束)。
2.RIT,SHIQ工作原理?
当操作系统启动、初始化时会有一个被称为Raw Input Thread (RIT)的特殊线程被创造出来,同时一个被称为 System Hardware Input Queue (SHIQ) 的队列被创造出来,RIT和SHIQ就是专门用来处理鼠标事件和键盘事件的。RIT平时都是睡着的,当有hardware input 事件发生时,这些硬件的驱动程序(device driver for the hardware device )将这些硬件事件放到SHIQ中,这样就唤醒了RIT,RIT从SHIQ中提取事件并把它们翻译成相应的消息(比如WM_MOUSEMOVE, WM_KEY*等),这些消息然后被送到相应线程的消息队列中去。做完这些,RIT继续睡觉,至于怎么判断到底应该送给那个线程,对鼠标事件和键盘事件又区别:对鼠标事件来说,鼠标之光标在哪个窗口内,改鼠标事件就被送给创造这个窗口的线程。对键盘事件来说,比较复杂。在任一时间会有一个线程与RIT有联系,这个线程被称为foreground thread,简单的说,这个线程创建的窗口为当前活动窗口(或者被称为焦点窗口),于是所有的键盘消息被送给该线程的消息队列。当激活另一个窗口时,新的焦点窗口所属的线程就成了foreground thread ,于是。。。
3.VIQ 虚假输入队列?
每个执行的线程都有自己的虚拟输入队列(Virtual Input Queue),用来处理来自硬件、处理器(Processor)或操作系统的消息(Message)。这些队列都是异步的,也就是说,当处理器发送一个消息给另外一个线程的队列时,发送函数不用等待其他线程处理该消息就可返回,而接收消息的线程可以等到该线程准备好时再访问并处理接收到的消息。
4.虚拟输入队列和局部输入状态分别是什么? (cqf)
虚拟输入队列见问题3
局部输入状态:
Each thread has its own local input state, which is managed inside a thread's THREADINFO structure (discussed in Chapter 26). This input state consists of the thread's virtualized input queue as well as a set of variables. These variables keep track of the following input state management information:
Keyboard input and window focus information, such as
Which window has keyboard focus;Which window is active;Which keys are considered pressed down;The state of the caret;
The variables also keep track of mouse cursor management information, such as
Which window has mouse capture;The shape of the mouse cursor;The visibility of the mouse cursor;