Posted on 2010-01-11 23:49
S.l.e!ep.¢% 閱讀(1255)
評論(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;