windows虚拟显示器开发(三)USB显示器
? ? ? ? 我們常用的顯示器接口有HDMI、VGA等接口,這些接口是直接在顯卡上的,當顯示器插在顯卡上,顯卡就直接可以將顯示信號輸出到顯示器了。
? ? ? ? 關于USB顯示器跟HDMI之類的顯示器有本質區別,我們需要實現的有兩個:
WDDM驅動框架
????????WDDM(Windows Display Driver Model)是微軟最新的顯卡驅動模型,最先被運用在Vista系統中,它提供了一系列函數原型,顯卡驅動需要實現其中的函數,在系統運行過程中,Windows操作系統會根據程序的請求調用對應的函數。
????????WDDM驅動的框架主要如圖1所示。由圖可知,WDDM中的顯卡驅動主要分成兩部分:用戶態驅動(User-Mode Display Driver)和內核態驅動(Display MiniportDriver)。其中用戶態驅動以動態鏈接庫的形式存放在system32文件夾中,當程序調用D3D函數時,系統會自動加載用戶態驅動到自己的運行空間中。用戶態驅動中的函數大致和Direct3D中的API是一一對應的關系,因此每次程序調用顯卡相關的函數(如3D函數),一般會被D3D Runtime轉換到用戶態驅動中對應的函數中,由用戶態驅動完成實際的功能。而內核態驅動則在系統啟動時由系統自動加載到內核態內存空間中,它主要用于實現與顯卡硬件之間交互,如顯存的分配、顯卡中斷處理等。
圖1 WDDM框架示意圖
WDDM與Dxgknrl的交互分析
????????關于WDDM框架的分析,我們需要從入口函數分析,我們就拿我們比較熟悉的win10 QXL驅動來進行底層逆向分析,win10的QXL驅動是WDDM Displayonly的驅動,其與Dxgknrl的通信方式及獲取入口地址的原理與常規WDDM是一致的,我們逆向的到的原理如圖2所示。
圖2 WDDM與Dxgkrnl交互原理
| 步驟 | 操作 | 備注 |
| 1 | WDDM驅動向Dxgkrnl發送DeviceIOControl,請求入口函數地址 | |
| 2 | Dxgkrnl返回入口函數地址給WDDM驅動 | |
| 3 | 驅動實現各個miniport回調函數,復制給結構體 | |
| 4 | 驅動調用入口函數,將miniport的回調函數傳遞進去 | |
| 5 | Dxgkrnl開始調用miniport的回調函數,驅動開始工作 |
WDDM 內核態hook原理
????????從上述原理,我們可以對內核態WDDM進行過濾,編寫過濾驅動DisplayProxy掛載在Dxgkrnl上層,此時WDDM驅動在將IO碼發送給Dxgkrnl之前先經過DisplayProxy,Dxgkrnl返回的入口函數地址也先經過DisplayProxy,DisplayProxy就可以對該入口函數進行替換,替換成自己的,然后再在函數內部調用原始的入口函數。
| 步驟 | 操作 | 備注 |
| 1 | WDDM驅動向Dxgkrnl發送DeviceIOControl,請求入口函數地址 | |
| 2-3-4 | Dxgkrnl返回入口函數地址DpiInitialize給WDDM驅動,被DisplayProxy攔截,替換成自己的函數proxyDpiInitialize | |
| 5 | 驅動實現各個miniport回調函數,復制給結構體 | |
| 6 | 驅動調用入口函數proxyDpiInitialize,將miniport的回調函數傳遞進去 | |
| 7-8 | displayproxy將wddm傳遞進來的回調函數攔截,替換成自己的回調函數,然后調用原始的入口函數DpiInitialize | |
| 9 | Dxgkrnl調用proxy的回調 | |
| 10-11 | 走到了我們定義的回調函數中,我們做一些自定義操作,比如增加顯示器等,然后再調用原生的miniport回調 |
WDDM過濾驅動指責劃分
????????WDDM驅動框架分用戶態驅動和內核態驅動,對WDDM過濾驅動我們要對其用戶態驅動和內核態驅動都要進行過濾,兩個模式的過濾驅動分別實現不同的功能:
增加過濾驅動后,整個WDDM顯示框架變成了如圖4所示。
圖4 wddm過濾驅動框架
windows7下的虛擬顯示器效果
總結
以上是生活随笔為你收集整理的windows虚拟显示器开发(三)USB显示器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebSite和Web Applicat
- 下一篇: android jni ——Field