日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

1 《Undocumented Windows 2000 Secrets》翻譯 --- 第二章( 六 )


Win32 內(nèi)核模式接口( Win32 Kernel-mode Interface )
從前面對 SDT 的討論,可看出存在著與 Native API 相關(guān)的第二個主內(nèi)核模式接口( main Kernel-mode Interface ) 。該接口將 Win32 子系統(tǒng)的圖形設(shè)備接口( Graphics Device Interface, GDI )、窗口管理器(即 User 模塊)連接至內(nèi)核組件 ---Win32K (即 Win32k.sys ) .,該組件隨同 Windows NT 4.0 引入 。引入該組件是為了克服 Win32 圖形引擎固有的性能限制(由于 Windows NT 子系統(tǒng)的最初設(shè)計導致) 。在 Windows NT 3.x 中,Win32 子系統(tǒng)采用的是客戶 - 服務(wù)器模式( Client-Server model ),這樣就必須從用戶模式切換到內(nèi)核模式才能進行內(nèi)核調(diào)用( Kernel Involved ) 。通過將圖形引擎的絕大部分移至內(nèi)核組件 ---Win32k.sys,從而避免了大部分因內(nèi)核切換導致的性能損失 。
Win32K 分派 ID ( Win32K Dispatch IDs )
現(xiàn)在該介紹 Win32k.sys 了,也是該更新 圖 2-1 的時候了 。圖 2-2 基于 圖 2-1,但在 ntoskrnl.exe 左面加入了 Win32k.sys。同時我還加入了從 GDI32.DLL 和 USER32.DLL 指向 Win32k.sys 的箭頭 。當然,這不是百分之百正確,因為這些模塊中的 INT 2eh 調(diào)用實際上指向 ntoskrnl.exe,在 ntoskrnl.exe 中才有該中斷的處理例程 。然而,調(diào)用最后還是由 Win32k.sys 管理,這也是箭頭這樣指的原因 。
稍早提到過,Win32K 接口同樣基于 INT 2eh 分派器( INT 2eh Dispatcher ),這與 Native API 非常相似 。僅有的區(qū)別在于 Win32K 使用另一區(qū)段的分派 ID。盡管與所有 Native API 調(diào)用相關(guān)的分派 ID 都位于 0x0000----0x0FFF,而 Win32K 分派 ID 位于 0x1000---0x1FFF 之間 。如 圖 2-2 所示,Win32K 的主要客戶端是 GDI32.DLL 和 USER32.DLL。因此,通過反編譯這些模塊(指 gdi32.dll 和 user32.dll )可能會找到與 Win32K 分派 ID 相關(guān)的符號化名稱 。通過反編譯可發(fā)現(xiàn)在這些模塊( gdi32.dll 和 user32.dll )的導出節(jié)( export sections )中僅包含 INT 2eh 調(diào)用的一個很小的子集,看來是時候再次使用內(nèi)核調(diào)試器了 。如 示例 2-3 所示,我通過使用 dd W32pServiceTable 命令,來確定 Win32k.sys 的符號是可用的,在此之前請先使用 .reload 命令以加載所有可用符號文件 。
在 示例 2-3 的最后三行中,我使用 ln 命令顯示與 W32pServiceTable 的第一個入口地址相關(guān)的符號 。顯然,可看到分派 ID 為 0 的 Win32K 函數(shù)為 NtGdiAbortDoc()。你可以針對所有 639 個 ID 來重復(fù)此過程,但是最好能自動進行符號的查找 ?,F(xiàn)在,我已經(jīng)為你完成了這項工作,所有分派 ID 對應(yīng)的符號名稱都收錄在 附錄 B 的 表 B-2 中 。符號從 gdi32.dll 和 user32.dll 映射到 win32k.sys 十分簡單: GDI 符號可通過在其前面添加 NtGdi 前綴就可轉(zhuǎn)換為 Win32K 符號,USER 符號則添加 NtUser 前綴 。然而,有一少部分例外 。例如,如果一個 GDI 符號以 Gdi 開始,那么其前綴就減少為 Nt,這可能是為了避免出現(xiàn) NtGdiGdi 這樣的字符序列 。在其他的一些例子中,字符的大小寫會有些不同(比如 EnableEUDC() 轉(zhuǎn)化后則變成了 NtGdiEnableEudc() ),或者用符號名稱尾部的 W 來表示沒有對應(yīng)的 Unicode 函數(shù)(如,CopyAcceleratorTableW() 轉(zhuǎn)化后成為 NtUserCopyAcceleratorTable() ) 。
【1 《Undocumented Windows 2000 Secrets》翻譯 --- 第二章】提供 Win32K API 的詳細文檔需要很大的努力 。這些函數(shù)幾乎是 Native API 的三倍 ?;蛟S某天有人會為這些 API 編寫一本不錯的參考手冊,就像 Gary Nebbett 編寫的 Native API 手冊 。不過,在本書范圍內(nèi),有關(guān)這些 API 的信息已經(jīng)足夠了 。

推薦閱讀