首先我們來畫乙個視窗:
}}什麼是視窗控制代碼?在**?有什麼用?
什麼是訊息?什麼是訊息佇列?訊息佇列在哪 ?
什麼是視窗過程?視窗過程是由誰呼叫的?沒有訊息迴圈視窗過程會執行嗎?
為什麼要有w32k.sys這個模組?
為什麼只有使用圖形介面的程式才可以訪問keservicedescriptortableshadow?
介面「卡死」的時候為什麼滑鼠還可以動?
首先我們假設把訊息佇列放在使用者空間(3環),那麼誰又來往使用者空間的訊息佇列儲存這些東西呢?
最好的解決方案就是找乙個專用程序來監聽滑鼠和鍵盤等,再來進行判斷是屬於哪個程序的訊息佇列,最後來進行訊息分發(linux解決方案)
弊端:涉及了跨程序通訊問題,專用程序傳給其它程序。大量時間都花在跨程序。
首先普及一下:
kernel32.dll
----------> ntoskrnl.exe(程序,執行緒,記憶體管
user32.dll gdi32.dll -----------> win32k.sys(圖形介面,訊息管理)
windows已經畫好的介面(windows提供的)gui程式設計 user32.dll
不用windows提供的那些介面 gdi程式設計 gdi32.dll
視窗控制代碼hwn
針對視窗的控制代碼表,只有乙個,(放在核心中)表是全域性的,所有視窗共用的
hdc hdc;
hpen hpen;
1.裝置物件 畫在哪
hwnd =(hwnd)0x0003543
;2.獲取裝置物件上下文
hdc=getdc(hwnd);
3.建立畫筆 設定線條屬性
hpen=
createpen
(ps_s0lid,5,
rgb(
0xff,00
,00))
;4.關聯
selectobject
(hdc,hpen)
;5.開始畫
lineto
(hdc,
400,
400)
;6.釋放資源
deleteobject
(hpen)
;releasedc
(hwnd,hdc)
;
它把訊息佇列放在(核心空間)0環中,
微軟的解決方案:gui執行緒
gui(自己使用微軟提供的視窗函式,比如createwindow,createbutton等建立的圖形介面,這種api就叫做gui)
gdi(如果覺得微軟提供的視窗不符合自己所需條件,需要自己畫,所用的那些api就叫gdi)
1.當執行緒剛建立的時候,都是普通執行緒:
thread.servicetable -->keservicedescriptortable(ssdt表)
servicetable中儲存了一張表,叫做系統服務表
2.當執行緒第一次呼叫(與圖形介面相關的模組 )win32k.sys時(只要試圖正常呼叫win32k中的任何乙個函式),會呼叫乙個函式:psconverttoguithread(把普通執行緒轉換為gui執行緒)
psconverttoguithread主要做幾件事:
a.擴充核心棧,必須換成64kb 的大核心棧,因為普通核心棧只有12kb大小。
b.建立乙個包含訊息佇列的結構體,並掛到kthread上(也就是kthread中的win32thread)
c.thread.servicetable–>keservicedescriptorshadow(ssdtshadow表)
d.把需要的記憶體資料對映到本程序空間
(ssdt表中只引用了一張表,只有一張系統服務表,也就是ntoskernel,win32k的第二張表它沒有。但是ssdtshaow表中既包含了ntoskernel中的函式,又包含了win32k(與圖形介面相關的)中的函式)
解釋:如果是乙個普通執行緒的話,那麼ethred結構體中成員kthread結構體中有乙個win32thread成員它是為空(未使用圖形介面相關的api)
如果是乙個gui執行緒的話,那麼ethred結構體中成員kthread有乙個win32thread成員它是乙個位址值,指向乙個結構體,指向乙個_threadinfo結構體,這個結構體裡面又有乙個成員,存放著訊息佇列
訊息佇列儲存在0環,通過kthread.win32thread可以找到
並不是所有執行緒都要訊息佇列,只有gui執行緒才有訊息佇列
乙個gui執行緒對應1個訊息佇列
Android 執行緒訊息迴圈機制
looper用於封裝了android執行緒中的訊息迴圈,預設情況下乙個執行緒是不存在訊息迴圈 message loop 的,需要呼叫looper.prepare 來給執行緒建立乙個訊息迴圈,呼叫looper.loop 來 使訊息迴圈起作用,從訊息佇列裡取訊息,處理訊息。注 寫在looper.loop...
訊息佇列講解
需要包含標頭檔案 include include include此外,其中msg一共提供四種操作函式,msgget,msgsnd,msgrcv,msgctl msgget是用來得到訊息佇列的識別符號或者建立訊息佇列 訊息佇列一旦建立除非顯示刪除或者重啟機器,否則將一直存在 在命令列下使用ipcs這個...
Jmeter非GUI介面 引數講解
學習內容 講解 非gui介面,壓測引數講解 h 幫助 n 非gui模式 t 指定要執行的 jmeter 測試指令碼檔案 l 記錄結果的檔案 每次執行之前,要確保之前沒有執行過,即 jtl不存在,不然報錯 r jmter.properties檔案中指定的所有遠端伺服器 e 在指令碼執行結束後生成htm...