窗口与线程的关系
文章目錄
- 能產生消息的四種情況
- 消息到哪里去
- 如何通過窗口找到消息隊列呢?
- 窗口在哪?
- 窗口對象
- 子窗口控件:
- Windows把窗口對象放在0環,那么我們如何去操作窗口呢?
- 總結:
能產生消息的四種情況
消息到哪里去
當鼠標點擊按鈕時,那么這個消息就會去這個窗口所對應線程的消息隊列,w32k.sys中開啟了兩個線程監聽鼠標和鍵盤:
這就是為什么程序卡死之后,鼠標還能動的原因。因為鼠標的監控是在0環的一個線程,和程序無關。
如何通過窗口找到消息隊列呢?
首先我們得了解窗口實際是在哪?所以需要近一步往下了解
窗口在哪?
用IDA看user32.dll中的CreateWindow,跟蹤到3環的最后一步,然后就進入了0環,進行下一步操作。
也就說是:
CreateWindow畫窗口,進入0環,大于1000進入的就是W32k.sys這個模塊,小于1000進入的就是讓ntosKernel這個模塊,關于窗口的一切詳細信息全在0環中。
窗口對象
_WINDOW_OBJECT(0環結構體)的結構:
……
PTHREADINFO pti;//所屬線程
……
PTHREADINFO pti表示當前這個窗口指向哪個線程
這里不止一個窗口,包括那些按鈕,也屬于窗口,也就是說這里有十多個窗口,這些窗口都屬于一個線程。(這些按鈕就是子窗口控件)
子窗口控件:
1.WINDOWS提供了幾個預定義的窗口類以方便我們的使用,我們一般把它們叫做子窗口控件,簡稱控件
2.控件會自己處理消息,并在自己狀態發生狀態改變時通知父窗口
3.預定義的控件有:按鈕,復選框,編輯框,靜態字符串標簽和滾動條
窗口對象中還有一個重要成員是Wnd
這里面有一些重要信息:當前窗口什么風格,父窗口,子窗口這些,以及窗口過程等。
Windows把窗口,畫窗口,消息處理全部放在0環(關于窗口的數據問題都在0環)。不需要考慮線程通信問題。
Windows把窗口對象放在0環,那么我們如何去操作窗口呢?
在0環的對象,不可能把實際地址直接告訴我們,因為0環一旦出錯,直接藍屏。所以它跟那些進程對象和線程對象有相同的地方,但是也有不同的地方。
相同的地方:對窗口對象進行操作時,使用0環返回來的一個窗口句柄值(也就是一個實際內核對象地址的一個索引值),也就是說,窗口在零環也有個句柄表
不同的地方:這個句柄表是全局的,拿到窗口的句柄值都一樣,而且都有效。
總結:
總結
- 上一篇: 消息机制(GUI线程讲解)
- 下一篇: 从内核层说清GetMessage , D